指定方向射击子弹

最近在做射击游戏,要求指定一个子弹发射位置,然后指定一个敌人位置,敌人位置可以在任何方向,之后子弹会向敌人方向射击,数学不太好,感觉应该有更聪明的办法,求指点,我的代码如下

这是子弹每帧x, y以及子弹角度计算代码

void StraightBulletScript::onBulletInit() {
    // get enemy entity
    this->_targetEntity = entity->getEntityByTag("enemy");
    // get enemy position
    Vec2 enemyPos = _targetEntity->getTransform()->getPosition();
    // get bullet start position
    Vec2 entityPos = transform->getPosition();
    // compute the distance from enemy position to bullet start position
    Vec2 dis = enemyPos - entityPos;

    // x coordinate step per frame
    stepDisX = 20;
    // y coordinate step per frame
    stepDisY = 20;
    // the angle degree from bullet start position to enemy position based on x coordinate line
    angle = -atan2(dis.y, dis.x) * 180 / 3.141592653;

    // direction fix
    if (dis.x < 0 && dis.y > 0 && (abs(dis.x) > abs(dis.y))) {
        stepDisY = -stepDisY;
        stepDisX = -stepDisX;
    }

    if (dis.x > 0 && dis.y < 0 && (abs(dis.x) < abs(dis.y))) {
        stepDisY = -stepDisY;
        stepDisX = -stepDisX;
    }

    if (dis.x < 0 && dis.y < 0) {
        stepDisY = -stepDisY;
        stepDisX = -stepDisX;
    }

    // compute the slope, and scale x or y
    if (abs(dis.x) > abs(dis.y)) {
        slope = dis.y / dis.x;
        stepDisY *= slope;
    } else {
        slope = dis.x / dis.y;
        stepDisX *= slope;
    }
}

```



计算完子弹参数后,每帧调用如下代码更新
transform->setPositionX(transform->getPositionX() + stepDisX);
transform->setPositionY(transform->getPositionY() + stepDisY);
transform->setRotation(angle);

```

话说为什么不用动作做。。。

动作只能到一点上,这里应该是想往一个方向上发射

没那么复杂啦。。大概思路在下面

1.指定一个子弹的速度float speed,单位pix/s

2.init里面
float angle = getgetPosition().getAngle(enemy.getgetPosition());// 计算角度。这里我用的自己轮子,cocos自带方法没研究,需要验证一下正确性
setAngle(angle);

3.在update(float dt)里面
setsetPosition(x + speed * sin(getAngle()) * dt, y + speed * cos(getAngle()) * dt);// 直接加speed的x、y偏移量
if (飞出屏幕外){
removeFromParent();
}