2011-09-19 45 views
2

可以說我有其控制像下面一些字符移動的方法:C++增量發出

void Player::moveRight(Uint32 ticks) 
{ 
    if(speedx < maxspeed) { speedx += accel; } 
    x += speedx * (ticks/1000.f); 
    //collision 
    if(x > (float)(800 - width)) { x = (float)(800 - width); } 
} 

MAXSPEED = 300和加速度= 2(也,speedx從0開始)

現在沒有什麼錯,直到我在方程中加入一個恆定的減速/摩擦。基本上,我有一個不斷減速的1這是從每幀的速度中減去。如果角色沒有移動,他們會逐漸停下來。

問題是這樣的:如果speedx = 299由於減速,我的if語句仍然是真的,並且它繼續添加accel,它將速度提高到301,超過最大速度。

對於這個問題,有什麼好的解決方案可以讓我獲得任何加速度和減速度值,並且不會跳過if語句?

+1

請注意,您的加速度是按時間計算的,而速度是按時間計算的。 (這會讓accepartion在不同的幀速率下表現不同,而速度會相同) – Dani

回答

2

將其更改爲:

if (speedx + accel > maxspeed) { speed = maxspeed; } 
else speed += accel; 

在這種情況下,如果加速度使速度走過去最大它將簡單地設定速度爲最大。否則就會像平常一樣加速。

或者,你可以這樣做:

speedx = min(speedx + accel, maxspeed); 
1

簡單的解決辦法可能是你調整後剪輯的速度:

void Player::moveRight(Uint32 ticks) 
{ 
    speedx += accel; 
    if(speedx >= maxspeed) { speedx = maxspeed } 
    x += speedx * (ticks/1000.f); 
    //collision 
    if(x > (float)(800 - width)) { x = (float)(800 - width); } 
} 
0

簡單地夾緊speedx似乎將很好地工作:

if (speedx < maxspeed) { speedx = min(speedx+accel,maxspeed); } 
1

選項1:截取您的speedxmaxspeed。代碼緊湊。

speedx += accel; 
if (speedx > maxspeed) { speedx = maxspeed; } 

選項2:在不需要的時候防止虛假的添加。

if (speedx < maxspeed) { 
    speedx += accel; 
    if (speedx > maxspeed) { speedx = maxspeed; } 
} 

當您在maxspeed時,前者會浪費額外費用。當你低於maxspeed-accel時,後者會浪費比較。哪個更好取決於哪種情況更可能。

5

爲了扭轉和鞏固quasiverse的回答,您可以使用:

speedx = min(maxspeed, speedx + accel); 

這將增加或蓋酌情與很瑣碎的代碼。

與目前大多數建議相比,優勢在於它只執行一次添加,或者執行單個比較。

+0

我必須包含什麼來讓min()工作?數學? – grep

+0

@Headspin'#include ' – quasiverse

+0

「*它只執行一次加法,或者執行一次比較。*」:它執行一次加法**和**執行一次比較。如果物體的速度大部分時間都是以最大速度固定的,則這種添加是多餘的。如果性能很重要,那麼只有在'speedx'小於'maxspeed'的情況下執行此分配可能會更好。如果性能無關緊要,那麼就沒有理由想到爲代碼增加額外的複雜性。 –