小行星游戏c ++惯性

时间:2016-07-10 01:27:42

标签: c++

我试图让我的小行星一直按下按钮继续移动。

void Ship::applyThrust()

{

   _v.setX(_v.getX() - sin(2 * M_PI * (_angle / 360)) * 2.5); 

   _v.setY(_v.getY() + cos(2 * M_PI * (_angle / 360)) * 2.5); 

}

这是我必须帮助我的船移动的公式。

_v.setX和_vsetY更新X和Y位置

M_PI仅为3.14。

_angle是我用左右箭头键和

设置的旋转量

2.5是我想要移动的帧数

我的船移动得很好,问题是我正在试图模拟太空惯性并让我的船继续移动。

关于如何成为逻辑的任何想法?

谢谢,

1 个答案:

答案 0 :(得分:2)

在你的游戏循环中,你需要一个根据x和y速度更新船舶位置的功能。您已经接近获得船舶的新x和y坐标,但是您没有考虑船舶的速度。当您施加推力时,获取 velocity 的x和y分量,而不是新位置。您将有一个额外的功能来更新位置,该位置应该以定时间隔在游戏循环中调用 - 例如每次更新框架。因此,您的 applyThrust 函数应该实际更新您的船速。这意味着如果您还没有变量,则需要在 Ship 类中为您的船舶位置和船舶速度添加变量。为简单起见,我打破了位置和速度的组件,但为了清晰起见,您可能希望将它们存储在矢量中:

class Ship 
{
    private float xpos, ypos; // current position of your ship
    private float velocityX, velocityY; // current velocity of your ship
}

然后,当您施加推力时,您更改速度,并记住仅在按下推力按钮时调用applyThrust,而不是在位置更新时每个帧调用:

void Ship::applyThrust()
{
    /* 
       Assume 1 total unit of thrust is applied each time you hit the thrust button
       so you break down the velocity into x and y components depending on the direction
       your ship is facing. 
    */    
    // thrustUnit is how much thrust each thrust button press gets you, it's arbitrary
    // and can be the 2.5 multiplier you're using in your question
    float thrustUnit = 1.0;

    // now get the x and y thrust components of velocity based on your ship's direction
    // assuming 0 degrees is pointing to the right
    float newVX, newVY = 0.0;        
    newVX = thrustUnit * cos(_angle);
    newVY = thrustUnit * sin(_angle); // radian conversion left out to save space

    // Update your ship's velocity
    updateVelocity(newVX, newVY);
}

updateVelocity 看起来像:(注意速度是添加所以它会继续漂移,除非在相反方向施加推力 - 就像它一样在无间隙的介质中,如空间)

void Ship::updateVelocity(newVX, newVY)
{
    // update the x component
    velocityX += newVX;
    velocityY += newVY;
}

所以现在你还需要一个考虑到船速的updatePosition函数。每次帧更新都会调用它:

void Ship::updatePosition()
{
    // add the x component of velocity to the ship's x position
    // assuming xpos and ypos are variables in the Ship class for tracking position
    xpos += velocityX;
    ypos += velocityY;
}

现在船舶的位置根据每次更新时的每个速度分量逐渐变化。您还可以使 thrustUnit 成为一个成员变量,以允许加速或降低您的推力组件以提高您的船速并且能够通过更小的 thrustUnit来更好地控制它em>或者用大的 thrustUnit 给它超速。

祝你好运!