|
@@ -282,6 +282,7 @@ export class MoveService implements OnModuleInit {
|
|
|
userId,
|
|
|
start_break_point_id,
|
|
|
end_break_point_id,
|
|
|
+ false,
|
|
|
);
|
|
|
|
|
|
if (i == path.length - 2) {
|
|
@@ -305,6 +306,7 @@ export class MoveService implements OnModuleInit {
|
|
|
userId,
|
|
|
startBreakPointId,
|
|
|
endBreakPointId,
|
|
|
+ isFromUser,
|
|
|
) {
|
|
|
const replys = [];
|
|
|
const startPosition = this.breakPointInfo[startBreakPointId].position;
|
|
@@ -317,7 +319,7 @@ export class MoveService implements OnModuleInit {
|
|
|
},
|
|
|
endPosition,
|
|
|
);
|
|
|
-
|
|
|
+ const user = this.users[userId];
|
|
|
let i;
|
|
|
for (i = 1; i < moveFrames.length; i += 3) {
|
|
|
const moveFrame = moveFrames[i];
|
|
@@ -325,22 +327,36 @@ export class MoveService implements OnModuleInit {
|
|
|
reply.traceIds.push(traceId);
|
|
|
reply['newUserStates'][0].userId = userId;
|
|
|
|
|
|
- reply['newUserStates'][0].playerState.player.position = {
|
|
|
- x:
|
|
|
- startPosition.x +
|
|
|
- ((endPosition.x - startPosition.x) / moveFrames.length) * i,
|
|
|
- y:
|
|
|
- startPosition.y +
|
|
|
- ((endPosition.y - startPosition.y) / moveFrames.length) * i,
|
|
|
- z:
|
|
|
- startPosition.z +
|
|
|
- ((endPosition.z - startPosition.z) / moveFrames.length) * i,
|
|
|
- };
|
|
|
-
|
|
|
- reply['newUserStates'][0].playerState.player.angle.yaw = angle;
|
|
|
+ if (!isFromUser) {
|
|
|
+ reply['newUserStates'][0].playerState.player.position = {
|
|
|
+ x:
|
|
|
+ startPosition.x +
|
|
|
+ ((endPosition.x - startPosition.x) / moveFrames.length) * i,
|
|
|
+ y:
|
|
|
+ startPosition.y +
|
|
|
+ ((endPosition.y - startPosition.y) / moveFrames.length) * i,
|
|
|
+ z:
|
|
|
+ startPosition.z +
|
|
|
+ ((endPosition.z - startPosition.z) / moveFrames.length) * i,
|
|
|
+ };
|
|
|
+
|
|
|
+ reply['newUserStates'][0].playerState.player.angle.yaw = angle;
|
|
|
+ reply['newUserStates'][0].playerState.cameraCenter =
|
|
|
+ reply['newUserStates'][0].playerState.player.position;
|
|
|
+ } else {
|
|
|
+ reply['newUserStates'][0].playerState.player.position = JSON.parse(
|
|
|
+ JSON.stringify(user.player.position),
|
|
|
+ );
|
|
|
+ reply['newUserStates'][0].playerState.player.angle.yaw =
|
|
|
+ user.player.angle.yaw;
|
|
|
+ reply['newUserStates'][0].playerState.cameraCenter = JSON.parse(
|
|
|
+ JSON.stringify(user.player.position),
|
|
|
+ );
|
|
|
+ }
|
|
|
|
|
|
- reply['newUserStates'][0].playerState.camera.position =
|
|
|
- moveFrame.camera_position;
|
|
|
+ reply['newUserStates'][0].playerState.camera.position = JSON.parse(
|
|
|
+ JSON.stringify(moveFrame.camera_position),
|
|
|
+ );
|
|
|
if (i == 1) {
|
|
|
console.log('move-2' + moveFrame.camera_angle.yaw);
|
|
|
}
|
|
@@ -352,8 +368,6 @@ export class MoveService implements OnModuleInit {
|
|
|
|
|
|
reply['newUserStates'][0].playerState.camera.angle =
|
|
|
moveFrame.camera_angle;
|
|
|
- reply['newUserStates'][0].playerState.cameraCenter =
|
|
|
- reply['newUserStates'][0].playerState.player.position;
|
|
|
reply['newUserStates'][0].renderInfo.isMoving = 1;
|
|
|
reply['actionResponses'][0].traceId = traceId;
|
|
|
|
|
@@ -379,19 +393,32 @@ export class MoveService implements OnModuleInit {
|
|
|
reply.traceIds.push(traceId);
|
|
|
reply['newUserStates'][0].userId = userId;
|
|
|
|
|
|
- reply['newUserStates'][0].playerState.player.position = {
|
|
|
- x:
|
|
|
- startPosition.x +
|
|
|
- ((endPosition.x - startPosition.x) / moveFrames.length) * i,
|
|
|
- y:
|
|
|
- startPosition.y +
|
|
|
- ((endPosition.y - startPosition.y) / moveFrames.length) * i,
|
|
|
- z:
|
|
|
- startPosition.z +
|
|
|
- ((endPosition.z - startPosition.z) / moveFrames.length) * i,
|
|
|
- };
|
|
|
-
|
|
|
- reply['newUserStates'][0].playerState.player.angle.yaw = angle;
|
|
|
+ if (!isFromUser) {
|
|
|
+ reply['newUserStates'][0].playerState.player.position = {
|
|
|
+ x:
|
|
|
+ startPosition.x +
|
|
|
+ ((endPosition.x - startPosition.x) / moveFrames.length) * i,
|
|
|
+ y:
|
|
|
+ startPosition.y +
|
|
|
+ ((endPosition.y - startPosition.y) / moveFrames.length) * i,
|
|
|
+ z:
|
|
|
+ startPosition.z +
|
|
|
+ ((endPosition.z - startPosition.z) / moveFrames.length) * i,
|
|
|
+ };
|
|
|
+
|
|
|
+ reply['newUserStates'][0].playerState.player.angle.yaw = angle;
|
|
|
+ reply['newUserStates'][0].playerState.cameraCenter =
|
|
|
+ reply['newUserStates'][0].playerState.player.position;
|
|
|
+ } else {
|
|
|
+ reply['newUserStates'][0].playerState.player.position = JSON.parse(
|
|
|
+ JSON.stringify(user.player.position),
|
|
|
+ );
|
|
|
+ reply['newUserStates'][0].playerState.player.angle.yaw =
|
|
|
+ user.player.angle.yaw;
|
|
|
+ reply['newUserStates'][0].playerState.cameraCenter = JSON.parse(
|
|
|
+ JSON.stringify(user.player.position),
|
|
|
+ );
|
|
|
+ }
|
|
|
|
|
|
reply['newUserStates'][0].playerState.camera.position =
|
|
|
moveFrame.camera_position;
|
|
@@ -403,8 +430,6 @@ export class MoveService implements OnModuleInit {
|
|
|
|
|
|
reply['newUserStates'][0].playerState.camera.angle =
|
|
|
moveFrame.camera_angle;
|
|
|
- reply['newUserStates'][0].playerState.cameraCenter =
|
|
|
- reply['newUserStates'][0].playerState.player.position;
|
|
|
|
|
|
reply['actionResponses'][0].traceId = traceId;
|
|
|
|
|
@@ -434,7 +459,6 @@ export class MoveService implements OnModuleInit {
|
|
|
user.player.position =
|
|
|
lastReply['newUserStates'][0].playerState.player.position;
|
|
|
user.player.angle = lastReply['newUserStates'][0].playerState.player.angle;
|
|
|
-
|
|
|
user.camera.position =
|
|
|
lastReply['newUserStates'][0].playerState.camera.position;
|
|
|
user.camera.angle = lastReply['newUserStates'][0].playerState.camera.angle;
|
|
@@ -569,20 +593,20 @@ export class MoveService implements OnModuleInit {
|
|
|
const appId = user.appId;
|
|
|
|
|
|
const replys = [];
|
|
|
- const step = 1;
|
|
|
- const closestDis = 20; //小于这个距离就跳到邻居呼吸点
|
|
|
+ const step = 0.3;
|
|
|
+ const closestDis = 90; //小于这个距离就跳到邻居呼吸点
|
|
|
const distance = step * dir_action.speed_level;
|
|
|
let angle = null;
|
|
|
-
|
|
|
- // debugger;
|
|
|
+ let move_angle = dir_action.move_angle + user.camera.angle.yaw;
|
|
|
+ move_angle = move_angle % 360;
|
|
|
//TODO 临时增加断言
|
|
|
const playerPosition: Point = { x: 0, y: 0, z: 0 };
|
|
|
playerPosition.x =
|
|
|
user.player.position.x +
|
|
|
- distance * Math.cos((dir_action.move_angle / 360) * 2 * Math.PI);
|
|
|
+ distance * Math.cos((move_angle / 360) * 2 * Math.PI);
|
|
|
playerPosition.y =
|
|
|
user.player.position.y +
|
|
|
- distance * Math.sin((dir_action.move_angle / 360) * 2 * Math.PI);
|
|
|
+ distance * Math.sin((move_angle / 360) * 2 * Math.PI);
|
|
|
|
|
|
//找到邻居点,判断user.player.position与邻居点的距离,如果距离小于closestDis,就要更新camera的position
|
|
|
let chooseBreakPointId = null;
|
|
@@ -591,13 +615,12 @@ export class MoveService implements OnModuleInit {
|
|
|
//const neighAngles = [];
|
|
|
const traceIds = [];
|
|
|
|
|
|
- user.player.angle.yaw = dir_action.move_angle;
|
|
|
+ user.player.angle.yaw = move_angle;
|
|
|
traceIds.push(traceId);
|
|
|
this.reply.traceIds = traceIds;
|
|
|
this.reply['newUserStates'][0].userId = userId;
|
|
|
this.reply['actionResponses'][0].traceId = traceId;
|
|
|
- this.reply['newUserStates'][0].playerState.player.angle.yaw =
|
|
|
- dir_action.move_angle;
|
|
|
+ this.reply['newUserStates'][0].playerState.player.angle.yaw = move_angle;
|
|
|
|
|
|
this.reply['newUserStates'][0].playerState.camera.angle = JSON.parse(
|
|
|
JSON.stringify(user.camera.angle),
|
|
@@ -635,7 +658,7 @@ export class MoveService implements OnModuleInit {
|
|
|
|
|
|
//判断_angle与angle的差在45以内的个数,两个的话表示可以走
|
|
|
let count = 0;
|
|
|
- let neighPoints = [];
|
|
|
+ const neighPoints = [];
|
|
|
_angle = this.getAngle(
|
|
|
breakPoint.position,
|
|
|
{ x: breakPoint.position.x + 1, y: breakPoint.position.y },
|
|
@@ -664,34 +687,43 @@ export class MoveService implements OnModuleInit {
|
|
|
angle += 360;
|
|
|
}
|
|
|
//neighAngles.push(angle);
|
|
|
- if(Math.abs(angle - _angle)<45){
|
|
|
+ if (Math.abs(angle - _angle) < 45) {
|
|
|
+ neighPoint.angle = angle;
|
|
|
neighPoints.push(neighPoint);
|
|
|
++count;
|
|
|
- }
|
|
|
- else if(angle == 0 && _angle>315){
|
|
|
+ } else if (angle == 0 && _angle > 315) {
|
|
|
+ neighPoint.angle = angle;
|
|
|
neighPoints.push(neighPoint);
|
|
|
++count;
|
|
|
+ } else if (Math.abs(angle - _angle) == 0) {
|
|
|
+ neighPoint.angle = angle;
|
|
|
+ neighPoints.push(neighPoint);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- if(count==2 || _angle%45 ==0){
|
|
|
+
|
|
|
+ if (count == 2 || _angle % 45 == 0) {
|
|
|
//人物移动
|
|
|
user.player.position = JSON.parse(JSON.stringify(playerPosition));
|
|
|
this.reply['newUserStates'][0].playerState.player.position = JSON.parse(
|
|
|
JSON.stringify(playerPosition),
|
|
|
);
|
|
|
- }
|
|
|
- else{
|
|
|
+ } else {
|
|
|
return this.reply;
|
|
|
}
|
|
|
|
|
|
//超出范围了
|
|
|
- if(this.getDistance(playerPosition,breakPoint.position)>50){
|
|
|
- //debugger;
|
|
|
- if(this.getDistance(playerPosition,neighPoints[0].position)>this.getDistance(playerPosition,neighPoints[1].position)){
|
|
|
+ if (this.getDistance(playerPosition, breakPoint.position) > closestDis) {
|
|
|
+ //角度是45的倍数
|
|
|
+ if (_angle % 45 == 0) {
|
|
|
+ chooseBreakPointId = neighPoints[0].breakPointId;
|
|
|
+ } else if (
|
|
|
+ //this.getDistance(playerPosition, neighPoints[0].position) >
|
|
|
+ //this.getDistance(playerPosition, neighPoints[1].position)
|
|
|
+ Math.abs(_angle - neighPoints[0].angle) >
|
|
|
+ Math.abs(_angle - neighPoints[1].angle)
|
|
|
+ ) {
|
|
|
chooseBreakPointId = neighPoints[1].breakPointId;
|
|
|
- }
|
|
|
- else{
|
|
|
+ } else {
|
|
|
chooseBreakPointId = neighPoints[0].breakPointId;
|
|
|
}
|
|
|
}
|
|
@@ -702,6 +734,9 @@ export class MoveService implements OnModuleInit {
|
|
|
//判断人物离该邻接点的距离是否在最小路径内,如果是,跳到这个邻接点里
|
|
|
//相机纠正加过渡
|
|
|
else {
|
|
|
+ if (chooseBreakPointId == user.breakPointId) {
|
|
|
+ return this.reply;
|
|
|
+ }
|
|
|
angle = user.camera.angle.yaw % 45; //纠正需要
|
|
|
//通过user.camera.angle矫正相机的angle
|
|
|
const checkReplys = await this.modeifyCameraAngle(
|
|
@@ -731,8 +766,15 @@ export class MoveService implements OnModuleInit {
|
|
|
userId,
|
|
|
breakPointId,
|
|
|
chooseBreakPointId,
|
|
|
+ true,
|
|
|
);
|
|
|
replys.push(pathReplys);
|
|
|
+ user.breakPointId = chooseBreakPointId;
|
|
|
+ const lastFrame = moveFrames[moveFrames.length - 1];
|
|
|
+ user.camera.position = JSON.parse(
|
|
|
+ JSON.stringify(lastFrame.camera_position),
|
|
|
+ );
|
|
|
+ user.camera.angle.yaw = lastFrame.camera_angle.yaw;
|
|
|
return replys;
|
|
|
}
|
|
|
} catch (error) {
|