2011-10-09 76 views
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; 

    } 

那麼,如何讓這個坦克在'重力'的屏幕上彈跳,在較少的代碼中呢? 謝謝。對不起,如果這是一個愚蠢的問題,但我沒有看到它。

回答

0

它只是簡單的物理。

您需要一個位置和速度的變量。速度會隨着時間的推移而線性增加,所以你只需在每一幀添加一個常量。然後,您將速度添加到位置,您將得到一個電流引力行爲。

2

當我需要各種「重力」(也可能僅指加速度向下)時,我通常會做的是定義positionspeedacceleration變量。每增加一個勾號speedposition,這樣你的精靈就會在每個滴答的某個給定方向上移動,現在你還需要改變speed的運動方向逐漸改變,這就是acceleration進來的地方,你把它添加到speed的每個勾號。

的僞代碼如下所示:

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; 
} 

此代碼是不是在所有的測試,因此將可能發揮它,使之能正常工作。值也是任意的,但邏輯保持不變。我試圖刪除所有與彈跳無關的東西,讓我知道它是如何運作的。

希望這有助於。

+0

感謝您的回答。您能否向我展示這些與我編寫的代碼有關的內容,還是那麼多的工作?我真的不知道如何實現這一點。請注意,我對這個編碼工作完全陌生。 – Turbosheep

+0

@Turbosheep有一些事情我沒有真正在你的代碼中得到。就像你爲什麼要這樣做:'在'tick()'開始時'SpriteY + = 0.01;'然後再次改變'SpriteY'的值,如果它向上或向下移動的話......你能解釋一下那個部分嗎?關於你的約束(運動的x/y極限是什麼)的解釋也是很好的。 – MeLight

+0

當然。 SpriteY + = 0.01;可以忽略。我現在把它從我的帖子中編輯出來。我錯誤地離開了這個實驗,我很抱歉。約束在那裏,因爲我需要一些條件來將精靈向右,向下,向左和向上移動。我需要在四個條件下移動精靈進行任務,所以......但是我不知道如何實際反彈精靈或任何東西。 – Turbosheep

0

你將需要跟蹤你的精靈的當前速度。每次迭代必須在速度上加一個常量(這個常量就是加速度),然後畫出這個精靈,就好像它已經按照當前速度移動了一樣,也就是把速度加到當前位置。當然,爲了獲得好看的結果,速度和加速度應該是2維向量。

在地球上,重力是一個加速度值爲9.81 m/(sec^2)指向地球。這意味着每秒鐘一個物體的速度在地球的方向上增加9.81 m/s