cocoscreator做的捕鱼遇到的问题

子弹碰撞墙角反弹是怎么处理的

没做过捕鱼,不过想到方法。假设子弹飞行轨道是(x + i, y + j) i和j是x轴和y轴的移动速度,如果当前x轴超出屏幕,i = -i,如果y轴超出屏幕 j = -j,子弹继续运行

1赞

碰到墙了 就立即改变子弹的角度啊

射到角落相当于同事碰到两个墙,反弹角度算法会有问题

@1404463067
在你眼中是同时, 在代码逻辑上不是.
假设物体 A(圆形)墙B(竖) 以及 墙C(横) , 在屏幕左下角发生你说的角落碰撞.
规定所有的角度都转换为 [-180 ~ 180].
A的当前角度为 -135

代码执行流程是:

  1. 处理物体A和墙B的碰撞, A转向, 得到角度 -45 度;
  2. 处理物体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;
    }

我现在子弹多了之后会很卡,碰撞那里能怎么优化啊
,碰撞之后一直设置角度的,影响大吗