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

第39節 - LibGDX: Tiled (Bullet Class)

這一節我會介紹LibGDX遊戲的Bullet Class,我在第38節 - LibGDX: Tiled (Collision Detection)介紹過如何利用Tiled Map Editor造出碰撞效果,這一節會加入發射子彈的方法。

注意,發射子彈的程式有不同的方法,因為子彈也是類別的物件(instance),如果不斷發射子彈,就須要產生很多物件,浪費資源,有些人會選擇利用Object Pool方法產生子彈,我會在其他章節詳細介紹Object Pool的用法,現在我會介紹一個十分簡單的方法。

執行結果:

以下是LibGDX: Tiled (Bullet Class)程式執行的結果:


製作子彈(Bullet)圖片

LibGDX: Tiled (Bullet Class)
  1. 我們可以製作一張向右的子彈圖片(bulletRight.png),再傳入Texture物件(bulletRight)和製作一張向左的子彈圖片(bulletLeft.png),再傳入Texture物件(bulletLeft)。

    不過另一個方法是利用TextureRegion類別的flip()方法,把圖片反轉,這樣做可以減少記憶體資源,所以bulletLeft須要是TextureRegion類別的物件。

發射子彈的程式

1) Bullet.java程式

我們可以把以下Bullet.java的程式碼寫在MyDemo39.java內,不過這次我會建立一個獨立的Bullet.java類別,如下圖:

LibGDX: Tiled (Bullet Class)
  1. 首先在Bullet類別的Constructor內,把bulletPosition和bulletVelocityX傳入。

    bulletPosition就是主角hero1的子彈發射位置。

  2. 建立一個update()方法,把子彈的位置加上bulletVelocityX傳入的數值。

2) MyDemo39.java新加入部分

以下部分會列出在MyDemo39.java程式新加的部分,如下圖:

LibGDX: Tiled (Bullet Class)
  1. 建立一個ArrayList物件(bulletManager),它屬於bullet類,bulletManager主要用來儲存和去除bullet Array。

  2. 利用TextureRegion類別的flip()方法,把bullet圖片反轉,這樣做可以減少記憶體資源,所以bulletLeft須要是TextureRegion類別的物件。

  3. 當我們按下"F"鍵,如果主角hero1面向右,把+bulletVelocityX傳入,如果主角hero1面向左,把-bulletVelocityX傳入。

  4. 用while Loop執行bulletCounter由0至按下"F"鍵的數目,按下"F"鍵的數目 = bulletManager.size()。

  5. 把bullet用bulletManager.get()方法傳入currentBullet內。

  6. 執行currentBullet.update()方法,移動每一粒子彈。

  7. 偵測bullet是否在屏幕右面多100px和屏幕左面多100px內。

  8. 如果bullet是否在屏幕右面多100px和屏幕左面多100px內,顯示bullet在屏幕上。

  9. 否則,如果子彈飛出了屏幕右面多100px,就會用bulletManager.remove()方法去除bullet Array,同樣,如果子彈飛出了屏幕左面多100px,就會用bulletManager.remove()方法去除bullet Array。

  10. 當while Loop執行了一次後,把bulletCounter加上一,再執行一次,直至bulletCounter<bulletManager.size()。

3) ArrayList BulletManager

建立一個ArrayList物件(bulletManager),它屬於bullet類,bulletManager主要用來儲存和去除bullet Array,如下圖:

LibGDX: Tiled (Bullet Class)
  1. 建立一個ArrayList物件(bulletManager),它屬於bullet類。

  2. 每按一次"F"鍵,bulletManager.add()方法把bullet儲存。

  3. 因為bulletManager是屬於ArrayList物件,我們可以用bulletManager.size()來取得ArrayList的大小。

  4. 我們也可以用bulletManager.get()來取得指定的bullet。

4) Remove Bullet

因為bulletManager是屬於ArrayList物件,我們可以用bulletManager.remove()方法來去除指定的bullet,如下圖:

LibGDX: Tiled (Bullet Class)
  1. 把bulletCounter數值傳入bulletManager.remove()方法內。

  2. 第1粒bullet用bulletCounter=0代表。

  3. 如果子彈飛出了屏幕右面多100px,就會用bulletManager.remove()方法去除bullet Array,同樣,如果子彈飛出了屏幕左面多100px,就會用bulletManager.remove()方法去除bullet ArrayList的一格element。

  4. 注意,當ArrayList去除了一格element,ArrayList的element就會順延一格。

LibGDX程式

例子1 - 2D Platformer Game with Bullet Class

這個例子會用LibGDX示範Bullet Class:

DesktopLauncher.java

LibGDX: Tiled (Bullet Class)
  1. DesktopLauncher是PC Desktop的Starter Class,我們在DesktopLauncher內設定顯示的大小為1024 X 768 px。

LibGDX: Tiled (Bullet Class)
  1. 把甩bullet.png、hero1Atlas.pack和hero1Atlas.png儲存到Android的Assets文件夾內(/data/...)。

    把map.tmx和tileAtlas.png儲存到Android的Assets文件夾內(/map/...)。

Bullet.java

LibGDX: Tiled (Bullet Class)
  1. 首先在Bullet類別的Constructor內,把bulletPosition和bulletVelocityX傳入。

    bulletPosition就是主角hero1的子彈發射位置。

  2. 建立一個update()方法,把子彈的位置加上bulletVelocityX傳入的數值。

MyDemo39.java

LibGDX: Tiled (Bullet Class)
  1. 建立bulletRight、 bulletLeft、bullet、currentBullet和bulletManager變數(Variable)。

  2. 製作一張向右的子彈圖片(bullet.png),再傳入Texture物件(bulletRight)和利用TextureRegion類別的flip()方法,把圖片反轉,這樣做可以減少記憶體資源,所以bulletLeft須要是TextureRegion類別的物件。

  3. 用while Loop執行bulletCounter由0至按下"F"鍵的數目,按下"F"鍵的數目 = bulletManager.size()。

  4. 把bullet用bulletManager.get()方法傳入currentBullet內。

  5. 執行currentBullet.update()方法,移動每一粒子彈。

    偵測bullet是否在屏幕右面多100px和屏幕左面多100px內。

    如果bullet是否在屏幕右面多100px和屏幕左面多100px內,顯示bullet在屏幕上。

    否則,如果子彈飛出了屏幕右面多100px,就會用bulletManager.remove()方法去除bullet Array,同樣,如果子彈飛出了屏幕左面多100px,就會用bulletManager.remove()方法去除bullet Array。

    當while Loop執行了一次後,把bulletCounter加上一,再執行一次,直至bulletCounter<bulletManager.size()。
  6. 最後呼叫dispose()方法,執行batch.dispose();、hero1Atlas.dispose();、tiledMap.dispose(); 和bulletRight.dispose(); 釋放資源。

  7. 當我們按下"F"鍵,如果主角hero1面向右,把+bulletVelocityX傳入,如果主角hero1面向左,把-bulletVelocityX傳入。

執行程式:

LibGDX: Tiled (Bullet Class)

以下是LibGDX: Tiled (Bullet Class)程式執行的結果:


Download above code and sample pictures here!