update
This commit is contained in:
@@ -1,14 +1,12 @@
|
||||
import { Node, Prefab, SpriteFrame } from 'cc'
|
||||
import Singleton from '../Base/Singleton'
|
||||
import { EntityTypeEnum, IBullet, IClientInput, InputTypeEnum, IRoom, IState } from '../Common'
|
||||
import { ActorManager } from '../Entity/Actor/ActorManager'
|
||||
import { BulletManager } from '../Entity/Bullet/BulletManager'
|
||||
import { PlayerManager } from '../Entity/Player/PlayerManager'
|
||||
import { EntityTypeEnum, EventEnum, InputType } from '../Enum'
|
||||
import { EventEnum } from '../Enum'
|
||||
import { JoyStickManager } from '../UI/JoyStickManager'
|
||||
import EventManager from './EventManager'
|
||||
import { IData } from './NetworkManager'
|
||||
|
||||
export type IPlayer = Pick<PlayerManager, 'id' | 'nickname' | 'hp' | 'position' | 'direction' | 'type' | 'weaponType' | 'bulletType'>
|
||||
export type IBullet = Pick<BulletManager, 'id' | 'owner' | 'position' | 'direction' | 'type'>
|
||||
|
||||
const PLAYER_SPEED = 100
|
||||
const BULLET_SPEED = 600
|
||||
@@ -18,36 +16,6 @@ const WEAPON_DAMAGE = 5
|
||||
const PLAYER_RADIUS = 50
|
||||
const BULLET_RADIUS = 10
|
||||
|
||||
export interface IVec2 {
|
||||
x: number;
|
||||
y: number
|
||||
}
|
||||
|
||||
interface IState {
|
||||
players: IPlayer[],
|
||||
bullets: IBullet[],
|
||||
nextBulletId: number
|
||||
}
|
||||
|
||||
interface IPlayerMove {
|
||||
type: InputType.PlayerMove
|
||||
id: number;
|
||||
direction: IVec2;
|
||||
dt: number;
|
||||
}
|
||||
|
||||
interface IWeaponShoot {
|
||||
type: InputType.WeaponShoot
|
||||
owner: number;
|
||||
position: IVec2;
|
||||
direction: IVec2;
|
||||
}
|
||||
|
||||
interface ITimePast {
|
||||
type: InputType.TimePast;
|
||||
dt: number
|
||||
}
|
||||
|
||||
export default class DataManager extends Singleton {
|
||||
static get Instance() {
|
||||
return super.GetInstance<DataManager>()
|
||||
@@ -59,11 +27,11 @@ export default class DataManager extends Singleton {
|
||||
prefabMap: Map<string, Prefab> = new Map()
|
||||
textureMap: Map<string, SpriteFrame[]> = new Map()
|
||||
|
||||
playerMap: Map<number, PlayerManager> = new Map()
|
||||
actorMap: Map<number, ActorManager> = new Map()
|
||||
bulletMap: Map<number, BulletManager> = new Map()
|
||||
|
||||
myPlayerId = 1
|
||||
roomInfo: IData
|
||||
roomInfo: IRoom
|
||||
mapSize = {
|
||||
x: 960,
|
||||
y: 640,
|
||||
@@ -82,7 +50,7 @@ export default class DataManager extends Singleton {
|
||||
y: 0
|
||||
},
|
||||
hp: 100,
|
||||
type: EntityTypeEnum.Player1,
|
||||
type: EntityTypeEnum.Actor1,
|
||||
weaponType: EntityTypeEnum.Weapon1,
|
||||
bulletType: EntityTypeEnum.Bullet1,
|
||||
}, {
|
||||
@@ -97,7 +65,7 @@ export default class DataManager extends Singleton {
|
||||
y: -1
|
||||
},
|
||||
hp: 100,
|
||||
type: EntityTypeEnum.Player2,
|
||||
type: EntityTypeEnum.Actor2,
|
||||
weaponType: EntityTypeEnum.Weapon2,
|
||||
bulletType: EntityTypeEnum.Bullet2,
|
||||
}],
|
||||
@@ -105,9 +73,9 @@ export default class DataManager extends Singleton {
|
||||
nextBulletId: 1
|
||||
}
|
||||
|
||||
applyInput(input: IPlayerMove | IWeaponShoot | ITimePast) {
|
||||
applyInput(input: IClientInput) {
|
||||
switch (input.type) {
|
||||
case InputType.PlayerMove: {
|
||||
case InputTypeEnum.ActorMove: {
|
||||
const { direction: { x, y }, dt, id } = input
|
||||
const player = this.state.players.find(e => e.id === id)
|
||||
if (!player) {
|
||||
@@ -120,21 +88,21 @@ export default class DataManager extends Singleton {
|
||||
break
|
||||
}
|
||||
|
||||
case InputType.WeaponShoot: {
|
||||
case InputTypeEnum.WeaponShoot: {
|
||||
const { owner, position, direction } = input
|
||||
const bullet: IBullet = {
|
||||
id: this.state.nextBulletId++,
|
||||
owner,
|
||||
position,
|
||||
direction,
|
||||
type: this.playerMap.get(owner).bulletType
|
||||
type: this.actorMap.get(owner).bulletType
|
||||
}
|
||||
this.state.bullets.push(bullet)
|
||||
|
||||
EventManager.Instance.emit(EventEnum.BulletBorn, owner)
|
||||
break
|
||||
}
|
||||
case InputType.TimePast: {
|
||||
case InputTypeEnum.TimePast: {
|
||||
const { dt } = input
|
||||
const { bullets, players } = this.state
|
||||
|
||||
|
@@ -1,27 +1,15 @@
|
||||
import Singleton from '../Base/Singleton'
|
||||
import { IModel } from '../Common';
|
||||
|
||||
const TIMEOUT = 5000
|
||||
|
||||
export type IData = Record<string, any>
|
||||
|
||||
export interface ICallApiRet {
|
||||
export interface ICallApiRet<T> {
|
||||
success: boolean;
|
||||
error?: Error;
|
||||
res?: IData
|
||||
}
|
||||
|
||||
export enum ApiMsgEnum {
|
||||
ApiPlayerList = 'ApiPlayerList',
|
||||
ApiPlayerJoin = 'ApiPlayerJoin',
|
||||
ApiRoomList = 'ApiRoomList',
|
||||
ApiRoomCreate = 'ApiRoomCreate',
|
||||
ApiRoomJoin = 'ApiRoomJoin',
|
||||
ApiRoomLeave = 'ApiRoomLeave',
|
||||
MsgPlayerList = 'MsgPlayerList',
|
||||
MsgRoomList = 'MsgRoomList',
|
||||
MsgRoom = 'MsgRoom',
|
||||
res?: T
|
||||
}
|
||||
|
||||
type aaa = keyof IModel
|
||||
export default class NetworkManager extends Singleton {
|
||||
static get Instance() {
|
||||
return super.GetInstance<NetworkManager>()
|
||||
@@ -71,11 +59,36 @@ export default class NetworkManager extends Singleton {
|
||||
})
|
||||
}
|
||||
|
||||
sendMsg(name: string, data: IData) {
|
||||
callApi<T extends keyof IModel['api']>(name: T, data: IModel['api'][T]['req']): Promise<ICallApiRet<IModel['api'][T]['res']>> {
|
||||
return new Promise((resolve) => {
|
||||
try {
|
||||
// 超时处理
|
||||
const timer = setTimeout(() => {
|
||||
resolve({ success: false, error: new Error('timeout') })
|
||||
this.unlistenMsg(name, cb)
|
||||
}, TIMEOUT)
|
||||
|
||||
// 回调处理
|
||||
const cb = (res) => {
|
||||
resolve(res)
|
||||
clearTimeout(timer)
|
||||
this.unlistenMsg(name, cb)
|
||||
}
|
||||
this.listenMsg(name as any, cb)
|
||||
|
||||
this.ws.send(JSON.stringify({ name, data }))
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
resolve({ success: false, error: error as Error })
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
sendMsg<T extends keyof IModel['msg']>(name: T, data: IModel['msg'][T]) {
|
||||
this.ws.send(JSON.stringify({ name, data }))
|
||||
}
|
||||
|
||||
listenMsg(name: string, cb: Function) {
|
||||
listenMsg<T extends keyof IModel['msg']>(name: T, cb: (args: IModel['msg'][T]) => void) {
|
||||
if (this.cbs.has(name)) {
|
||||
this.cbs.get(name).push(cb)
|
||||
} else {
|
||||
@@ -89,29 +102,4 @@ export default class NetworkManager extends Singleton {
|
||||
index > -1 && this.cbs.get(name).splice(index, 1)
|
||||
}
|
||||
}
|
||||
|
||||
callApi(name: string, data: IData) {
|
||||
return new Promise<ICallApiRet>((resolve) => {
|
||||
try {
|
||||
// 超时处理
|
||||
const timer = setTimeout(() => {
|
||||
resolve({ success: false, error: new Error('timeout') })
|
||||
this.unlistenMsg(name, cb)
|
||||
}, TIMEOUT)
|
||||
|
||||
// 回调处理
|
||||
const cb = (res: ICallApiRet) => {
|
||||
resolve(res)
|
||||
clearTimeout(timer)
|
||||
this.unlistenMsg(name, cb)
|
||||
}
|
||||
this.listenMsg(name, cb)
|
||||
|
||||
this.ws.send(JSON.stringify({ name, data }))
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
resolve({ success: false, error: error as Error })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import Singleton from '../Base/Singleton'
|
||||
import { instantiate, Node } from 'cc'
|
||||
import { EntityTypeEnum } from '../Enum'
|
||||
import DataManager from './DataManager'
|
||||
import { EntityTypeEnum } from '../Common'
|
||||
|
||||
export default class ObjectPoolManager extends Singleton {
|
||||
static get Instance() {
|
||||
|
Reference in New Issue
Block a user