Major Softwares

  INDEX PAGE

  1. 簡介
  2. Java, Android和LibGDX好書推介
  3. Java, Android和LibGDX要學的知識
  4. 用Windows寫Java程式
  5. 用Eclipse寫Java程式
  6. 用Eclipse寫Android程式
  7. 用Eclipse寫LibGDX程式
  8. Standard Java Naming Conventions
  9. System.out.println()的用法和意思
  10. Where is main() method in Android?

LibGDX - Splash & Menu Screen

  1. LibGDX: World, Texture, Background, Camera, Viewport, Screen & OpenGL
  2. LibGDX: Texture, TextureRegion, SpriteBatch & Sprite
  3. UML(Unified Modeling Language): Class Diagram
  4. Type Casting, Upcasting & Downcasting
  5. @Override的用法和意思
  6. LibGDX: Scene2d & Graphical User Interface(GUI)
  7. LibGDX: Splash Screen
  8. LibGDX: Texture Packer
  9. LibGDX: BitmapFonts, JSON & Skin
  10. Android: R.java File
  11. Android: onClick事件的5種實現方式
  12. LibGDX: Game Menu Screen
  13. LibGDX: Advanced Game Menu Screen (using Abstract Screen)
  14. LibGDX: Disposable Interface
  15. Java & LibGDX: super keyword
  16. LibGDX: Advanced Game Menu Screen (using AssetManager)
  17. Java: Array, Arrays, List, ArrayList & LibGDX: Array
  18. LibGDX: File I/O (Preferences)
  19. LibGDX: Game Level Selection Screen
  20. LibGDX: Advanced Game Level Selection Screen (using AssetManager)

LibGDX - Tiled 2D Platform Game

  1. LibGDX: Lifecylce (Render() Method)
  2. LibGDX: Delta Time
  3. LibGDX: Animation & Spritesheet
  4. LibGDX: Keyboard, Mouse & Touch Screen Control
  5. Input Control (Polling VS Event Driven Input)
  6. LibGDX: Tiled (Background and Foreground)
  7. LibGDX: Jumping Action
  8. LibGDX: Tiled (Collision Detection)
  9. LibGDX: Tiled (Bullet Class)
  10. LibGDX: Audio (Sound & Music)
  11. LibGDX: Tiled (Scrollable Background with Camera & HUD)
  12. LibGDX: WorldController & WorldRenderer Class

LibGDX/Java - Card Game No.1 - Blackjack

  1. LibGDX: Install & Setup Android Studio IDE
  2. LibGDX: Use Android Studio to Run Java Hello World
  3. LibGDX: Use Android Studio to Run LibGDX Hello World
  4. Adobe Illustrator: Basic Components Part 1
  5. Adobe Illustrator: Basic Components Part 2
  6. Adobe Illustrator: BlackJack Table & Cards
  7. LibGDX: Blackjack Animation
  8. LibGDX: Interpolation
  9. Java: toString() Method
  10. Java: Blackjack Shuffle Methods
  11. LibGDX: Blackjack Shuffle Method
  12. Java: Blackjack Card Game

LibGDX - Others

  1. Making and Displaying App Icon
  2. LibGDX: Displaying Traditional and Simplified Chinese Characters
  3. LibGDX: Handling Different Screen Resolutions

Unity Game Engine & C#

  1. Visual Studio: C# Hello World
  2. Unity: C# Hello World
  3. Unity: Handling Different Screen Resolutions
  4. Unity: Life Cycle
  5. Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  6. Unity: Splash Screen
  7. Unity: Fonts, Traditional and Simplified Chinese Characters
  8. Unity: GameObject, Class Object, new & Instantiate
  9. Unity: Start Screen with Glowing Animated Button
  10. Unity: C# Get & Set Modifier
  11. Unity: Delegates & Events
  12. Unity: File I/O, Read & Write Text File & PlayerPrefs
  13. Unity: Game Level Selection Screen
  14. Unity: Game Menu Screen & ScreenManager
  15. Unity: Encrypt and Decrypt Text File
  16. Unity: Options Menu Screen
  17. Unity: Convert Numbers Image to Custom Font

Unity - Card Game No.1 - Blackjack

  1. Unity: Blackjack Card Game - Part 1 (Full Game)
  2. Unity: Blackjack Card Game - Part 2
  3. Unity: Blackjack Card Game - Part 3
  4. Unity: Blackjack Card Game - Part 4
  5. Unity: Blackjack Card Game - Part 5
  6. Unity: Blackjack Card Game - Part 6
  7. Unity: Blackjack Card Game - Part 7

以下是預告-Coming soon!


Secret Weapon No.1

  1. Unity: Card Game No.2

Advanced Programming

  1. Unity: GPS Programming
  2. Unity: User Login System
  3. Unity: Augmented Reality (AR)

Secret Weapon No.2

  1. Unity: GPS & AR Application

第31節 - LibGDX: Lifecycle (Render() Method)

這一節我會介紹LibGDX生命週期(Lifecycle)的一個主要部分 - Render()方法。

Android和LibGDX都有自己的生命週期,因為如果我們在Android手機上運行LibGDX遊戲程式,Android的生命週期就用來控制手機的不同狀態,例如正常執行手機程式、換頁、按HOME鍵、接電話等等,而LibGDX的生命週期就用來控制遊戲的不同狀態,例如正常執行遊戲程式(create)、改變屏幕尺寸(resize)、渲染(render)、暫停(pause)、恢復(resume)和清理(dispose)。

Android和LibGDX生命週期的比較。

以下是Android和LibGDX生命週期的比較:

LibGDX Lifecycle Render() method

Android Lifecycle

Android有幾個特殊的callback methods來處理對應的Activity的狀態,Activity的狀態處理method有以下幾種:

  1. onCreate()
  2. onStart()
  3. onPause()
  4. onResume()
  5. onRestart()
  6. onDestroy()
LibGDX Lifecycle Render() method

1) 當Activity正常執行時,會先進入onCreate() -> onStart() -> onResume()。

LibGDX Lifecycle Render() method

2) 當按下手機HOME按鈕時,會進入onPause() -> onStop()。

LibGDX Lifecycle Render() method

3) 當先前已經按過HOME鈕,再次點APP,會進入到 onRestart() -> onStart() -> onResume()。

LibGDX Lifecycle Render() method

4) 當先前換頁,再按下返回鈕,也會進入到 onRestart() -> onStart() -> onResume()。

LibGDX Lifecycle Render() method

5) 當先前按下返回鈕,再點APP,則會再進入到 onCreate() -> onStart() -> onResume()。

LibGDX Lifecycle Render() method

6) 當Activity結束時,會進入onPause -> onStop() -> onDestroy(),釋放資源。

LibGDX Lifecycle Render() method

LibGDX Lifecycle

Libgdx擁有自己的生命週期,它管理應用的各個狀態,例如,正常執行遊戲程式(create)、改變屏幕尺寸(resize)、渲染(render)、暫停(pause)、恢復(resume)和清理(dispose):

  1. create()
  2. resize()
  3. render()
  4. pasue()
  5. resume()
  6. dispose()
LibGDX Lifecycle Render() method

1) 當遊戲正常執行時,會先進入create() -> resize() -> render()。

注意,render()方法會不斷循環,一秒30至80次(通常60 Frame per Second, FPS),根據手機硬件速度而正。

LibGDX Lifecycle Render() method

2) 當按HOME鍵或接電話時,會先進入pause()。

LibGDX Lifecycle Render() method

3) 當回復遊戲時,會進入pause() -> resume()。

LibGDX Lifecycle Render() method

4) 當遊戲畫面結束時,會進入pause() -> dispose(),釋放資源。

LibGDX Lifecycle Render() method

為甚麼要學LibGDX的Render()方法?

在遊戲執行時,Render()方法會不斷循環執行,一秒30至80次(通常60 Frame per Second, FPS),根據手機硬件速度而正,Render()方法用來渲染(render)遊戲。而遊戲的邏輯通常也會放在這個方法裡執行。

我們就可以用Render()方法不斷循環執行的特性,不斷更新畫面的圖片,這樣做就可以做出動畫效果,我會在下一部分加以說明。

例子1 - 生命週期和Render()方法執行次數

LibGDX Lifecycle Render() method
  1. 建立一個deltaTime變數 (float type)。

  2. 如果create()方法有被呼叫,在系統上顯示出來。

  3. 如果resize()方法有被呼叫,在系統上顯示出來。

  4. Render()方法會不斷循環執行,一秒30至80次(通常60 Frame per Second, FPS),根據手機硬件速度而正,Render()方法用來渲染(render)遊戲。

    Gdx.graphics.getDeltaTime()方法敢得 兩格(two frames)動畫之間的時間,再傳入deltaTime變數內。

  5. 如果pause()方法有被呼叫,在系統上顯示出來。

  6. 如果resume()方法有被呼叫,在系統上顯示出來。

  7. 如果dispose()方法有被呼叫,在系統上顯示出來。

執行結果:

LibGDX Lifecycle Render() method
  1. 首先create()方法會被呼叫一次。

  2. 再被呼resize()方法,如果屏幕尸吋有改變就會在這樣執行。

  3. Render()方法會不斷循環執行,1/60 = 0.01667s(大約 60 Frame per Second, FPS)。

  4. 程式結束前會呼叫pause()方法。

  5. 最後呼叫dispose()方法,釋放資源。

例子2 - 簡單動畫

LibGDX Lifecycle Render() method
  1. 建立一個xPosition變數 (float type)。

  2. 在create()方法內設定開始時xPosition的值為(-1920/2),則是屏幕寬度的一半。

  3. 在Render()方法內設定sprite的位置。

  4. xPosition = xPosition + 5; 是大部分程式的一種最簡單寫法,把現時xPosition的值加上5,再傳入給新的xPosition。

  5. 最後別忘記把在dispose()方法內輸入batch.dispose();和hero1.dispose();,釋放資源。

執行結果:

LibGDX Lifecycle Render() method
  1. hero1圖片就會已大約60FPS向右移動。

注意

以上例子2是一個簡單的動畫程式,它把hero1圖片由左至右移動,但這個例子有一個很大的缺點,就是動畫的速度會根據手機硬件速度而正。

如果你的手機是新型號,Render()方法會已大約一秒60次(60FPS)執行,每次加5px,則是一秒後向右移動了60x5=300px。

如果你的手機是舊型號,Render()方法會已大約一秒30次(30FPS)執行,每次加5px,則是一秒後向右移動了30x5=15px,則是比60FPS行慢了一半。

主要部分如下:

LibGDX Lifecycle Render() method
  1. xPosition = xPosition + 5;是不依靠時間的(Time independent),所以動畫的速度會根據手機硬件速度而正。

要解決以上速度問題,我們可以用LibGDX的Gdx.graphics.getDeltaTime(),它可以敢得兩格(two frames)動畫之間的時間,用來控制動畫的速度,我會在下一節詳細介紹。

主要部分如下:

LibGDX Lifecycle Render() method
  1. xPosition = xPosition + (150*deltaTime); 是依靠時間的(Time dependent),deltaTime在60FPS會是30FPS的一半,所以動畫的速度不會受手機硬件速度影響。

    60FPS - 150 x 0.01667s x 60次 = 150。

    30FPS - 150 x 0.03333s x 30次 = 150。

    結果相同!

以下是LibGDX: Lifecycle (Render() Method)程式執行的動畫:


Download above code and sample pictures here!