2009-05-29 152 views
8

我在J2ME工作跳轉的數學,我有我的gameloop執行以下操作:在2D遊戲

public void run() { 
     Graphics g = this.getGraphics(); 
     while (running) { 
      long diff = System.currentTimeMillis() - lastLoop; 
      lastLoop = System.currentTimeMillis(); 
      input(); 
      this.level.doLogic(); 
      render(g, diff); 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       stop(e); 
      } 
     } 
    } 

所以它只是一個基本的gameloop,該doLogic()功能適用於所有的邏輯功能調用在場景中的人物和render(g, diff)通話場景的每一個字符,這之後的animateChar功能,Character類的animChar功能設置在屏幕的一切,因爲這:

protected void animChar(long diff) { 
     this.checkGravity(); 
     this.move((int) ((diff * this.dx)/1000), (int) ((diff * this.dy)/1000)); 
     if (this.acumFrame > this.framerate) { 
      this.nextFrame(); 
      this.acumFrame = 0; 
     } else { 
      this.acumFrame += diff; 
     } 
    } 

這保證了我牛逼一切都必須根據機器從週期到週期的時間移動(記住它是一部手機,而不是遊戲裝備)。我確定這不是實現這種行爲的最有效的方法,所以我完全公開批評我的編程技巧的評論,但在這裏我的問題:當我讓我跳字,我做的是我把他dy爲負值,例如-200,我設置布爾爲真,這使得角色上升,然後我有這個函數checkGravity(),確保上升的所有東西都必須下降,checkGravity還檢查字符被過度的平臺,所以我將剝離下來一點了你的時間緣故:

public void checkGravity() { 
     if (this.jumping) { 
      this.jumpSpeed += 10; 
      if (this.jumpSpeed > 0) { 
       this.jumping = false; 
       this.falling = true; 
      } 
      this.dy = this.jumpSpeed; 
     } 
     if (this.falling) { 
      this.jumpSpeed += 10; 
      if (this.jumpSpeed > 200) this.jumpSpeed = 200; 
      this.dy = this.jumpSpeed; 
      if (this.collidesWithPlatform()) { 
       this.falling = false; 
       this.standing = true; 
       this.jumping = false; 
       this.jumpSpeed = 0; 
       this.dy = this.jumpSpeed; 
      } 
     } 
    } 

所以,問題是,這個功能更新DY不管diff,使得人物在慢速機器中像超人一樣飛行,我不知道如何實現因素,以便當角色跳躍時,他的速度按照與遊戲速度成比例的方式遞減。任何人都可以幫我解決這個問題嗎?或者給我指點一下在J2ME中做出一個2D跳轉的正確方式

+0

這是一個長期的問題。你可能想把精髓拉出來。 – 2009-05-29 00:11:22

+0

作爲一個側面的問題 - 你真的想在J2ME遊戲中做100次/秒嗎?正如我想的那樣,你應該真的睡到下一個理想的起牀點,而不是每次固定的時間。 – 2009-05-29 02:02:59

回答

5

您不應該根據經過時間調整jumpSpeed嗎?也就是說,也許速度改變-75 /秒,所以你的差異應該是應用於jumpSpeed的變化量的權重。所以傳入diff到checkGrav並做類似... jumpSpeed + =(diff *(rate_per_second))/ 1000;

(以毫秒爲單位假設DIFF)

(理想情況下,這將使它就像真正的比重:d)

3

爲什麼不只是通過比較來縮放所有常量?

順便說一句,我很尷尬地說這個,但是我在一個商業遊戲上工作,在這個遊戲中,人物的重力會隨着上升而下降兩倍。出於某種原因,人們更喜歡這一點。

+0

我的贊成是基於你不只是做出來的理解。 – 2009-05-29 00:34:21

+0

哈哈。你的懷疑是令人欽佩的。這款遊戲是SegaCD的「保鏢」。基於「籃球Sam&Ed」這是我爲Commodore 64編寫的COMPUTE!'s Gazette遊戲。 – Nosredna 2009-05-29 00:39:08

0

這似乎是更多關於遊戲設計不是跳躍的數學問題。在不同處理器上運行的遊戲中,一個常見問題是一個遊戲執行速度更快,而其他遊戲執行速度更慢(從而改變整個遊戲速度)。我不確定遊戲中常見的做法是什麼,但是每當我製作家庭釀造的2D遊戲時(他們很有趣),我會有一個遊戲刻度的概念。在更快的機器上

long diff = System.currentTimeMillis() - lastLoop; 
lastLoop = System.currentTimeMillis(); 

會更低。等待時間將從差異中獲得,以便遊戲在大多數機器上以相同的速度運行。我也將渲染方法放在單獨的線程中,以便遊戲速度不依賴於圖形。

0

我可以給出這樣一個公式(我到處使用它)。 X是從零開始到跳躍長度結束的參數。 如果你想讓某人在某個高度(H)和某個長度(L)跳躍,那麼跳躍的功能將如下所示(並且它不會看起來不一樣):

y =負(功率(x - 跳躍長度除以2)乘以4和 乘以跳躍高度)除以長度的冪並加上 最後跳躍的高度。

Y = - (XL/2)(XL/2)* 4 * H /(L * 1)+ H

如果你想跳對象的土地上的東西,那麼你就可以檢查每個新的X,如果它大致站立在平臺上,並且它站在某個平臺上,那麼不要讓它停下來,使它的Y位置與平臺的Y位置完全相同。

如果您使用的是Flash或其他反轉y軸的基底,則將函數輸出乘以-1;