射箭准确度
This commit is contained in:
parent
22c9913ed6
commit
c9ac4a6470
@ -49,8 +49,8 @@ export class GameSystem {
|
|||||||
startPos: { ...player.pos },
|
startPos: { ...player.pos },
|
||||||
startTime: this._state.now,
|
startTime: this._state.now,
|
||||||
targetPos: {
|
targetPos: {
|
||||||
x: player.pos.x + input.direction.x * gameConfig.arrowDistance,
|
x: player.pos.x + input.offset.x,
|
||||||
y: player.pos.y + input.direction.y * gameConfig.arrowDistance
|
y: player.pos.y + input.offset.y
|
||||||
},
|
},
|
||||||
targetTime: this._state.now + gameConfig.arrowFlyTime
|
targetTime: this._state.now + gameConfig.arrowFlyTime
|
||||||
});
|
});
|
||||||
@ -75,11 +75,11 @@ export class GameSystem {
|
|||||||
// 伤害判定
|
// 伤害判定
|
||||||
let damagedPlayers = this._state.players.filter(v => {
|
let damagedPlayers = this._state.players.filter(v => {
|
||||||
// 不能伤害自己
|
// 不能伤害自己
|
||||||
if (v.id === arrow.fromPlayerId) {
|
// if (v.id === arrow.fromPlayerId) {
|
||||||
return false;
|
// return false;
|
||||||
}
|
// }
|
||||||
|
|
||||||
return (v.pos.x - arrow.targetPos.x) * (v.pos.x - arrow.targetPos.x) + (v.pos.y - arrow.targetPos.y) * (v.pos.y - arrow.targetPos.y) <= gameConfig.arrowDistance * gameConfig.arrowDistance
|
return (v.pos.x - arrow.targetPos.x) * (v.pos.x - arrow.targetPos.x) + (v.pos.y - arrow.targetPos.y) * (v.pos.y - arrow.targetPos.y) <= gameConfig.arrowAttackRadius * gameConfig.arrowAttackRadius
|
||||||
});
|
});
|
||||||
damagedPlayers.forEach(p => {
|
damagedPlayers.forEach(p => {
|
||||||
// 设置击晕状态
|
// 设置击晕状态
|
||||||
@ -112,7 +112,7 @@ export interface PlayerMove {
|
|||||||
export interface PlayerAttack {
|
export interface PlayerAttack {
|
||||||
type: 'PlayerAttack',
|
type: 'PlayerAttack',
|
||||||
playerId: number,
|
playerId: number,
|
||||||
direction: { x: number, y: number },
|
offset: { x: number, y: number },
|
||||||
}
|
}
|
||||||
export interface PlayerJoin {
|
export interface PlayerJoin {
|
||||||
type: 'PlayerJoin',
|
type: 'PlayerJoin',
|
||||||
|
@ -9,6 +9,7 @@ export const gameConfig = {
|
|||||||
moveSpeed: 10,
|
moveSpeed: 10,
|
||||||
|
|
||||||
arrowFlyTime: 500,
|
arrowFlyTime: 500,
|
||||||
arrowDistance: 7,
|
arrowDistance: 8,
|
||||||
|
arrowAttackRadius: 3,
|
||||||
arrowDizzyTime: 1000
|
arrowDizzyTime: 1000
|
||||||
}
|
}
|
@ -17,7 +17,7 @@ export interface ServiceType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const serviceProto: ServiceProto<ServiceType> = {
|
export const serviceProto: ServiceProto<ServiceType> = {
|
||||||
"version": 1,
|
"version": 2,
|
||||||
"services": [
|
"services": [
|
||||||
{
|
{
|
||||||
"id": 0,
|
"id": 0,
|
||||||
@ -159,8 +159,8 @@ export const serviceProto: ServiceProto<ServiceType> = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 3,
|
||||||
"name": "direction",
|
"name": "offset",
|
||||||
"type": {
|
"type": {
|
||||||
"type": "Interface",
|
"type": "Interface",
|
||||||
"properties": [
|
"properties": [
|
||||||
|
@ -22,7 +22,6 @@ export class Arrow extends Component {
|
|||||||
this._endPos.set(state.targetPos.x, 0, -state.targetPos.y);
|
this._endPos.set(state.targetPos.x, 0, -state.targetPos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
updateState(state: ArrowState, now: number) {
|
updateState(state: ArrowState, now: number) {
|
||||||
let percent = MathUtil.limit((now - state.startTime) / (state.targetTime - state.startTime), 0, 1);
|
let percent = MathUtil.limit((now - state.startTime) / (state.targetTime - state.startTime), 0, 1);
|
||||||
|
|
||||||
|
@ -143,9 +143,10 @@ export class GameScene extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onBtnAttack() {
|
onBtnAttack() {
|
||||||
|
let offset = this._playerInstances[this.gameManager.selfPlayerId].node.forward.clone().normalize().multiplyScalar(gameConfig.arrowDistance);
|
||||||
this.gameManager.sendClientInput({
|
this.gameManager.sendClientInput({
|
||||||
type: 'PlayerAttack',
|
type: 'PlayerAttack',
|
||||||
direction: this._playerInstances[this.gameManager.selfPlayerId].node.forward
|
offset: { x: offset.x, y: -offset.z }
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ export class GameManager {
|
|||||||
|
|
||||||
gameSystem = new GameSystem();
|
gameSystem = new GameSystem();
|
||||||
lastServerState: GameSystemState = this.gameSystem.state;
|
lastServerState: GameSystemState = this.gameSystem.state;
|
||||||
|
lastRecvSetverStateTime = 0;
|
||||||
selfPlayerId: number = -1;
|
selfPlayerId: number = -1;
|
||||||
lastSN = 0;
|
lastSN = 0;
|
||||||
|
|
||||||
@ -67,6 +68,7 @@ export class GameManager {
|
|||||||
|
|
||||||
this.gameSystem.reset(ret.res.gameState);
|
this.gameSystem.reset(ret.res.gameState);
|
||||||
this.lastServerState = Object.merge(ret.res.gameState);
|
this.lastServerState = Object.merge(ret.res.gameState);
|
||||||
|
this.lastRecvSetverStateTime = Date.now();
|
||||||
this.selfPlayerId = ret.res.playerId;
|
this.selfPlayerId = ret.res.playerId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,6 +79,7 @@ export class GameManager {
|
|||||||
this.gameSystem.applyInput(input);
|
this.gameSystem.applyInput(input);
|
||||||
}
|
}
|
||||||
this.lastServerState = Object.merge({}, this.gameSystem.state);
|
this.lastServerState = Object.merge({}, this.gameSystem.state);
|
||||||
|
this.lastRecvSetverStateTime = Date.now();
|
||||||
|
|
||||||
// 和解
|
// 和解
|
||||||
let lastSn = frame.lastSn ?? -1;
|
let lastSn = frame.lastSn ?? -1;
|
||||||
@ -89,6 +92,13 @@ export class GameManager {
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 本地时间流逝(会被下一次服务器状态覆盖)
|
||||||
|
this.gameSystem.applyInput({
|
||||||
|
type: 'TimePast',
|
||||||
|
dt: Date.now() - this.lastRecvSetverStateTime
|
||||||
|
});
|
||||||
|
this.lastRecvSetverStateTime = Date.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingInputMsgs: MsgClientInput[] = [];
|
pendingInputMsgs: MsgClientInput[] = [];
|
||||||
@ -109,6 +119,13 @@ export class GameManager {
|
|||||||
...input,
|
...input,
|
||||||
playerId: this.selfPlayerId
|
playerId: this.selfPlayerId
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 本地时间流逝(会被下一次服务器状态覆盖)
|
||||||
|
// this.gameSystem.applyInput({
|
||||||
|
// type: 'TimePast',
|
||||||
|
// dt: Date.now() - this.lastRecvSetverStateTime
|
||||||
|
// });
|
||||||
|
// this.lastRecvSetverStateTime = Date.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user