diff --git a/apps/client/assets/Scripts/Entity/Actor/ActorManager.ts b/apps/client/assets/Scripts/Entity/Actor/ActorManager.ts index bcb0281..6611215 100644 --- a/apps/client/assets/Scripts/Entity/Actor/ActorManager.ts +++ b/apps/client/assets/Scripts/Entity/Actor/ActorManager.ts @@ -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)) diff --git a/apps/client/assets/Scripts/Entity/Bullet/BulletManager.ts b/apps/client/assets/Scripts/Entity/Bullet/BulletManager.ts index 82ff92d..8586b13 100644 --- a/apps/client/assets/Scripts/Entity/Bullet/BulletManager.ts +++ b/apps/client/assets/Scripts/Entity/Bullet/BulletManager.ts @@ -23,7 +23,7 @@ export class BulletManager extends EntityManager implements IBullet { private angle: number private tw: Tween - 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) diff --git a/apps/client/assets/Scripts/Global/DataManager.ts b/apps/client/assets/Scripts/Global/DataManager.ts index 2469ad7..963466b 100644 --- a/apps/client/assets/Scripts/Global/DataManager.ts +++ b/apps/client/assets/Scripts/Global/DataManager.ts @@ -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 } diff --git a/apps/client/assets/Scripts/Global/NetworkManager.ts b/apps/client/assets/Scripts/Global/NetworkManager.ts index 02548a4..905c754 100644 --- a/apps/client/assets/Scripts/Global/NetworkManager.ts +++ b/apps/client/assets/Scripts/Global/NetworkManager.ts @@ -91,8 +91,10 @@ export default class NetworkManager extends Singleton { }) } - sendMsg(name: T, data: IModel['msg'][T]) { + async sendMsg(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) } diff --git a/apps/client/assets/Scripts/Scene/BattleManager.ts b/apps/client/assets/Scripts/Scene/BattleManager.ts index eaeb4ed..824d151 100644 --- a/apps/client/assets/Scripts/Scene/BattleManager.ts +++ b/apps/client/assets/Scripts/Scene/BattleManager.ts @@ -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 } diff --git a/apps/server/src/biz/Room.ts b/apps/server/src/biz/Room.ts index 3e60309..32b6a45 100644 --- a/apps/server/src/biz/Room.ts +++ b/apps/server/src/biz/Room.ts @@ -7,6 +7,7 @@ export default class Room { id: number players: Set = new Set() lastSyncTime?: number + timers: NodeJS.Timer[] = [] private inputs: Array = [] @@ -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; - } }