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

第15節 - @Override的用法和意思

這一節我會介紹@Override Annotation,@Override是Java的特殊功能,稱為Annotation,Annotation是給編譯器(Compiler)看的提示。

因為Java是一種物件導向程式語言,只要一個子類別(Child)繼承(extends)父類別(Parent),父類別和子類別就有一個@Override的關係。

@Override就是告訴編譯器以下子類別的方法是和父類別的方法(串法)完全一樣(e.g. create()),但子類別想要重新定義內容,請幫忙確定一下子類別的方法(串法)是否和父類別的方法完全一樣,如果不一樣就會發出錯誤信息。

簡單來說,@Override就有檢查子類別方法的串法和父類別方法的串法是否一樣的功能。

注意,如果我們沒有打錯子類別的方法,@Override不是必須的,不過見意大家習慣去用@Override。

@override

以上就是LibGDX預設的第一個程式。

  1. 子類別(MyDemo15)的create()方法要重新定義,@Override就是檢查MyDemo15的create()方法是否和父類別(ApplicationAdapter)的create()方法完全一樣。

  2. 子類別(MyDemo15)的render()方法要重新定義,@Override就是檢查MyDemo15的render()方法是否和父類別(ApplicationAdapter)的render()方法完全一樣。

注意,小寫create()和大寫Create()是不同的,如果串錯大寫Create(),@Override會發出錯誤信息。

例子1 - 用我們第一個MyDemo15 Class繼承ApplicationAdapter abstract Class

當我們建立第一個LibGDX的Class,例如:MyDemo15,LibGDX預設把MyDemo15繼承ApplicationAdapter,而ApplicationAdapter 實作(implements) ApplicationListener介面,如下圖:

@override
  1. ApplicationAdapter implements ApplicationListener

  2. MyDemo15 extends ApplicationAdapter

LibGDX官方文件 - ApplicationAdapter.java Class

@override
  1. 在LibGDX官方文件ApplicationAdapter.java內可以看到ApplicationAdapter實作ApplicatonListener interface。

  2. 用ApplicationAdapter的原因是ApplicationAdapter內已經把所有ApplicationListener內的抽象方法定義了內容。

    ApplicationListener內的public void create(); 就是抽象方法,則是內容沒有{......}的。
    ApplicationAdapter內的public void create(){ }; 就是定義了內容方法,則是內容有{......}的。

    注意,就算{ }內是空白沒有內容,只要有{ }就代表定義了內容方法。

LibGDX官方文件 - ApplicationListener.java interface

@override
  1. ApplicationListener是一個介面(interface)。

  2. ApplicationListener內的所有方法都是抽象方法,例如: public void create(); 就是抽象方法,則是內容沒有{......}的。

LibGDX - 我們的第一個程式MyDemo15.java Class

@override
  1. 因為create()已經在ApplicationAdapter內定義了內容,create()在MyDemo15內可以覆寫或不覆寫。

  2. 和create()一樣,因為render()已經在ApplicationAdapter內定義了內容,render()在MyDemo15內可以覆寫或不覆寫。

ApplicationAdapter, ApplicationListener和MyDemo15的方法(method)運用和比較

以下就把ApplicationAdapter, ApplicationListener和MyDemo15的方法(method)作比較:

@override
  1. ApplicationListener是一個interface,所有方法必須是抽象方法,則是內容沒有{......}的。

  2. ApplicationAdapter是一個abstract class,它已經把所有方法定義了內容,則是內容有{......}的,其後繼承它的類別就可以覆寫或不覆寫。
    注意,如果在abstract class內還沒有定義內容,其後繼承它的類別就必須覆寫方法。

  3. MyDemo15是一個類別,所有方法可以覆寫或不覆寫,以上例子就只覆寫了create()和render()方法。

    注意,如果在abstract class內還沒有定義內容,其後繼承它的類別就必須覆寫方法,詳細介紹請看例子3。

例子2 - 用我們第一個MyDemo15 Class直接實作ApplicationListener interface

假設我們不用ApplicationAdapter,而把MyDemo15 Class直接實作ApplicationListener interface,看看和例子1有甚麼分別,如下圖:

@override
  1. 把MyDemo15 Class直接實作ApplicationListener interface。

LibGDX官方文件 - ApplicationListener.java interface

@override
  1. ApplicationListener是一個介面(interface)。

  2. ApplicationListener內的所有方法都是抽象方法,例如: public void create(); 就是抽象方法,則是內容沒有{......}的。

LibGDX - 我們的第一個程式MyDemo15.java Class

@override
  1. 把MyDemo15 Class直接實作ApplicationListener interface。

  2. 因為MyDemo15是一個Class (不是abstract class),所以實作ApplicationListener interface後必須把所有方法定義了內容,則是內容有{......}的。

    注意,就算{ }內是空白沒有內容,只要有{ }就代表定義了內容方法。

ApplicationListener和MyDemo15的方法(method)運用和比較

以下就把ApplicationListener和MyDemo15的方法(method)作比較:

@override
  1. ApplicationListener是一個interface,所有方法必須是抽象方法,則是內容沒有{......}的。

  2. 因為MyDemo15是一個Class (不是abstract class),所以實作ApplicationListener interface後必須把所有方法定義了內容,則是內容有{......}的。

例子3 - 用我們第一個MyDemo15 Class繼承Game Class

例子3就是我們會用來寫LibGDX遊戲程式的種類,把我們的MyDemo15繼承LibGDX的Game類別,再把Game類別實作(implements) ApplicationListener介面,如下圖:

@override
  1. 我們會用到LibGDX的Game類別,這是因為Game類別內有一個setScreen()方法,它可以用來轉換畫面,例如在第17節 - LibGDX: Splash Screen用來做過埸畫面。

  2. 再把Game類別實作(implements) ApplicationListener介面。

LibGDX官方文件 - Game.java abstract class

@override
  1. 在LibGDX官方文件Game.java內可以看到Game實作ApplicatonListener interface。

  2. 除了create()方法尚未定義了內容外,其他所有方法已經定義了內容。

    注意,要做到有些方法定義了內容,有些方法不定義內容(例如: create()方法),我們必須用abstract class

    還有,就因為create()方法尚未在Game內定義內容,我們必須在MyDemo15類別內定義內容。

LibGDX官方文件 - ApplicationListener.java interface

@override
  1. ApplicationListener是一個介面(interface)。

  2. ApplicationListener內的所有方法都是抽象方法,例如: public void create(); 就是抽象方法,則是內容沒有{......}的。

如果在MyDemo15 Class內沒有實作create()方法

@override
  1. 把MyDemo15 Class繼承Game abstract Class。

    固意不定義create()方法的內容,就會發出錯誤信息。

如果在MyDemo15 Class實作create()方法

@override
  1. 把MyDemo15 Class繼承Game abstract Class。

  2. 這次定義create()方法的內容,錯誤信息就會消失。

  3. 注意,因為所有resize(), render(), pause(), resume()和dispose()在Game類別內都定義了內容,除了在MyDemo15類別內覆寫這些方法外,我們必須在resize(), render(), pause(), resume()和dispose()方法內執行"super",例如:super.render();就是執行父類的render()方法(則game.render();),這樣做就能夠確保Game類別內定立的方法在MyDemo15類別內也有執行。

    雖然現在沒有把"super"放在MyDemo15類別內也不會出現錯誤信息,但將來執行程式時就有機會出現錯誤,尤其是如果我們在將來用到callbacks (則pause, resume等等)。

ApplicationListener,Game和MyDemo15的方法(method)運用和比較

以下就把ApplicationListener,Game和MyDemo15的方法(method)作比較:

@override
  1. ApplicationListener是一個interface,所有方法必須是抽象方法,則是內容沒有{......}的,所以create()尚未定義。

    在Game abstract class內create()也未定義內容,所以在MyDemo15 class內必須定義內容。

  2. 在Game abstract class內resize(), render(), pause(), resume()和dispose()已經定義了內容,所以在MyDemo15 class內可以覆寫或不覆寫,以上例子就覆寫所有resize(), render(), pause(), resume()和dispose()方法。

  3. 最後,我們用MyDemo15 class 繼承Game abstract class是因為Game內有兩個新方法:

    setScreen(Screen screen);
    getScreen(Screen screen);


    setScreen()方法可以用來轉換畫面,例如在第17節 - LibGDX: Splash Screen我們會介紹過埸畫面(Splash Screen)的做法。