子弹碰撞墙角反弹是怎么处理的
没做过捕鱼,不过想到方法。假设子弹飞行轨道是(x + i, y + j) i和j是x轴和y轴的移动速度,如果当前x轴超出屏幕,i = -i,如果y轴超出屏幕 j = -j,子弹继续运行
1赞
碰到墙了 就立即改变子弹的角度啊
射到角落相当于同事碰到两个墙,反弹角度算法会有问题
@1404463067
在你眼中是同时, 在代码逻辑上不是.
假设物体 A(圆形) 和 墙B(竖) 以及 墙C(横) , 在屏幕左下角发生你说的角落碰撞.
规定所有的角度都转换为 [-180 ~ 180].
A的当前角度为 -135 度
代码执行流程是:
- 处理物体A和墙B的碰撞, A转向, 得到角度 -45 度;
- 处理物体A和墙C的碰撞, A转向(在1的基础上), 得到角度 45 度;
刚好就是 -135 度的相反方向. 所以不存在你说的"同时碰撞"的问题.
这种角落是需要单独处理吧
恩,对的,本人做过捕鱼,子弹和边角的碰撞也是自己写的判断。一开始只区分4边的判断,设定超过边界检查,然后根据子弹的角度,进行反弹计算,后面发现在边角的时候特别容易出问题,边角的时候,会出现碰撞到一个边,矫正后反弹的下一帧碰撞到另一个边,如此反复,推荐在自己判断在一定角度就认为是边角碰撞,然后直接相对于边角的反弹出来即可,实际效果是可以接受的。
@1111281 @1404463067
我是不需要做特殊处理的, 判断转向还需要考虑子弹本身的角度
这是部分代码(typescript)
// 处理撞墙
handleCollideWall(wall: WallObj) {
if (this._judgeAngleAndWallLocation(this._angle, wall.wallLocation)) {
my.log(TAG, '子弹要转向')
let angle;
switch (wall.wallLocation) {
case eWallLocation.LEFT:
case eWallLocation.RIGHT:
angle = 180 - this._angle;
break;
case eWallLocation.TOP:
case eWallLocation.BOTTOM:
angle = - this._angle
break;
}
this.changeAngle(angle)
} else {
//my.log(TAG, '子弹不需要转向')
}
}
// 判断子弹角度和墙是否需要碰撞
_judgeAngleAndWallLocation(angle, wallLocaltion: eWallLocation) {
//my.log(TAG, '判断是否需要处理子弹转向', angle, wallLocaltion)
switch (wallLocaltion) {
case eWallLocation.LEFT: if (angle <= -90 || angle >= 90) return true; break;
case eWallLocation.RIGHT: if (angle >= -90 && angle <= 90) return true; break;
case eWallLocation.TOP: if (angle >= 0 && angle <= 180) return true; break;
case eWallLocation.BOTTOM: if (angle >= -180 && angle <= 0) return true; break;
}
return false;
}
我现在子弹多了之后会很卡,碰撞那里能怎么优化啊
,碰撞之后一直设置角度的,影响大吗