Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 2 của 2
  1. #1

    [AndEngine] Lesson 0: Bước đầu lập trình Game Android sử dụng AndEngine

    Hi các bạn,
    Đã lâu rồi mình không ra tut nào, nay có chút thời gian nên muốn chia sẻ với các bạn đã và đang tìm hiểu về lập trình Java Android, cũng mới tìm hiểu về lập trình Game sử dụng AndEngine như mình. [IMG]images/smilies/smile.png[/IMG]
    Mình mới chỉ tìm hiểu thôi, nên đi trước các bạn chưa tìm hiểu thì nay mình chia sẻ một chút thông tin về các bước cài đặt cũng như code demo để cho ra cái Hello World sử dụng AndEngine GL 2.
    Trước tiên thì phải biết AndEngine là gì chứ nhỉ? Nếu search trên google thì sẽ ra cả một đống chi tiết và cụ thể, mình chỉ tóm gọn nó trong 1 câu : "Thư viện lập trình Game cho Android" - Do lập trình viên Nicolas Gramlich viết nên.
    Điều kiện phải có để bắt đầu là : Bạn phải là người đã làm quen với họ hàng nhà Android SDK. Tức là bạn đã biết tạo project cũng như nắm bắt cơ bản Android.
    Nếu như chưa biết về nó, thì bạn phải download và cài đặt nó tại link sau: http://developer.android.com..
    Android SDK sử dụng IDE là Eclipses để phát triển, khuyến khích dùng.

    Vậy các thành phần cơ bản để cài đặt sẽ là:
    • Android SDK Android SDK Platform Components through 4.0 Android SDK Tools, r14 ADT Plugins for Eclipse 14.0.0 Eclipse Helios (the version recommended for this version of the SDK) Oracle/Sun Java Development Kit (JDK 6, also called JDK 1.6)


    Nếu như bạn không có devices ( Máy điện thoại Android thật) để tét ứng dụng thì hãy tạo máy ảo tương tự như sau để build ứng dụng lên đó.
    • HTC EVO smartphone: Name: EVO Target: Android 2.2 (API level 8) Skin: HVGA SD Card: 128M SdCard: yes Accelerometer: yes LCD.density: 160 AudioOutput: yes Camera: no (Không hỗ trợ cho máy ảo Android) Battery: yes


    Sau khi đã cài đặt các phần trên, chúng ta sẽ download và tích hợp thư viện lập trình Game AndEngine.
    Các thông tin chính cần biết là:
    Website về AndEngine:
    • Source code thư viện AndEngine: http://github.comicolasgramlich/AndEngine Source code ví dụ: http://code.google.com/p/andengineexamples/ AndEngine forum: http://www.andengine.org/forums/ AndEngine wiki: http://wiki.andengine.org/AndEngine


    Sau khi download thư viện AndEngine, các bạn được file như: AndEngine-GLES2.zip. Giải nén tệp tin đó để chút nữa import project dạng lib này vào.
    Tạo mới project Android tên là gì tùy các bạn, mình đặt là AndEngineLesson0.
    Copy project dạng library AndEngine vào cùng thư dự án với AndEngineLesson0, rồi import nó vào trong Eclipse.
    Chú ý: Nếu các bạn không copy vào thì sẽ gặp lỗi là khi chỉnh propertice, add library là AndEngine trong AndEngineLesson0 thì nó không nhận. @@ ( Mò mãi mới hiểu).
    Sẽ như sau.


    Chỉnh propertice của AndEngineLesson2, tag Android add library là AndEngine. Hình dưới.


    Giờ thì ta sẽ bắt đầu code chương trình HelloWorld với AndEngine nào. @@
    Trong project AndEngineLesson0, bạn sửa code của class MainActivity.java như sau:

    Mã:
    package com.vinilearning.andengine.lesson0; import org.andengine.engine.camera.Camera;import org.andengine.engine.options.EngineOptions;import org.andengine.engine.options.ScreenOrientation;import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;import org.andengine.entity.scene.Scene;import org.andengine.entity.scene.background.Background;import org.andengine.opengl.font.Font;import org.andengine.opengl.font.FontFactory;import org.andengine.ui.activity.SimpleBaseGameActivity; import android.graphics.Typeface; public class MainActivity extends SimpleBaseGameActivity {    static final int    CAMERA_WIDTH    = 800;    static final int    CAMERA_HEIGHT   = 480;    public Font         mFont;    public Camera       mCamera;     @Override    public EngineOptions onCreateEngineOptions() {        mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);         return new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR,                new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);    }       @Override    protected void onCreateResources() {        mFont =                FontFactory.create(this.getFontManager(), this.getTextureManager(), 256, 256,                        Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32);        mFont.load();    }      @Override    protected Scene onCreateScene() {        Scene mScene = new Scene();        mScene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));        return mScene;    }   }
    Class chính xuyên suốt trong AndEngine là: BaseGameActivity ( Ngoài ra còn một số class con khác, mình không liệt kê, sẽ tìm hiểu sau).
    Các bạn không cần quan tâm các hàm trên làm gì, thứ tự diễn ra như nào, cứ copy và chạy cho nó lên OK đã rồi bài nào đó sẽ giải thích chi tiết, cụ thể @@.
    Kết quả sẽ là màn hình xanh như này đây.

    Vậy là mình đã hướng dẫn xong các bạn quá trình download cũng như cài đặt, code demo đơn giản nhất sử dụng thư viện lập trình Game AndEngine.
    Hy vọng các bạn sẽ làm thành công! Mọi thắc mắc xin trao đổi tại đây. Và mình cũng muốn các bạn tạo ra các topic bài học để cùng nhau tìm hiểu về thư viện
    lập trình Game này.

    Have Fun!

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mới tìm hiểu thằng AndEngine thì thấy nó có 2 class để các bạn có thể kế thừa khi viết code cho 1 class mới là : SimpleBaseGameActivity và BaseGameActivity.
    Sau khi tìm hiểu thì mình đưa ra nhận xét như sau.
    Trước đây, khi các bạn code AndEngine cũ sẽ sử dụng GLES1, khi đó class sẽ kế thừa là BaseGameActivity. Tuy nhiên khi download bản AndEngine GLES2, các bạn có thêm lựa chọn là sử dụng
    SimpleBaseGameActivity. Class này extends từ BaseGameActivity, và có 2 abstract class mới, gọi các phương thức nằm trong BaseGameActivity. Chính vì điều này mà các bạn sẽ yên tâm hơn khi viết code và chạy chương trình. Có lúc chỉ vì quên không gọi 1 hàm trong BaseGameActivity mà chương trình chạy sai, không hiểu vì sao? @@
    Cùng là class để hiển thị text ra màn hình, nhưng mình sẽ demo sử dụng 2 class, để các bạn thấy được sự khác nhau giữa chúng.

    Tips:
    Các bạn ấn Ctrl + O để import các library liên quan vào trong project nhé!


    Sử dụng SimpleBaseGameActivity

    Mã:
    public class TextExample extends SimpleBaseGameActivity {    // ===========================================================    // Constants    // ===========================================================     private static final int CAMERA_WIDTH = 720;    private static final int CAMERA_HEIGHT = 480;     // ===========================================================    // Fields    // ===========================================================     private Font mFont;     // ===========================================================    // Constructors    // ===========================================================     // ===========================================================    // Getter & Setter    // ===========================================================     // ===========================================================    // Methods for/from SuperClass/Interfaces    // ===========================================================     @Override    public EngineOptions onCreateEngineOptions() {        final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);         return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);    }     @Override    public void onCreateResources() {        this.mFont = FontFactory.create(this.getFontManager(), this.getTextureManager(), 256, 256, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32);        this.mFont.load();    }     @Override    public Scene onCreateScene() {        this.mEngine.registerUpdateHandler(new FPSLogger());         final Scene scene = new Scene();        scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));         final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager();        final Text centerText = new Text(100, 40, this.mFont, "Hello AndEngine!
    You can even have multilined text!", new TextOptions(HorizontalAlign.CENTER), vertexBufferObjectManager);        final Text leftText = new Text(100, 170, this.mFont, "Also left aligned!
    Lorem ipsum dolor sit amat...", new TextOptions(HorizontalAlign.LEFT), vertexBufferObjectManager);        final Text rightText = new Text(100, 300, this.mFont, "And right aligned!
    Lorem ipsum dolor sit amat...", new TextOptions(HorizontalAlign.RIGHT), vertexBufferObjectManager);         scene.attachChild(centerText);        scene.attachChild(leftText);        scene.attachChild(rightText);         return scene;    }     // ===========================================================    // Methods    // ===========================================================     // ===========================================================    // Inner and Anonymous Classes    // ===========================================================}
    Ví dụ trên mình lấy trong example của AndEngine, như các bạn có thể thấy, với class SimpleBaseGameActivity, các bạn sẽ phải viết code trong 2 method cần viết là:
    Mã:
    public void onCreateResources() {
    ...
    }
    public Scene onCreateScene() {
    ...
    }
    Ở đây chúng ta chỉ việc viết các hàm liên quan cần thiết mà không cần quan tâm tới tham số của hàm, vì nó không có @@.
    Nhưng các bạn sẽ phải tự override hàm onCreateEngineOptions, nó không hiển thị sẵn ra cho mình đâu.[IMG]images/smilies/redface.png[/IMG]
    Nhìn code thì thấy sẽ ngắn gọn hơn đi một chút.

    Sử dụng BaseGameActivity:

    Mã:
    public class TextExample extends BaseGameActivity {    protected static int    CAMERA_WIDTH    = 720;    protected static int    CAMERA_HEIGHT   = 480;    private Camera          mCamera;    private Font            mFont;     @Override    public EngineOptions onCreateEngineOptions() {        mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);        EngineOptions engineOptions =                new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR,                        new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);        return engineOptions;    }     @Override    public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback)            throws Exception {        mFont =                FontFactory.create(getFontManager(), getTextureManager(), 256, 256,                        Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32);        mFont.load();        pOnCreateResourcesCallback.onCreateResourcesFinished();    }     @Override    public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) throws Exception {        this.mEngine.registerUpdateHandler(new FPSLogger());        Scene mScene = new Scene();        mScene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));         Text centerText =                new Text(100, 40, mFont, "Hello AndEngine!", getVertexBufferObjectManager());         mScene.attachChild(centerText);        pOnCreateSceneCallback.onCreateSceneFinished(mScene);     }     @Override    public void onPopulateScene(Scene pScene, OnPopulateSceneCallback pOnPopulateSceneCallback)            throws Exception {        pOnPopulateSceneCallback.onPopulateSceneFinished();    } }
    Với class BaseGameActivity thì sẽ có 4 method mà chúng ta cần phải viết code trong đó, phương thức chung giữa 2 class này là onCreateEngineOptions().
    Để ý các method còn lại sẽ có 1 callback làm tham số, các bạn bắt buộc phải viết code trả về :
    Mã:
    pOnCreateResourcesCallback.onCreateResourcesFinished();
    pOnCreateSceneCallback.onCreateSceneFinished(mScene);
    pOnPopulateSceneCallback.onPopulateSceneFinished();
    Để báo hiệu rằng tôi đã hoàn thành xong các code, AndEngine hãy tự xử lý phần còn lại đi!!
    OK, vậy sự khác biệt lớn nhất là ở đây, giả sử 1 lúc đãng trí nào đó mà bạn chỉ chăm chăm viết code trong : onCreateEngineOptions, onCreateResources, onCreateScene mà quên gọi callback trong
    onPopulateScene giống mình hum qua thì kết quả đúng là méo mặt.
    Method onPopulateScene là nơi chúng ta sẽ thêm một số đối tượng, ví dụ như: quân địch,để cảnh của chúng tôi, thêm một cầu thủ, chơi nhạc, tùy chọn trình đơn thiết lập, hoặc bất cứ điều gì khác bạn có thể nghĩ đến.
    Vậy là hết rồi, hy vọng các bạn sẽ hiểu được sự khác biệt khi sử dụng SimpleBaseGameActivity và BaseGameActivity ( cho GLES2 và GLES1).
    Các bài viết sau mình sẽ tập trung vào việc tạo ra các tùy chọn, thiết lập camera, load resouce ảnh, font chữ. Hy vọng các bạn sẽ đón nhận!
    Mọi góp ý hay bổ sung các bạn có thể comment bên dưới nhé!

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •