render optimization
This commit is contained in:
		| @@ -55,6 +55,9 @@ export class ActorManager extends EntityManager implements IActor { | ||||
|         weapon.setParent(this.node) | ||||
|         this.weapon = weapon.addComponent(WeaponManager) | ||||
|         this.weapon.init(data) | ||||
|  | ||||
|         this.targetPos = undefined | ||||
|         this.node.active = false | ||||
|     } | ||||
|  | ||||
|     tick(dt: number) { | ||||
| @@ -88,33 +91,32 @@ export class ActorManager extends EntityManager implements IActor { | ||||
|     } | ||||
|  | ||||
|     renderPosition(data: IActor) { | ||||
|         // this.node.setPosition(data.position.x, data.position.y) | ||||
|  | ||||
|         const newPos = new Vec3(data.position.x, data.position.y) | ||||
|         if (!this.targetPos) { | ||||
|             this.node.active = true | ||||
|             this.node.setPosition(newPos) | ||||
|             this.targetPos = new Vec3() | ||||
|             this.targetPos.set(newPos) | ||||
|             this.targetPos = new Vec3(newPos) | ||||
|         } else if (!this.targetPos.equals(newPos)) { | ||||
|             this.tw?.stop() | ||||
|             this.node.setPosition(this.targetPos) | ||||
|             this.targetPos.set(newPos) | ||||
|             this.state = EntityStateEnum.Run | ||||
|             this.tw = tween(this.node).to(0.1, { | ||||
|                 position: this.targetPos | ||||
|             }).call(() => { | ||||
|                 this.state = EntityStateEnum.Idle | ||||
|             }).start() | ||||
|         } | ||||
|  | ||||
|         // this.node.setPosition(data.position.x, data.position.y) | ||||
|     } | ||||
|  | ||||
|     renderDirection(data: IActor) { | ||||
|         if (data.direction.x === 0 && data.direction.y === 0) { | ||||
|             this.state = EntityStateEnum.Idle | ||||
|             return | ||||
|         } | ||||
|         this.state = EntityStateEnum.Run | ||||
|         const { x, y } = data.direction | ||||
|         if (x !== 0) { | ||||
|             this.node.setScale(x > 0 ? 1 : -1, 1) | ||||
|             this.label.node.setScale(x > 0 ? 1 : -1, 1) | ||||
|             this.hpBar.node.setScale(x > 0 ? 1 : -1, 1) | ||||
|         } | ||||
|         const side = Math.sqrt(x * x + y * y) | ||||
|         const angle = rad2Angle(Math.asin(y / side)) | ||||
|   | ||||
| @@ -23,7 +23,7 @@ export class BulletManager extends EntityManager implements IBullet { | ||||
|  | ||||
|   private angle: number | ||||
|   private tw: Tween<any> | ||||
|   private targetPos: Vec3 = new Vec3 | ||||
|   private targetPos: Vec3 | ||||
|  | ||||
|   init({ id, owner, type }: IBullet) { | ||||
|     this.id = id | ||||
| @@ -34,6 +34,7 @@ export class BulletManager extends EntityManager implements IBullet { | ||||
|     this.fsm.init(type) | ||||
|     this.state = EntityStateEnum.Idle | ||||
|     this.node.active = false | ||||
|     this.targetPos = undefined | ||||
|  | ||||
|     EventManager.Instance.on(EventEnum.ExplosionBorn, this.handleExplosion, this) | ||||
|   } | ||||
| @@ -62,10 +63,10 @@ export class BulletManager extends EntityManager implements IBullet { | ||||
|  | ||||
|   renderPosition(data: IBullet) { | ||||
|     const newPos = new Vec3(data.position.x, data.position.y) | ||||
|     if (!this.node.active) { | ||||
|     if (!this.targetPos) { | ||||
|       this.node.active = true | ||||
|       this.node.setPosition(newPos) | ||||
|       this.targetPos.set(newPos) | ||||
|       this.targetPos = new Vec3(newPos) | ||||
|     } else if (!this.targetPos.equals(newPos)) { | ||||
|       this.tw?.stop() | ||||
|       this.node.setPosition(this.targetPos) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import { Node, Prefab, SpriteFrame } from 'cc' | ||||
| import { Node, Prefab, SpriteFrame, clamp } from 'cc' | ||||
| import Singleton from '../Base/Singleton' | ||||
| import { EntityTypeEnum, IBullet, IClientInput, InputTypeEnum, IRoom, IState, toFixed } from '../Common' | ||||
| import { ActorManager } from '../Entity/Actor/ActorManager' | ||||
| @@ -84,6 +84,10 @@ export default class DataManager extends Singleton { | ||||
|  | ||||
|         player.position.x += toFixed(x * PLAYER_SPEED * dt) | ||||
|         player.position.y += toFixed(y * PLAYER_SPEED * dt) | ||||
|  | ||||
|         player.position.x = clamp(player.position.x, -this.mapSize.x / 2, this.mapSize.x / 2) | ||||
|         player.position.y = clamp(player.position.y, -this.mapSize.y / 2, this.mapSize.y / 2) | ||||
|  | ||||
|         player.direction = { x, y } | ||||
|         break | ||||
|       } | ||||
|   | ||||
| @@ -91,8 +91,10 @@ export default class NetworkManager extends Singleton { | ||||
|     }) | ||||
|   } | ||||
|  | ||||
|   sendMsg<T extends keyof IModel['msg']>(name: T, data: IModel['msg'][T]) { | ||||
|   async sendMsg<T extends keyof IModel['msg']>(name: T, data: IModel['msg'][T]) { | ||||
|     const view = binaryEncode(name, data) | ||||
|     let networkLag = parseInt(new URLSearchParams(location.search).get('lag') || '0') || 0; | ||||
|     await new Promise((r) => setTimeout(r, networkLag)) | ||||
|     this.ws.send(view.buffer) | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -26,6 +26,7 @@ export class BattleManager extends Component { | ||||
|         await this.loadRes() | ||||
|         this.initScene() | ||||
|         await this.connectServer() | ||||
|         // 在场景初始化完毕之前,卡主别的玩家,准备好以后再告知服务器,等所有玩家都准备好以后才开始,这里就不做了 | ||||
|         NetworkManager.Instance.listenMsg(ApiMsgEnum.MsgServerSync, this.handleSync); | ||||
|         this.isInited = true | ||||
|     } | ||||
|   | ||||
| @@ -7,6 +7,7 @@ export default class Room { | ||||
|   id: number | ||||
|   players: Set<Player> = new Set() | ||||
|   lastSyncTime?: number | ||||
|   timers: NodeJS.Timer[] = [] | ||||
|  | ||||
|   private inputs: Array<IClientInput> = [] | ||||
|  | ||||
| @@ -30,6 +31,7 @@ export default class Room { | ||||
|       player.rid = -1 | ||||
|       this.players.delete(player) | ||||
|       if (!this.players.size) { | ||||
|         this.timers.forEach(t => clearInterval(t)) | ||||
|         RoomManager.Instance.closeRoom(this.id) | ||||
|       } | ||||
|     } | ||||
| @@ -57,9 +59,9 @@ export default class Room { | ||||
|           y: 0 | ||||
|         }, | ||||
|         hp: 100, | ||||
|         type: EntityTypeEnum.Actor1, | ||||
|         weaponType: EntityTypeEnum.Weapon1, | ||||
|         bulletType: EntityTypeEnum.Bullet1, | ||||
|         type: EntityTypeEnum.Actor2, | ||||
|         weaponType: EntityTypeEnum.Weapon2, | ||||
|         bulletType: EntityTypeEnum.Bullet2, | ||||
|       })), | ||||
|       bullets: [], | ||||
|       nextBulletId: 1 | ||||
| @@ -71,12 +73,13 @@ export default class Room { | ||||
|       }) | ||||
|     } | ||||
|     this.listenPlayer() | ||||
|     setInterval(() => { | ||||
|     let t1 = setInterval(() => { | ||||
|       this.syncInput() | ||||
|     }, 100) | ||||
|     setInterval(() => { | ||||
|     let t2 = setInterval(() => { | ||||
|       this.timePast() | ||||
|     }, 16) | ||||
|     this.timers = [t1, t2] | ||||
|   } | ||||
|  | ||||
|   listenPlayer() { | ||||
| @@ -105,6 +108,5 @@ export default class Room { | ||||
|       dt: toFixed(dt) | ||||
|     }) | ||||
|     this.lastSyncTime = now; | ||||
|  | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user