第37節 - LibGDX: Jumping Action
這一節我會介紹用LibGDX的Jumping Action,我在第35節 - LibGDX: Input Control (Polling VS Event Driven Input)介紹過主角圖片(hero1)左右移動的程式設計,這一節會加入跳躍動作(Jumping Action)。
一個2D Platformer Game主要包括以下移動部分(新增跳躍動作):
- Standing Left
- Standing Right
- Walking Left
- Walking Right
- Jumping Up & Facing Right (including Falling Down)
- Jumping Up & Facing Left (including Falling Down)
- Jumping Left (including Falling Down)
- Jumping Right (including Falling Down)
Movement Summary
以下是所有動作的可能性(新增跳躍動作):
注意,我會把Falling動作包括在Jumping動作內,只要在空氣中(Jumping或Falling)都叫Jumping。
製作Spritesheet
- 我在第18節 - LibGDX: Texture Packer介紹過如何用Texture Packer軟件把不同的圖片(.png)合併成一張sprite sheet。以上用了八張簡單圖片做出Standing,Walking和Jumping動作。
Jumping Computational Equation
以下是我們須要用到的Jumping電腦方程式,這條方程式可以用來模擬拋物線動作(Projectile Motion):
- 注意,以上電腦方程式1和2是相同意思,我會在LibGDX內用第2條方程式。
例子1 - deltaTime = 0
- 當 deltaTime = 0,velocity = 300 - (300 x 0) = 300。
例子1 - deltaTime = 1
- 當 deltaTime = 1,velocity = 300 - (300 x 1) = 0。
例子1 - deltaTime = 2
- 當 deltaTime = 2,300 - (300 x 2) = -300。
Terminal Veolocity(終端速度)
Terminal Veolocity(終端速度)就是在流體動力學中,當物體在流體中運動時,在流體向物體運動反方向所施的力下,物體的運動速度因而不變,這時物體所移動的速度就是終端速度,如下圖:
要在電腦方程式上模擬Terminal Veolocity,可以用以下簡單方法:
- 當velocity小於-300,我們把velocity的數值設定為-300,這樣做就可以模擬Terminal Veolocity。
例子1 - 遊戲開始階段 (Falling to Standing)
遊戲開始時,主角(hero1)會由天空降落地面:
狀態1(Falling):
我會把Falling動作包括在Jumping動作內,只要在空氣中(Jumping或Falling)都叫Jumping, 則state = Stage.Jumping;。
Sprite的座標系統是左X上Y,(0,0)在屏幕的左下角。
狀態2(Standing):
當主角(hero1)由天空降落地面後,座標Y是3格tiles,則32x3 = 96。
例子2 - Walking Right
以下是主角(hero1)向右移動的狀態:
狀態1(Standing Right):
當主角(hero1)向右移動時,State.Standing轉為State.Walking。
狀態2(Walking Right):
當主角(hero1)向右移動時,position.x = position.x + (velocity.x*deltaTime)。
例子3 - Walking Left
以下是主角(hero1)向左移動的狀態:
狀態1(Standing Left):
向左移動時,isFacingRight = false,則面向左。
狀態2(Walking Left):
向左移動時,velocity=-300,position.x = position.x + (velocity.x*deltaTime)。
例子4 - Jumping Up & Facing Right
以下是主角(hero1)向上跳躍的狀態:
狀態1(Jumping Up & Facing Right):
當主角(hero1)向上跳躍時,State.Standing轉為State.Jumping。
還有,canJumpAnd Walk = ture,則主角(hero1)在空中時,他可以向左右移動。
另外,要把Jumping模擬拋物線動作(Projectile Motion),可用以下程式:
velocity.y = velocity.y - (velocityMax*deltaTime),或者
velocity.y -=(velocityMax*deltaTime)
狀態2(Top Position & Facing Right):
當主角(hero1)跳到最高點時,velocity.y = 0。
狀態3(Falling Down & Facing Right):
當主角(hero1)降落地面時,velocity.y = -300。
例子5 - Standing Right & Jumping Right or Walking Right & Jumping Right
以下是主角(hero1)向右Standing並向右跳躍,或是向右Walking再向右跳躍:
注意1,向右Standing並向右跳躍,可以同時按下"Space"和"->"鍵。
注意2,向右Walking再向右跳躍,可以按下"->"鍵,再按下"Space"鍵。
狀態1(Jumping Up & Facing Right):
當主角(hero1)向上跳躍時,State.Standing轉為State.Jumping。
還有,canJumpAnd Walk = ture,則主角(hero1)在空中時,他可以向左右移動。
另外,要把Jumping模擬拋物線動作(Projectile Motion),可用以下程式:
velocity.y = velocity.y - (velocityMax*deltaTime),或者
velocity.y -=(velocityMax*deltaTime)
狀態2(Top Position & Facing Right):
當主角(hero1)跳到最高點時,velocity.y = 0。
狀態3(Falling Down & Facing Right):
當主角(hero1)降落地面時,velocity.y = -300。
LibGDX程式
例子1 - Movement & Jumping Action (with Tiled Map Background & Foreground)
這個例子會用LibGDX示範向右移動和跳躍的動作:
DesktopLauncher.java
- DesktopLauncher是PC Desktop的Starter Class,我們在DesktopLauncher內設定顯示的大小為1024 X 768 px。
- 把hero1Atlas.pack和hero1Atlas.png儲存到Android的Assets文件夾內(/data/...)。
- 把map.tmx和tileAtlas.png儲存到Android的Assets文件夾內(/map/...)。
MyDemo37_1.java
- 建立State (enum type)。
- 建立變數(Variable)。
- 建立新的Jumping Right和Jumping Left動作。
- 設定State.Standing動作。
- 設定State.Walking動作。
- 設定State.Jumping動作。
- 設定Teminal Velocity。
- 當主角(hero1)由天空降落地面後,座標Y是3格tiles,則32x3 = 96。
- 建立KeyDown()方法的程式碼,這個方法就是供給Keyboard使用,當Keys.Left按下時,主角(hero1)向左移動,State.Standing轉為State.Walking,再設定其他Variables。
- 當Keys.Right按下時,主角(hero1)向右移動,State.Standing轉為State.Walking,再設定其他Variables。
- 當企立時按Keys.Space (Keys.SPACE, State.Standing)或移動時同時按Keys.Space (Keys.SPACE, State.Walking),主角(hero1)便會向左右跳躍,再設定其他Variables。
- 當keyUp()時,State.Walking轉為State.Standing,主角(hero1)就會企立。
- 建立touchDown()方法的程式碼,這個方法可以供給Mouse或Touch Screen使用,將屏幕的下半部分分成左右兩部分,左下半部分主角(hero1)向左移動,State.Standing轉為State.Walking,再設定其他Variables。
- 將屏幕的下半部分分成左右兩部分,右下半部分主角(hero1)向右移動,State.Standing轉為State.Walking,再設定其他Variables。
- 將屏幕的上半部分分成左中右三部分,中心上部分主角(hero1)向上跳躍,State.Standing轉為State.Jumping,再設定其他Variables。
- 將屏幕的上半部分分成左中右三部分,左上角部分主角(hero1)向左跳躍,State.Standing轉為State.Jumping,再設定其他Variables。
- 將屏幕的上半部分分成左中右三部分,右上角部分主角(hero1)向右跳躍,State.Standing轉為State.Jumping,再設定其他Variables。
- 當touchUp()時,State.Walking轉為State.Standing,主角(hero1)就會企立。
Mouse Control & Touch Screen Control
以下對Mouse Control和Touch Screen Control作補充:
- 將屏幕的下半部分分成左右兩部分,右下半部分主角(hero1)向右移動,State.Standing轉為State.Walking,再設定其他Variables。
- 將屏幕的上半部分分成左中右三部分,中心上部分主角(hero1)向上跳躍,State.Standing轉為State.Jumping,再設定其他Variables。
- 將屏幕的上半部分分成左中右三部分,左上角部分主角(hero1)向左跳躍,State.Standing轉為State.Jumping,再設定其他Variables。
- 將屏幕的上半部分分成左中右三部分,右上角部分主角(hero1)向右跳躍,State.Standing轉為State.Jumping,再設定其他Variables。
- 當touchUp()時,State.Walking轉為State.Standing,主角(hero1)就會企立。