移动实现 不同颜色皮肤实现
This commit is contained in:
parent
23186001db
commit
03aeff62c5
@ -2,13 +2,13 @@ import 'k8w-extend-native';
|
|||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import { WsConnection, WsServer } from "tsrpc";
|
import { WsConnection, WsServer } from "tsrpc";
|
||||||
import { Room } from './models/Room';
|
import { Room } from './models/Room';
|
||||||
|
import { gameConfig } from './shared/game/gameConfig';
|
||||||
import { serviceProto, ServiceType } from './shared/protocols/serviceProto';
|
import { serviceProto, ServiceType } from './shared/protocols/serviceProto';
|
||||||
|
|
||||||
// Create the Server
|
// Create the Server
|
||||||
export const server = new WsServer(serviceProto, {
|
export const server = new WsServer(serviceProto, {
|
||||||
port: 3000,
|
port: 3000,
|
||||||
// Remove this to use binary mode (remove from the client too)
|
json: true
|
||||||
// json: true
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 断开连接后退出房间
|
// 断开连接后退出房间
|
||||||
@ -22,14 +22,16 @@ server.flows.postDisconnectFlow.push(v => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// 模拟网络延迟
|
// 模拟网络延迟
|
||||||
server.flows.preRecvDataFlow.push(async v => {
|
if (gameConfig.networkLag) {
|
||||||
await new Promise(rs => { setTimeout(rs, 300) })
|
server.flows.preRecvDataFlow.push(async v => {
|
||||||
return v;
|
await new Promise(rs => { setTimeout(rs, gameConfig.networkLag) })
|
||||||
})
|
return v;
|
||||||
server.flows.preSendDataFlow.push(async v => {
|
})
|
||||||
await new Promise(rs => { setTimeout(rs, 300) })
|
server.flows.preSendDataFlow.push(async v => {
|
||||||
return v;
|
await new Promise(rs => { setTimeout(rs, gameConfig.networkLag) })
|
||||||
})
|
return v;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const roomInstance = new Room(server);
|
export const roomInstance = new Room(server);
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { WsConnection, WsServer } from "tsrpc";
|
import { WsConnection, WsServer } from "tsrpc";
|
||||||
|
import { gameConfig } from "../shared/game/gameConfig";
|
||||||
import { GameSystem, GameSystemInput, PlayerJoin } from "../shared/game/GameSystem";
|
import { GameSystem, GameSystemInput, PlayerJoin } from "../shared/game/GameSystem";
|
||||||
import { ReqJoin } from "../shared/protocols/PtlJoin";
|
import { ReqJoin } from "../shared/protocols/PtlJoin";
|
||||||
import { ServiceType } from "../shared/protocols/serviceProto";
|
import { ServiceType } from "../shared/protocols/serviceProto";
|
||||||
@ -9,7 +10,7 @@ import { ServiceType } from "../shared/protocols/serviceProto";
|
|||||||
export class Room {
|
export class Room {
|
||||||
|
|
||||||
// 次数/秒
|
// 次数/秒
|
||||||
syncRate = 3;
|
syncRate = gameConfig.syncRate;
|
||||||
nextPlayerId = 1;
|
nextPlayerId = 1;
|
||||||
|
|
||||||
gameSystem = new GameSystem();
|
gameSystem = new GameSystem();
|
||||||
@ -32,8 +33,8 @@ export class Room {
|
|||||||
playerId: this.nextPlayerId++,
|
playerId: this.nextPlayerId++,
|
||||||
// 初始位置随机
|
// 初始位置随机
|
||||||
pos: {
|
pos: {
|
||||||
x: Math.random() * 10,
|
x: Math.random() * 10 - 5,
|
||||||
y: Math.random() * 10
|
y: Math.random() * 10 - 5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.applyInput(input);
|
this.applyInput(input);
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
export const gameConfig = {
|
export const gameConfig = {
|
||||||
|
syncRate: 10,
|
||||||
|
// 网络延迟
|
||||||
|
networkLag: 0,
|
||||||
|
|
||||||
// 攻击技能的冷却时间(毫秒)
|
// 攻击技能的冷却时间(毫秒)
|
||||||
attackCD: 1000,
|
attackCD: 1000,
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"ver": "1.1.0",
|
|
||||||
"importer": "directory",
|
|
||||||
"imported": true,
|
|
||||||
"uuid": "40e7bad4-3fa9-45c6-9d50-ce41c40e8174",
|
|
||||||
"files": [],
|
|
||||||
"subMetas": {},
|
|
||||||
"userData": {
|
|
||||||
"compressionType": {},
|
|
||||||
"isRemoteBundle": {}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.Material",
|
|
||||||
"_name": "Material #7",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_effectAsset": {
|
|
||||||
"__uuid__": "1baf0fc9-befa-459c-8bdd-af1a450a0319",
|
|
||||||
"__expectedType__": "cc.EffectAsset"
|
|
||||||
},
|
|
||||||
"_techIdx": 0,
|
|
||||||
"_defines": [
|
|
||||||
{
|
|
||||||
"USE_ALBEDO_MAP": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"_states": [
|
|
||||||
{
|
|
||||||
"rasterizerState": {},
|
|
||||||
"blendState": {
|
|
||||||
"targets": [
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"depthStencilState": {}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"_props": [
|
|
||||||
{
|
|
||||||
"mainTexture": {
|
|
||||||
"__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@291d4",
|
|
||||||
"__expectedType__": "cc.Texture2D"
|
|
||||||
},
|
|
||||||
"albedoScale": {
|
|
||||||
"__type__": "cc.Vec3",
|
|
||||||
"x": 1,
|
|
||||||
"y": 1,
|
|
||||||
"z": 1
|
|
||||||
},
|
|
||||||
"metallic": 0.400000005960464,
|
|
||||||
"roughness": 0.70710676908493
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"ver": "1.0.9",
|
|
||||||
"importer": "material",
|
|
||||||
"imported": true,
|
|
||||||
"uuid": "bc711895-84b3-4729-85f8-978c46347d19",
|
|
||||||
"files": [
|
|
||||||
".json"
|
|
||||||
],
|
|
||||||
"subMetas": {},
|
|
||||||
"userData": {}
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.Material",
|
|
||||||
"_name": "",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_effectAsset": {
|
|
||||||
"__uuid__": "1baf0fc9-befa-459c-8bdd-af1a450a0319",
|
|
||||||
"__expectedType__": "cc.EffectAsset"
|
|
||||||
},
|
|
||||||
"_techIdx": 0,
|
|
||||||
"_defines": [
|
|
||||||
{
|
|
||||||
"USE_INSTANCING": true,
|
|
||||||
"USE_ALBEDO_MAP": true
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
{}
|
|
||||||
],
|
|
||||||
"_states": [
|
|
||||||
{
|
|
||||||
"rasterizerState": {},
|
|
||||||
"depthStencilState": {},
|
|
||||||
"blendState": {
|
|
||||||
"targets": [
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
{}
|
|
||||||
],
|
|
||||||
"_props": [
|
|
||||||
{
|
|
||||||
"alphaThreshold": 0,
|
|
||||||
"roughness": 0.70710676908493,
|
|
||||||
"metallic": 0.400000005960464,
|
|
||||||
"mainTexture": {
|
|
||||||
"__uuid__": "e90ad74a-b668-4e2c-bf91-51a2a91b02aa@6c48a",
|
|
||||||
"__expectedType__": "cc.Texture2D"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"ver": "1.0.9",
|
|
||||||
"importer": "material",
|
|
||||||
"imported": true,
|
|
||||||
"uuid": "225b969b-eb6a-4489-a5a5-08efbcf38b0e",
|
|
||||||
"files": [
|
|
||||||
".json"
|
|
||||||
],
|
|
||||||
"subMetas": {},
|
|
||||||
"userData": {}
|
|
||||||
}
|
|
@ -10,7 +10,6 @@
|
|||||||
"_techIdx": 0,
|
"_techIdx": 0,
|
||||||
"_defines": [
|
"_defines": [
|
||||||
{
|
{
|
||||||
"USE_INSTANCING": true,
|
|
||||||
"USE_TEXTURE": true
|
"USE_TEXTURE": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"__type__": "cc.Material",
|
|
||||||
"_name": "",
|
|
||||||
"_objFlags": 0,
|
|
||||||
"_native": "",
|
|
||||||
"_effectAsset": {
|
|
||||||
"__uuid__": "1baf0fc9-befa-459c-8bdd-af1a450a0319",
|
|
||||||
"__expectedType__": "cc.EffectAsset"
|
|
||||||
},
|
|
||||||
"_techIdx": 0,
|
|
||||||
"_defines": [
|
|
||||||
{
|
|
||||||
"USE_INSTANCING": true,
|
|
||||||
"USE_ALBEDO_MAP": true
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
{}
|
|
||||||
],
|
|
||||||
"_states": [
|
|
||||||
{
|
|
||||||
"rasterizerState": {},
|
|
||||||
"depthStencilState": {},
|
|
||||||
"blendState": {
|
|
||||||
"targets": [
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
{}
|
|
||||||
],
|
|
||||||
"_props": [
|
|
||||||
{
|
|
||||||
"alphaThreshold": 0,
|
|
||||||
"roughness": 0.70710676908493,
|
|
||||||
"metallic": 0.400000005960464,
|
|
||||||
"mainTexture": {
|
|
||||||
"__uuid__": "f35bcb71-cd72-443c-94a9-5482c2d63d66@6c48a",
|
|
||||||
"__expectedType__": "cc.Texture2D"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{},
|
|
||||||
{}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"ver": "1.0.9",
|
|
||||||
"importer": "material",
|
|
||||||
"imported": true,
|
|
||||||
"uuid": "411ae6be-9581-422b-9425-36c8e71651cb",
|
|
||||||
"files": [
|
|
||||||
".json"
|
|
||||||
],
|
|
||||||
"subMetas": {},
|
|
||||||
"userData": {}
|
|
||||||
}
|
|
@ -23,14 +23,11 @@
|
|||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 31
|
"__id__": 35
|
||||||
},
|
|
||||||
{
|
|
||||||
"__id__": 33
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 35
|
"__id__": 36
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -62,7 +59,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__type__": "cc.Node",
|
"__type__": "cc.Node",
|
||||||
"_name": "RootNode",
|
"_name": "soldier01",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 1
|
"__id__": 1
|
||||||
@ -70,27 +67,76 @@
|
|||||||
"_children": [
|
"_children": [
|
||||||
{
|
{
|
||||||
"__id__": 3
|
"__id__": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_active": true,
|
||||||
|
"_components": [
|
||||||
|
{
|
||||||
|
"__id__": 32
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_prefab": {
|
||||||
|
"__id__": 34
|
||||||
|
},
|
||||||
|
"_lpos": {
|
||||||
|
"__type__": "cc.Vec3",
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"_lrot": {
|
||||||
|
"__type__": "cc.Quat",
|
||||||
|
"x": 0,
|
||||||
|
"y": 1,
|
||||||
|
"z": 0,
|
||||||
|
"w": 6.123233995736766e-17
|
||||||
|
},
|
||||||
|
"_lscale": {
|
||||||
|
"__type__": "cc.Vec3",
|
||||||
|
"x": 1,
|
||||||
|
"y": 1,
|
||||||
|
"z": 1
|
||||||
|
},
|
||||||
|
"_layer": 1073741824,
|
||||||
|
"_euler": {
|
||||||
|
"__type__": "cc.Vec3",
|
||||||
|
"x": 0,
|
||||||
|
"y": 180,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"_id": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.Node",
|
||||||
|
"_name": "RootNode",
|
||||||
|
"_objFlags": 0,
|
||||||
|
"_parent": {
|
||||||
|
"__id__": 2
|
||||||
|
},
|
||||||
|
"_children": [
|
||||||
|
{
|
||||||
|
"__id__": 4
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 17
|
"__id__": 18
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 19
|
"__id__": 20
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 21
|
"__id__": 22
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 26
|
"__id__": 27
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 28
|
"__id__": 29
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 30
|
"__id__": 31
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -125,29 +171,29 @@
|
|||||||
"_name": "Dummy01",
|
"_name": "Dummy01",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 2
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"_children": [
|
"_children": [
|
||||||
{
|
{
|
||||||
"__id__": 4
|
"__id__": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 8
|
"__id__": 9
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 10
|
"__id__": 11
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 12
|
"__id__": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"__id__": 14
|
"__id__": 15
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 16
|
"__id__": 17
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -182,17 +228,17 @@
|
|||||||
"_name": "Body",
|
"_name": "Body",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 3
|
"__id__": 4
|
||||||
},
|
},
|
||||||
"_children": [
|
"_children": [
|
||||||
{
|
{
|
||||||
"__id__": 5
|
"__id__": 6
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 7
|
"__id__": 8
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -227,13 +273,13 @@
|
|||||||
"_name": "head",
|
"_name": "head",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 4
|
"__id__": 5
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 6
|
"__id__": 7
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -288,13 +334,13 @@
|
|||||||
"_name": "legRight",
|
"_name": "legRight",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 3
|
"__id__": 4
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 9
|
"__id__": 10
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -339,13 +385,13 @@
|
|||||||
"_name": "legLeft",
|
"_name": "legLeft",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 3
|
"__id__": 4
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 11
|
"__id__": 12
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -390,13 +436,13 @@
|
|||||||
"_name": "handRight",
|
"_name": "handRight",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 3
|
"__id__": 4
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 13
|
"__id__": 14
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -441,13 +487,13 @@
|
|||||||
"_name": "handLeft",
|
"_name": "handLeft",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 3
|
"__id__": 4
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 15
|
"__id__": 16
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -502,13 +548,13 @@
|
|||||||
"_name": "Bip001",
|
"_name": "Bip001",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 2
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 18
|
"__id__": 19
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -553,13 +599,13 @@
|
|||||||
"_name": "mixamorig:HeadTop_End",
|
"_name": "mixamorig:HeadTop_End",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 2
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 20
|
"__id__": 21
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -604,17 +650,17 @@
|
|||||||
"_name": "soldier01",
|
"_name": "soldier01",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 2
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [
|
"_components": [
|
||||||
{
|
{
|
||||||
"__id__": 22
|
"__id__": 23
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 25
|
"__id__": 26
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -649,11 +695,11 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 21
|
"__id__": 22
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"__prefab": {
|
"__prefab": {
|
||||||
"__id__": 23
|
"__id__": 24
|
||||||
},
|
},
|
||||||
"_materials": [
|
"_materials": [
|
||||||
{
|
{
|
||||||
@ -663,7 +709,7 @@
|
|||||||
],
|
],
|
||||||
"_visFlags": 0,
|
"_visFlags": 0,
|
||||||
"lightmapSettings": {
|
"lightmapSettings": {
|
||||||
"__id__": 24
|
"__id__": 25
|
||||||
},
|
},
|
||||||
"_mesh": {
|
"_mesh": {
|
||||||
"__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@6868c",
|
"__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@6868c",
|
||||||
@ -677,7 +723,7 @@
|
|||||||
"__expectedType__": "cc.Skeleton"
|
"__expectedType__": "cc.Skeleton"
|
||||||
},
|
},
|
||||||
"_skinningRoot": {
|
"_skinningRoot": {
|
||||||
"__id__": 1
|
"__id__": 2
|
||||||
},
|
},
|
||||||
"_id": ""
|
"_id": ""
|
||||||
},
|
},
|
||||||
@ -716,13 +762,13 @@
|
|||||||
"_name": "Bip001(__autogen 4)",
|
"_name": "Bip001(__autogen 4)",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 2
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 27
|
"__id__": 28
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -767,13 +813,13 @@
|
|||||||
"_name": "mixamorig:HeadTop_End(__autogen 5)",
|
"_name": "mixamorig:HeadTop_End(__autogen 5)",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"_parent": {
|
"_parent": {
|
||||||
"__id__": 2
|
"__id__": 3
|
||||||
},
|
},
|
||||||
"_children": [],
|
"_children": [],
|
||||||
"_active": true,
|
"_active": true,
|
||||||
"_components": [],
|
"_components": [],
|
||||||
"_prefab": {
|
"_prefab": {
|
||||||
"__id__": 29
|
"__id__": 30
|
||||||
},
|
},
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -828,13 +874,13 @@
|
|||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 1
|
"__id__": 2
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"__prefab": {
|
"__prefab": {
|
||||||
"__id__": 32
|
"__id__": 33
|
||||||
},
|
},
|
||||||
"playOnLoad": false,
|
"playOnLoad": true,
|
||||||
"_clips": [
|
"_clips": [
|
||||||
{
|
{
|
||||||
"__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@1f586",
|
"__uuid__": "57d4c4ef-3199-4596-bf79-7c065964ca9c@1f586",
|
||||||
@ -869,24 +915,41 @@
|
|||||||
"__type__": "cc.CompPrefabInfo",
|
"__type__": "cc.CompPrefabInfo",
|
||||||
"fileId": "71bamidCpRLIBqyoKSaXUX"
|
"fileId": "71bamidCpRLIBqyoKSaXUX"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.PrefabInfo",
|
||||||
|
"root": {
|
||||||
|
"__id__": 1
|
||||||
|
},
|
||||||
|
"asset": {
|
||||||
|
"__id__": 0
|
||||||
|
},
|
||||||
|
"fileId": "71qfN53ihYmaSuBoR11P0t"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"__type__": "720b7a4EnZJjYpzLWJrmvT/",
|
"__type__": "720b7a4EnZJjYpzLWJrmvT/",
|
||||||
"_name": "",
|
"_name": "",
|
||||||
"_objFlags": 0,
|
"_objFlags": 0,
|
||||||
"__editorExtras__": {},
|
|
||||||
"node": {
|
"node": {
|
||||||
"__id__": 1
|
"__id__": 1
|
||||||
},
|
},
|
||||||
"_enabled": true,
|
"_enabled": true,
|
||||||
"__prefab": {
|
"__prefab": null,
|
||||||
"__id__": 34
|
"ani": {
|
||||||
|
"__id__": 32
|
||||||
|
},
|
||||||
|
"mesh": {
|
||||||
|
"__id__": 23
|
||||||
|
},
|
||||||
|
"texSelf": {
|
||||||
|
"__uuid__": "e90ad74a-b668-4e2c-bf91-51a2a91b02aa@6c48a",
|
||||||
|
"__expectedType__": "cc.Texture2D"
|
||||||
|
},
|
||||||
|
"texOther": {
|
||||||
|
"__uuid__": "f35bcb71-cd72-443c-94a9-5482c2d63d66@6c48a",
|
||||||
|
"__expectedType__": "cc.Texture2D"
|
||||||
},
|
},
|
||||||
"_id": ""
|
"_id": ""
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"__type__": "cc.CompPrefabInfo",
|
|
||||||
"fileId": "fczHMULW9AAIJRjvl2FJiZ"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"__type__": "cc.PrefabInfo",
|
"__type__": "cc.PrefabInfo",
|
||||||
"root": {
|
"root": {
|
||||||
@ -895,6 +958,33 @@
|
|||||||
"asset": {
|
"asset": {
|
||||||
"__id__": 0
|
"__id__": 0
|
||||||
},
|
},
|
||||||
"fileId": "71qfN53ihYmaSuBoR11P0t"
|
"fileId": "087WztcUlE+rBZWXq8jy1C",
|
||||||
|
"targetOverrides": [
|
||||||
|
{
|
||||||
|
"__id__": 37
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.TargetOverrideInfo",
|
||||||
|
"source": {
|
||||||
|
"__id__": 35
|
||||||
|
},
|
||||||
|
"sourceInfo": null,
|
||||||
|
"propertyPath": [
|
||||||
|
"ani"
|
||||||
|
],
|
||||||
|
"target": {
|
||||||
|
"__id__": 2
|
||||||
|
},
|
||||||
|
"targetInfo": {
|
||||||
|
"__id__": 38
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__type__": "cc.TargetInfo",
|
||||||
|
"localID": [
|
||||||
|
"71bamidCpRLIBqyoKSaXUX"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
@ -2,7 +2,7 @@
|
|||||||
"ver": "1.1.32",
|
"ver": "1.1.32",
|
||||||
"importer": "prefab",
|
"importer": "prefab",
|
||||||
"imported": true,
|
"imported": true,
|
||||||
"uuid": "28c95a70-5b80-4b72-8f7b-93e2cefacc98",
|
"uuid": "809957ef-4f3f-4527-87cc-cb3223f7500a",
|
||||||
"files": [
|
"files": [
|
||||||
".json"
|
".json"
|
||||||
],
|
],
|
||||||
|
@ -1,22 +1,88 @@
|
|||||||
|
|
||||||
import { Component, _decorator } from 'cc';
|
import { Component, MeshRenderer, SkeletalAnimation, Texture2D, tween, Tween, Vec3, _decorator } from 'cc';
|
||||||
|
import { gameConfig } from '../../scripts/shared/game/gameConfig';
|
||||||
import { PlayerState } from '../../scripts/shared/game/state/PlayerState';
|
import { PlayerState } from '../../scripts/shared/game/state/PlayerState';
|
||||||
const { ccclass, property } = _decorator;
|
const { ccclass, property } = _decorator;
|
||||||
|
|
||||||
@ccclass('Player')
|
@ccclass('Player')
|
||||||
export class Player extends Component {
|
export class Player extends Component {
|
||||||
|
|
||||||
|
@property(SkeletalAnimation)
|
||||||
|
ani!: SkeletalAnimation;
|
||||||
|
|
||||||
|
@property(MeshRenderer)
|
||||||
|
mesh!: MeshRenderer;
|
||||||
|
@property(Texture2D)
|
||||||
|
texSelf!: Texture2D;
|
||||||
|
@property(Texture2D)
|
||||||
|
texOther!: Texture2D;
|
||||||
|
|
||||||
playerId!: number;
|
playerId!: number;
|
||||||
isSelf = false;
|
isSelf = false;
|
||||||
|
|
||||||
init(state: PlayerState) {
|
private _tweens: Tween<any>[] = [];
|
||||||
|
private _targetPos = new Vec3;
|
||||||
|
|
||||||
|
init(state: PlayerState, isSelf: boolean) {
|
||||||
this.playerId = state.id;
|
this.playerId = state.id;
|
||||||
this.setPos(state.pos);
|
this.isSelf = isSelf;
|
||||||
|
this.mesh.material!.setProperty('mainTexture', this.isSelf ? this.texSelf : this.texOther);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 把 GameSystem 空间映射到游戏空间
|
// 把 GameSystem 空间映射到游戏空间
|
||||||
setPos(pos: { x: number, y: number }) {
|
updateSelf(state: PlayerState) {
|
||||||
this.node.setPosition(pos.y, 0, pos.x);
|
// 更新位置
|
||||||
|
this._targetPos.set(state.pos.x, 0, -state.pos.y);
|
||||||
|
if (!this.node.position.equals(this._targetPos)) {
|
||||||
|
this.setAni('run');
|
||||||
|
// 朝向
|
||||||
|
let newForward = this._targetPos.clone().subtract(this.node.position).normalize();
|
||||||
|
this.node.forward = new Vec3(newForward);
|
||||||
|
// 位置
|
||||||
|
this.node.setPosition(this._targetPos);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.setAni('idle');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateOther(state: PlayerState) {
|
||||||
|
// 更新位置
|
||||||
|
let newPos = new Vec3(state.pos.x, 0, -state.pos.y);
|
||||||
|
if (!this._targetPos.equals(newPos)) {
|
||||||
|
// 清理 Tween
|
||||||
|
this._tweens?.forEach(v => v.stop());
|
||||||
|
this._tweens = [];
|
||||||
|
this.node.setPosition(this._targetPos);
|
||||||
|
|
||||||
|
// 插值朝向
|
||||||
|
let newForward = new Vec3(newPos).subtract(this.node.position).normalize();
|
||||||
|
this._tweens.push(tween({ forward: this.node.forward }).to(0.1, { forward: newForward }, {
|
||||||
|
onUpdate: (v: any) => {
|
||||||
|
this.node.forward = new Vec3(v.forward);
|
||||||
|
}
|
||||||
|
}).start())
|
||||||
|
|
||||||
|
// 新的位置
|
||||||
|
this._targetPos.set(newPos)
|
||||||
|
this.setAni('run');
|
||||||
|
this._tweens.push(tween(this.node).to(1 / gameConfig.syncRate, {
|
||||||
|
position: this._targetPos
|
||||||
|
}).call(() => {
|
||||||
|
this.setAni('idle')
|
||||||
|
}).start());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
setAni(ani: string) {
|
||||||
|
if (this.ani.getState(ani)?.isPlaying) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ani.crossFade(ani, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function Texture(Texture: any) {
|
||||||
|
throw new Error('Function not implemented.');
|
||||||
|
}
|
||||||
|
@ -61,16 +61,16 @@
|
|||||||
"_prefab": null,
|
"_prefab": null,
|
||||||
"_lpos": {
|
"_lpos": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": -35.352258452125874,
|
"x": 0,
|
||||||
"y": 18.714107575144862,
|
"y": 18.714107575144862,
|
||||||
"z": 5.2735593669694936e-15
|
"z": 35.352258452125874
|
||||||
},
|
},
|
||||||
"_lrot": {
|
"_lrot": {
|
||||||
"__type__": "cc.Quat",
|
"__type__": "cc.Quat",
|
||||||
"x": -0.17043586674820901,
|
"x": -0.2410327142701308,
|
||||||
"y": -0.686259145895912,
|
"y": 0,
|
||||||
"z": -0.170435866748209,
|
"z": 0,
|
||||||
"w": 0.6862591458959121
|
"w": 0.9705169914285754
|
||||||
},
|
},
|
||||||
"_lscale": {
|
"_lscale": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
@ -82,7 +82,7 @@
|
|||||||
"_euler": {
|
"_euler": {
|
||||||
"__type__": "cc.Vec3",
|
"__type__": "cc.Vec3",
|
||||||
"x": -27.895,
|
"x": -27.895,
|
||||||
"y": -90,
|
"y": 0,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"_id": "c9DMICJLFO5IeO07EPon7U"
|
"_id": "c9DMICJLFO5IeO07EPon7U"
|
||||||
@ -820,7 +820,7 @@
|
|||||||
"__prefab": null,
|
"__prefab": null,
|
||||||
"joyStick": null,
|
"joyStick": null,
|
||||||
"prefabPlayer": {
|
"prefabPlayer": {
|
||||||
"__uuid__": "28c95a70-5b80-4b72-8f7b-93e2cefacc98",
|
"__uuid__": "809957ef-4f3f-4527-87cc-cb3223f7500a",
|
||||||
"__expectedType__": "cc.Prefab"
|
"__expectedType__": "cc.Prefab"
|
||||||
},
|
},
|
||||||
"players": {
|
"players": {
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
|
|
||||||
import { Component, instantiate, Node, Prefab, Vec2, _decorator } from 'cc';
|
import { Component, instantiate, Node, Prefab, Vec2, _decorator } from 'cc';
|
||||||
import { WsClient } from 'tsrpc-browser';
|
|
||||||
import { Joystick } from '../../prefabs/Joystick/Joystick';
|
import { Joystick } from '../../prefabs/Joystick/Joystick';
|
||||||
import { Player } from '../../prefabs/Player/Player';
|
import { Player } from '../../prefabs/Player/Player';
|
||||||
import { FollowCamera } from '../../scripts/components/FollowCamera';
|
import { FollowCamera } from '../../scripts/components/FollowCamera';
|
||||||
import { GameManager } from '../../scripts/models/GameManager';
|
import { GameManager } from '../../scripts/models/GameManager';
|
||||||
import { gameConfig } from '../../scripts/shared/game/gameConfig';
|
import { gameConfig } from '../../scripts/shared/game/gameConfig';
|
||||||
import { serviceProto, ServiceType } from '../../scripts/shared/protocols/serviceProto';
|
|
||||||
const { ccclass, property } = _decorator;
|
const { ccclass, property } = _decorator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -36,8 +34,7 @@ export class GameScene extends Component {
|
|||||||
@property(FollowCamera)
|
@property(FollowCamera)
|
||||||
camera: FollowCamera = null as any;
|
camera: FollowCamera = null as any;
|
||||||
|
|
||||||
client!: WsClient<ServiceType>;
|
gameManager = new GameManager();
|
||||||
gameManager!: GameManager;
|
|
||||||
|
|
||||||
private _playerInstances: { [playerId: number]: Player } = {};
|
private _playerInstances: { [playerId: number]: Player } = {};
|
||||||
private _selfSpeed?: Vec2 = new Vec2(0, 0);
|
private _selfSpeed?: Vec2 = new Vec2(0, 0);
|
||||||
@ -57,20 +54,16 @@ export class GameScene extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.client = new WsClient(serviceProto, {
|
this.gameManager.client.flows.postDisconnectFlow.push(v => {
|
||||||
server: 'ws://127.0.0.1:3000',
|
|
||||||
logger: console
|
|
||||||
});
|
|
||||||
this.client.flows.postDisconnectFlow.push(v => {
|
|
||||||
location.reload()
|
location.reload()
|
||||||
return v;
|
return v;
|
||||||
})
|
})
|
||||||
this.gameManager = new GameManager(this.client);
|
|
||||||
|
|
||||||
this.gameManager.join();
|
this.gameManager.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
update(dt: number) {
|
update(dt: number) {
|
||||||
|
|
||||||
// Send Inputs
|
// Send Inputs
|
||||||
if (this._selfSpeed && this._selfSpeed.lengthSqr()) {
|
if (this._selfSpeed && this._selfSpeed.lengthSqr()) {
|
||||||
this._selfSpeed.normalize().multiplyScalar(gameConfig.moveSpeed);
|
this._selfSpeed.normalize().multiplyScalar(gameConfig.moveSpeed);
|
||||||
@ -84,32 +77,34 @@ export class GameScene extends Component {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let gameState = this.gameManager.state;
|
|
||||||
|
|
||||||
// console.log('update', gameState.players.length)
|
|
||||||
|
|
||||||
// Update pos
|
// Update pos
|
||||||
for (let playerState of gameState.players) {
|
let playerStates = this.gameManager.state.players;
|
||||||
|
for (let playerState of playerStates) {
|
||||||
let player: Player = this._playerInstances[playerState.id];
|
let player: Player = this._playerInstances[playerState.id];
|
||||||
if (!player) {
|
if (!player) {
|
||||||
let node = instantiate(this.prefabPlayer);
|
let node = instantiate(this.prefabPlayer);
|
||||||
this.players.addChild(node);
|
this.players.addChild(node);
|
||||||
player = node.getComponent(Player)!;
|
player = this._playerInstances[playerState.id] = node.getComponent(Player)!;
|
||||||
player.init(playerState);
|
player.init(playerState, playerState.id === this.gameManager.selfPlayerId)
|
||||||
|
|
||||||
|
// 摄像机拍摄自己
|
||||||
if (playerState.id === this.gameManager.selfPlayerId) {
|
if (playerState.id === this.gameManager.selfPlayerId) {
|
||||||
this.camera.focusTarget = node;
|
this.camera.focusTarget = node;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._playerInstances[playerState.id] = player;
|
// 自己不插值(本地预测),插值其它人
|
||||||
}
|
player.isSelf ? player.updateSelf(playerState) : player.updateOther(playerState);
|
||||||
else {
|
|
||||||
// console.log('setPos', playerState.id, playerState.pos.x, playerState.pos.y)
|
|
||||||
player.setPos(playerState.pos);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear left players
|
// Clear left players
|
||||||
|
for (let i = this.players.children.length - 1; i > -1; --i) {
|
||||||
|
let player = this.players.children[i].getComponent(Player)!;
|
||||||
|
if (!this.gameManager.state.players.find(v => v.id === player.playerId)) {
|
||||||
|
player.node.removeFromParent();
|
||||||
|
delete this._playerInstances[player.playerId];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,8 +1,9 @@
|
|||||||
import { WsClient } from "tsrpc-browser";
|
import { WsClient } from "tsrpc-browser";
|
||||||
|
import { gameConfig } from "../shared/game/gameConfig";
|
||||||
import { GameSystem, GameSystemState } from "../shared/game/GameSystem";
|
import { GameSystem, GameSystemState } from "../shared/game/GameSystem";
|
||||||
import { ClientInput, MsgClientInput } from "../shared/protocols/client/MsgClientInput";
|
import { ClientInput, MsgClientInput } from "../shared/protocols/client/MsgClientInput";
|
||||||
import { MsgFrame } from "../shared/protocols/server/MsgFrame";
|
import { MsgFrame } from "../shared/protocols/server/MsgFrame";
|
||||||
import { ServiceType } from "../shared/protocols/serviceProto";
|
import { serviceProto, ServiceType } from "../shared/protocols/serviceProto";
|
||||||
|
|
||||||
export class GameManager {
|
export class GameManager {
|
||||||
|
|
||||||
@ -17,10 +18,27 @@ export class GameManager {
|
|||||||
return this.gameSystem.state;
|
return this.gameSystem.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(client: WsClient<ServiceType>) {
|
constructor() {
|
||||||
this.client = client;
|
let client = this.client = new WsClient(serviceProto, {
|
||||||
|
server: `ws://${location.hostname}:3000`,
|
||||||
|
json: true,
|
||||||
|
// logger: console
|
||||||
|
});;
|
||||||
client.listenMsg('server/Frame', msg => { this._onServerSync(msg) });
|
client.listenMsg('server/Frame', msg => { this._onServerSync(msg) });
|
||||||
|
|
||||||
|
// 模拟网络延迟
|
||||||
|
if (gameConfig.networkLag) {
|
||||||
|
client.flows.preRecvDataFlow.push(async v => {
|
||||||
|
await new Promise(rs => { setTimeout(rs, gameConfig.networkLag) })
|
||||||
|
return v;
|
||||||
|
});
|
||||||
|
client.flows.preSendDataFlow.push(async v => {
|
||||||
|
await new Promise(rs => { setTimeout(rs, gameConfig.networkLag) })
|
||||||
|
return v;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
(window as any).gm = this;
|
(window as any).gm = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user