2013-04-20 48 views
0

我一直很難創建一個跳躍系統,用戶可以點擊跳躍按鈕進行小跳躍並保持跳躍。可變跳躍高度

我偶然發現了這個話題:

https://gamedev.stackexchange.com/questions/13277/variable-height-jumping-in-side-scrollers

哪位大大幫我制定如下代碼:

PlayerMovementTimer = [NSTimer scheduledTimerWithTimeInterval:0.005 target:self selector:@selector(movePlayer) userInfo:nil repeats:YES]; 

[JumpButton addTarget:self action:@selector(jumpPlayer:) forControlEvents:UIControlEventTouchDown]; 
[JumpButton addTarget:self action:@selector(stopJump:) forControlEvents:UIControlEventTouchCancel | UIControlEventTouchUpInside | UIControlEventTouchDragExit]; 

- (void)movePlayer 
{ 
    CGFloat playerY = Player.center.y + PlayerYV; 
    if(playerY > 264) { 
     PlayerYV = 0; 
     playerY = 264; 
    } 
    if(playerY < 264) { 
     PlayerYV += 0.048f - PlayerYD; 
    } 
    if(HoldingJump && PlayerYV < 0 && PlayerYD + 0.0018f < 0.048f) { 
     PlayerYD += 0.0018f; 
    } 

    Player.center = CGPointMake(Player.center.x + PlayerXV, playerY); 
} 

- (IBAction)jumpPlayer:(id)sender 
{ 
    if(Player.center.y == 264) { 
     PlayerYD = 0; 
     PlayerYV = -2.25; 
     HoldingJump = true; 
    } 
} 

- (IBAction)stopJump:(id)sender 
{ 
    HoldingJump = false; 
} 

的代碼似乎工作(某些值需要一點罰款調整,但我還沒有得到這一點呢)。唯一的問題是,運動看起來有點不穩定(即使在真實的設備上),並且當玩家處於跳躍的頂部時,他們加速非常緩慢,並且我沒有看到任何值可以跳躍看起來像馬里奧遊戲一樣流暢。

請看看代碼,看看我是否失去了一些明顯的東西,或者是否有比NSTimer調用void函數更有效的控制運動的方法。另外,是否將UIImageView的位置設置爲float值不好?

謝謝。

回答

1

所以這裏有很多錯誤。首先,是的,你不應該將ImageView或任何其他UI元素的原點設置爲分數像素的座標位置。這會導致子像素模糊,從而使圖像模糊。爲了避免這種情況,所有的CGFloats應該使用roundf()或其他類似的舍入函數四捨五入到最接近的整數。

我能看到的另一個問題是,您正在設置Player.center。我希望爲了你的緣故,Player不是ImageView的原因,因爲你會讓你的生活變得更加艱難。如上所述,當框架的原點未設置爲圓形數字的CGFloat時,您將獲得子像素化。當您使用中心屬性時,您可能很容易導致自己遇到不良的原始值。例如,如果我有一個11乘11的圖像並將其中心設置爲(11,11),則原點將設置爲(5.5,5.5),並且會導致子像素化。簡單的方法來避免這種情況只是做數學正確放置原點,並確保將您饋入的CGFloats四捨五入(或者在設置之前在框架上使用CGRectIntegral)。

這裏的第三個問題是計時器被稱爲0.005秒。假設您希望這款遊戲以60 FPS運行。 60 FPS轉換爲大約0.0167秒。計時器經常三次調用該方法,即使您需要60 FPS也需要該方法,另外,經常調用此方法可能會導致一些不穩定的運動。

現在就獲得像「馬里奧」一樣的跳躍而言,你真正需要做的就是尋找一個專用的物理引擎,因爲如果你使用上面的代碼,你似乎沒有一個。物理引擎會做的是應用恆定的「引力」,這將有助於使玩家跳躍起來,看起來更加真實。當玩家按下一個按鈕時,你會對玩家角色施加衝動。衝動的使用也可以簡化你的工作,因爲你可以以不同的方式應用衝動,具體取決於他們持有按鈕的時間長短等。上面的代碼只是試圖解決這個問題,而不是解決你沒有一個真正的問題物理引擎。

去調查cocos2D和Box2D作爲一個可能的物理引擎,你可以使用。在cocos2D + Box2D上有大量資源,還有一位開發者甚至已經編寫了一個關於使用cocos2D創建超級馬里奧克隆的教程,該教程應該讓您對物理引擎的工作原理有一個基本的瞭解:http://www.raywenderlich.com/15230/how-to-make-a-platform-game-like-super-mario-brothers-part-1

+0

謝謝!使用這些信息,我能夠成功地停止對UIImageView的模糊效果,並通過爲定時器使用正確的值來使動作平滑!另外,感謝您使用物理引擎指針,但這不是必需的;我已經解決了我的問題,現在我的遊戲擁有完美的跳躍系統:) – CHRIS 2013-04-29 15:13:25