1

好的,所以我一直在关注关于浮动的教程,并使精灵以低于每帧 1 个像素的速度移动。相当容易。现在,我得到以下任务:

在计算新坦克的位置时添加重力影响,使其自动下降,而不是每次都弹到顶部。

我怎么做这个重力的东西?我只学会了如何添加到 x 和 y... 简单地添加到每帧的 y 值当然不能很好地工作,而且不是真正的重力。我真的不明白我在这里应该做什么。

要了解简短教程,请点击此处的链接。这很简单。 http://www.devmaster.net/articles/intro-to-c++-with-game-dev/part6.php

这是我的错误代码,用于使坦克在四个方向上移动并使其在下降时不可见。由于教程,我添加了花车。

 Sprite theSprite( new Surface("assets/ctankbase.tga"), 16 );


        float SpriteX = 50;
    float SpriteY = 0;    //the sprite starts at the top of the screen (2D coords system)
    float screenBottom = 400; //I'm assuming your screen is 200 pixels high, change to your size
    float speedY = 0.01; //the initial speed of the sprite
    float accelY = 0.01;  //the change in speed with each tick
    bool  Bottom = false;

    void Game::Tick( float a_DT )
    {
        m_Screen->Clear( 0 );

        theSprite.Draw(SpriteX, SpriteY, m_Screen ); // Draws sprite


        if(SpriteY >= screenBottom) //when we hit bottom we change the direction of speed and slow it
        {
            speedY = -speedY/2;
            Bottom = true;
        }

        if(Bottom == false)
        {
        SpriteY += speedY;
        }

        speedY += accelY;

    }

那么我如何让这个坦克用“重力”在屏幕上弹跳,用更少的延迟代码呢?谢谢。对不起,如果这是一个愚蠢的问题,但我没有看到它。

4

3 回答 3

2

当我需要某种“重力”(也可以称为仅向下加速)时,我通常会做的是定义 a和position变量。您添加到的每个刻度,这样您的精灵在每个刻度上都沿给定方向移动,现在您还需要更改运动方向以逐渐改变,这就是进来的地方,您将它添加到每个刻度。speedaccelerationspeedpositionspeedaccelerationspeed

伪代码将如下所示:

var posy = 50;
var speedy = 5;
var accely = -0.5;
tick() {
    posy += speedy;
    speedy += accely;
}

这样,您的速度最终将变为负数,因此将开始移动精灵底部而不是向上。

注意:我的值是任意的,您必须使用它们才能达到您真正需要的效果

这是我认为适合您的情况的代码,为简单起见,我假设您的球仅在Y轴上移动。您必须自己添加X轴运动。

float SpriteX = 50;
float SpriteY = 100;    //the sprite starts at the top of the screen (2D coords system)
float screenBottom = 200; //I'm assuming your screen is 200 pixels high, change to your size
float speedY = 0.23; //the initial speed of the sprite
float accelY = 0.02;  //the change in speed with each tick

void Game::Tick( float a_DT )
{
    m_Screen->Clear( 0 );

    theSprite.Draw(SpriteX, SpriteY, m_Screen ); // Draws sprite


    if(SpriteY >= screenBottom) //when we hit bottom we change the direction of speed and slow it
    {
        speedY = -speedY/2;
    }
    SpriteY += speedY;
    speedY += accelY;
}

这段代码根本没有经过测试,因此可能必须使用它才能使其真正工作。值也是任意的,但逻辑保持不变。我试图删除所有与弹跳没有直接关系的东西,让我知道它是如何工作的。

希望这有帮助。

于 2011-10-09T10:10:30.510 回答
0

它只是简单的物理。

您需要一个用于位置和速度的变量。速度会随着时间线性增加,因此您只需在每一帧中添加一个常数。然后将速度添加到位置,您将获得正确的引力行为。

于 2011-10-09T10:10:15.917 回答
0

您将需要跟踪精灵的当前速度。

在每次迭代中,你必须在速度上加上一个常数(这个常数就是加速度),然后绘制精灵,就好像它已经按照当前速度移动了一样,即把速度加到当前位置。当然,为了获得好看的结果,速度和加速度应该是二维向量。

在地球上,重力是9.81 m/(sec^2)指向地球的加速度。这意味着每秒钟物体的速度都会9.81 m/s沿地球方向增加。

于 2011-10-09T10:17:33.810 回答