This commit is contained in:
sli97
2022-12-03 20:06:57 +08:00
parent bdead4a6d1
commit f3dc3ef7ba
110 changed files with 1347 additions and 1028 deletions

View File

@@ -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

View File

@@ -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 })
}
})
}
}

View File

@@ -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() {