浏览代码

添加 龙卷风信息预设

woso_javan 2 月之前
父节点
当前提交
9b8ff6131d

+ 27 - 21
assets/module_storm_sunder/Prefabs/PlayerInfo.prefab

@@ -57,7 +57,7 @@
       "z": 1
     },
     "_mobility": 0,
-    "_layer": 1073741824,
+    "_layer": 33554432,
     "_euler": {
       "__type__": "cc.Vec3",
       "x": 0,
@@ -111,7 +111,7 @@
       "z": 1
     },
     "_mobility": 0,
-    "_layer": 1073741824,
+    "_layer": 33554432,
     "_euler": {
       "__type__": "cc.Vec3",
       "x": 0,
@@ -161,7 +161,7 @@
       "z": 1
     },
     "_mobility": 0,
-    "_layer": 1073741824,
+    "_layer": 33554432,
     "_euler": {
       "__type__": "cc.Vec3",
       "x": 0,
@@ -184,7 +184,7 @@
     },
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 80,
+      "width": 160,
       "height": 50.4
     },
     "_anchorPoint": {
@@ -227,16 +227,19 @@
     "_fontSize": 20,
     "_fontFamily": "Arial",
     "_lineHeight": 40,
-    "_overflow": 0,
-    "_enableWrapText": true,
-    "_font": null,
-    "_isSystemFontUsed": true,
+    "_overflow": 2,
+    "_enableWrapText": false,
+    "_font": {
+      "__uuid__": "23a47957-4ba6-41f7-999f-a5fbf8a48aed",
+      "__expectedType__": "cc.TTFFont"
+    },
+    "_isSystemFontUsed": false,
     "_spacingX": 0,
     "_isItalic": false,
     "_isBold": false,
     "_isUnderline": false,
     "_underlineHeight": 2,
-    "_cacheMode": 0,
+    "_cacheMode": 1,
     "_enableOutline": false,
     "_outlineColor": {
       "__type__": "cc.Color",
@@ -293,7 +296,7 @@
     },
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 150,
+      "width": 100,
       "height": 60
     },
     "_anchorPoint": {
@@ -410,7 +413,7 @@
       "z": 1
     },
     "_mobility": 0,
-    "_layer": 1073741824,
+    "_layer": 33554432,
     "_euler": {
       "__type__": "cc.Vec3",
       "x": 0,
@@ -460,7 +463,7 @@
       "z": 1
     },
     "_mobility": 0,
-    "_layer": 1073741824,
+    "_layer": 33554432,
     "_euler": {
       "__type__": "cc.Vec3",
       "x": 0,
@@ -483,8 +486,8 @@
     },
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 37.822265625,
-      "height": 50.4
+      "width": 39.84,
+      "height": 40
     },
     "_anchorPoint": {
       "__type__": "cc.Vec2",
@@ -527,15 +530,18 @@
     "_fontFamily": "Arial",
     "_lineHeight": 40,
     "_overflow": 0,
-    "_enableWrapText": true,
-    "_font": null,
-    "_isSystemFontUsed": true,
+    "_enableWrapText": false,
+    "_font": {
+      "__uuid__": "23a47957-4ba6-41f7-999f-a5fbf8a48aed",
+      "__expectedType__": "cc.TTFFont"
+    },
+    "_isSystemFontUsed": false,
     "_spacingX": 0,
     "_isItalic": false,
     "_isBold": false,
     "_isUnderline": false,
     "_underlineHeight": 2,
-    "_cacheMode": 0,
+    "_cacheMode": 2,
     "_enableOutline": false,
     "_outlineColor": {
       "__type__": "cc.Color",
@@ -592,7 +598,7 @@
     },
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 150,
+      "width": 100,
       "height": 60
     },
     "_anchorPoint": {
@@ -678,8 +684,8 @@
     },
     "_contentSize": {
       "__type__": "cc.Size",
-      "width": 150,
-      "height": 100
+      "width": 100,
+      "height": 50
     },
     "_anchorPoint": {
       "__type__": "cc.Vec2",

+ 31 - 7
assets/module_storm_sunder/Script/Component/TornadoComponent.ts

@@ -5,6 +5,8 @@ import { GameEvent } from '../Enum/GameEvent';
 import { UIJoyStick } from '../UIJoyStick';
 import { GameMgr, GameStatus } from '../Manager/GameMgr';
 import { PropComponent, PropStatus } from './PropComponent';
+import { PlayerInfo } from './PlayerInfoComponent';
+import { Effect2DUIMgr } from '../Manager/Effect2DUIMgr';
 const { ccclass, property } = _decorator;
 
 const rotateSpeed = 500;
@@ -22,13 +24,16 @@ export class TornadoComponent extends Component {
     attack: number = 20;
     speed: number = 50;
     currentExp: number = 0;
+    currentLv: number = 1;
     nextExp: number = 100;
     ai: boolean = false;
+    nickName: string = null;
 
     _attackInterval: number = 0.5; // 攻击间隔
     _lastAttackTime: Map<string, number> = new Map(); // 记录上次攻击时间
 
     protected start(): void {
+        this.initializeData();
         this.initilizeUI();
         this.registerEvent();
     }
@@ -43,11 +48,20 @@ export class TornadoComponent extends Component {
         this.tigger.on('onTriggerStay', this.onTriggerStay, this);
     }
 
+    initializeData() {
+        //DOTO 计算方式根据配置表
+        this.currentLv = 1;
+        this.currentExp = 0;
+        this.nextExp = 100;
+        this.attack = 20;
+        this.speed = 50;
+        this.nickName = '爸爸在此';
+    }
+
     protected registerEvent() {
         EventDispatcher.instance.on(GameEvent.EVENT_STORM_LEVEL_UP, this.stormLevelUp, this);
     }
 
-
     onTriggerEnter(event: ITriggerEvent): void {
 
     }
@@ -85,19 +99,28 @@ export class TornadoComponent extends Component {
         }
     }
 
-
     update(deltaTime: number) {
         if (GameMgr.inst.gameStatus != GameStatus.Playing) return;
-        this.MoveHandler();
-        // //自身旋转
-        this.RotateHandler();
+
+        this.onPlayerInfoHandler();
+        this.onMoveHandler();
+        this.onRotateHandler();
+    }
+
+    async onPlayerInfoHandler() {
+        const playerInfo: PlayerInfo = {
+            nickName: this.nickName,
+            level: this.currentLv
+        }
+
+        await Effect2DUIMgr.Instance.addPlayerInfo(this.node, playerInfo);
     }
 
-    RotateHandler(): void {
+    onRotateHandler(): void {
         this.node.eulerAngles = new Vec3(this.node.eulerAngles.x, this.node.eulerAngles.y + rotateSpeed * game.deltaTime, this.node.eulerAngles.z);
     }
 
-    MoveHandler(): void {
+    onMoveHandler(): void {
         const playerDir = UIJoyStick.ins.dir;
         const playerX = playerDir.x * this.speed * game.deltaTime;
         const playerZ = playerDir.y * this.speed * game.deltaTime;
@@ -110,6 +133,7 @@ export class TornadoComponent extends Component {
         this.currentExp += propExp;
         if (this.currentExp >= this.nextExp) {
             this.stormLevelUp();
+            this.currentLv++;
 
             //TODO 计算升级经验
             this.currentExp = 0;

+ 15 - 1
assets/module_storm_sunder/Script/GameUtil.ts

@@ -1,4 +1,5 @@
-import { Vec2, Node, v2, PolygonCollider2D, Rect, CircleCollider2D } from "cc";
+import { Vec2, Node, v2, PolygonCollider2D, Rect, CircleCollider2D, Vec3, UITransform } from "cc";
+import { StormSunderGlobalInstance } from "./StormSunderGlobalInstance";
 
 /** 游戏工具类 */
 export class GameUtil {
@@ -211,4 +212,17 @@ export class GameUtil {
         return new Promise(resolve => setTimeout(resolve, seconds * 1000));
     }
 
+    /** 3D空间坐标转屏幕坐标*/
+    static worldToScreenLocal(target: Node): Vec3 {
+        const targetWorldPos = target.worldPosition.clone();
+        const mainCamera = StormSunderGlobalInstance.instance.camera;
+        const screenPos = mainCamera.worldToScreen(targetWorldPos);
+        const uiPos = new Vec3();
+        StormSunderGlobalInstance.instance.bloodUI.getComponent(UITransform)!.convertToNodeSpaceAR(
+            new Vec3(screenPos.x, screenPos.y, 0),
+            uiPos
+        );
+        return uiPos;
+    }
+
 }

+ 38 - 11
assets/module_storm_sunder/Script/Manager/Effect2DUIMgr.ts

@@ -4,6 +4,9 @@ import { assetManager, instantiate, Prefab, Node, UITransform, Vec3, Vec2, view
 import { resLoader } from "db://assets/core_tgx/base/ResLoader";
 import { StormSunderGlobalInstance } from "../StormSunderGlobalInstance";
 import { BloodComponent } from "../Component/BloodComponent";
+import { PlayerInfo, PlayerInfoComponent } from "../Component/PlayerInfoComponent";
+import { TornadoComponent } from "../Component/TornadoComponent";
+import { GameUtil } from "../GameUtil";
 
 export class Effect2DUIMgr {
     private static _instance: Effect2DUIMgr;
@@ -20,6 +23,7 @@ export class Effect2DUIMgr {
 
     private bloodMap: Map<Node, Node> = new Map(); // 存储节点与对应血条的映射
     private playerInfoMap: Map<Node, Node> = new Map(); // 存储节点与玩家信息的映射
+
     async showBlood(target: Node, hpPercent: number) {
         let bloodNode = this.bloodMap.get(target) as any;
 
@@ -36,18 +40,10 @@ export class Effect2DUIMgr {
             return;
         }
 
-        // 转换 3D 坐标到屏幕坐标
-        const targetWorldPos = target.worldPosition;
-        const screenPos = mainCamera.worldToScreen(targetWorldPos);
-        const uiPos = new Vec3();
-        StormSunderGlobalInstance.instance.bloodUI.getComponent(UITransform)!.convertToNodeSpaceAR(
-            new Vec3(screenPos.x, screenPos.y, 0),
-            uiPos
-        );
-
+        const uiPos = GameUtil.worldToScreenLocal(target).clone();
         // 设置位置偏移
-        const offsetY = 300;
-        const offsetX = 150;
+        const offsetY = 200;
+        const offsetX = 100;
         bloodNode.setPosition(uiPos.x + offsetX, uiPos.y + offsetY);
 
         // 更新血量显示
@@ -57,6 +53,28 @@ export class Effect2DUIMgr {
         }
     }
 
+    //添加玩家预设
+    async addPlayerInfo(target: Node, playerInfo: PlayerInfo) {
+        let infoNode = this.playerInfoMap.get(target) as any;
+
+        if (!infoNode) {
+            const infoPrefab = await resLoader.loadAsync(resLoader.gameBundleName, "Prefabs/PlayerInfo");
+            infoNode = instantiate(infoPrefab);
+            infoNode.parent = StormSunderGlobalInstance.instance.effectUI;
+            this.playerInfoMap.set(target, infoNode);
+
+            const playerInfoComp = infoNode.getComponent(PlayerInfoComponent);
+            if (playerInfoComp) {
+                playerInfoComp.updateInfo(playerInfo);
+            }
+        }
+
+        const uiPos = GameUtil.worldToScreenLocal(target).clone();
+        const offsetY = 250;
+        const offsetX = 70;
+        infoNode.setPosition(uiPos.x + offsetX, uiPos.y + offsetY);
+    }
+
     // 清理血条
     removeBlood(target: Node) {
         const bloodNode = this.bloodMap.get(target);
@@ -65,5 +83,14 @@ export class Effect2DUIMgr {
             this.bloodMap.delete(target);
         }
     }
+
+    // 清理玩家信息节点
+    removePlayerInfo(target: Node) {
+        const infoNode = this.playerInfoMap.get(target);
+        if (infoNode) {
+            infoNode.destroy();
+            this.playerInfoMap.delete(target);
+        }
+    }
 }
 

+ 8 - 8
assets/module_storm_sunder/rooster_stormsunder.scene

@@ -3033,7 +3033,7 @@
   },
   {
     "__type__": "cc.Node",
-    "_name": "Effect",
+    "_name": "Blood",
     "_objFlags": 0,
     "__editorExtras__": {},
     "_parent": {
@@ -3077,7 +3077,7 @@
       "y": 0,
       "z": 0
     },
-    "_id": "58HiRB1/ZMU5nkFnWp5mgg"
+    "_id": "3e9UAzNY1HCYmGtqBx4p2c"
   },
   {
     "__type__": "cc.UITransform",
@@ -3099,7 +3099,7 @@
       "x": 0.5,
       "y": 0.5
     },
-    "_id": "63Xsvoy4dMrKv5p5rROgzD"
+    "_id": "66Uegy/NpMkLrXHvalYxBr"
   },
   {
     "__type__": "cc.Widget",
@@ -3129,11 +3129,11 @@
     "_originalHeight": 1280,
     "_alignMode": 2,
     "_lockFlags": 0,
-    "_id": "a7SHsquIhEeI5aN3Cieu8r"
+    "_id": "e7TipOP7VBZI0HpiO5hsdV"
   },
   {
     "__type__": "cc.Node",
-    "_name": "Blood",
+    "_name": "Effect",
     "_objFlags": 0,
     "__editorExtras__": {},
     "_parent": {
@@ -3177,7 +3177,7 @@
       "y": 0,
       "z": 0
     },
-    "_id": "3e9UAzNY1HCYmGtqBx4p2c"
+    "_id": "58HiRB1/ZMU5nkFnWp5mgg"
   },
   {
     "__type__": "cc.UITransform",
@@ -3199,7 +3199,7 @@
       "x": 0.5,
       "y": 0.5
     },
-    "_id": "66Uegy/NpMkLrXHvalYxBr"
+    "_id": "63Xsvoy4dMrKv5p5rROgzD"
   },
   {
     "__type__": "cc.Widget",
@@ -3229,7 +3229,7 @@
     "_originalHeight": 1280,
     "_alignMode": 2,
     "_lockFlags": 0,
-    "_id": "e7TipOP7VBZI0HpiO5hsdV"
+    "_id": "a7SHsquIhEeI5aN3Cieu8r"
   },
   {
     "__type__": "cc.UITransform",

+ 1 - 0
assets/start/Start.ts

@@ -19,6 +19,7 @@ const _preloadRes = [
     { bundle: ModuleDef.BASIC, url: 'ui_waiting/UI_Waiting', type: 'prefab' },
     { bundle: ModuleDef.MODULE_STORM_SUNDER, url: 'Prefabs/Map', type: 'prefab' },
     { bundle: ModuleDef.MODULE_STORM_SUNDER, url: 'Prefabs/Blood', type: 'prefab' },
+    { bundle: ModuleDef.MODULE_STORM_SUNDER, url: 'Prefabs/PlayerInfo', type: 'prefab' },
     { bundle: ModuleDef.MODULE_STORM_SUNDER, url: 'Prefabs/Levels/lvl_1', type: 'prefab' },
     { bundle: ModuleDef.MODULE_STORM_SUNDER, url: 'Audio/bgm_1.mp3', type: 'audio' },
     { bundle: ModuleDef.MODULE_STORM_SUNDER, url: 'Audio/bgm_2.mp3', type: 'audio' },