Bài 9: Sử dụng DigitalOnScreenControl để điều khiển nhân vật - Game with Andengine

Thảo luận trong 'Điện thoại, viễn thông' bắt đầu bởi khaipt, 2/9/12.

  1. khaipt New Member

    khaipt

    Tham gia ngày:
    30/6/12
    Bài viết:
    22
    Đã được thích:
    34
    Điểm thành tích:
    0
    Bài 9: Sử dụng DigitalOnScreenControl để điều khiển nhân vật

    Click vào đây để download toàn bộ source code bài 9.

    Có nhiều cách để điều khiển nhân vật trong game. Andengine cung cấp cho ta đối tượng DigitalOnScreenControl để hiện thị 1 vùng điều khiển, với vùng điều khiển này người chơi có thể điều khiển nhân vật theo hướng đi mà mình mong muốn. Sau đây là code minh họa.
    PHP:
    package TestAndengine.Gioi;
    import javax.microedition.khronos.opengles.GL10;
     
    import org.anddev.andengine.engine.Engine;
    import org.anddev.andengine.engine.camera.Camera;
    import org.anddev.andengine.engine.camera.hud.controls.BaseOnScreenControl;
    import org.anddev.andengine.engine.camera.hud.controls.BaseOnScreenControl.IOnScreenControlListener;
    import org.anddev.andengine.engine.camera.hud.controls.DigitalOnScreenControl;
    import org.anddev.andengine.engine.options.EngineOptions;
    import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
    import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
    import org.anddev.andengine.entity.scene.Scene;
    import org.anddev.andengine.entity.scene.background.SpriteBackground;
    import org.anddev.andengine.entity.sprite.Sprite;
    import org.anddev.andengine.entity.util.FPSLogger;
    import org.anddev.andengine.opengl.texture.TextureOptions;
    import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
    import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
    import org.anddev.andengine.opengl.texture.region.TextureRegion;
    import org.anddev.andengine.ui.activity.BaseGameActivity;
     
    import android.os.Bundle;
     
    public class 
    TestAndengineActivity extends BaseGameActivity {
        
    //Khai báo thêm 2 biến quan trọng
        
    private Camera MyCamera;//Biến này thường để cấu hình màn hình
        
    private Scene MyScene;//Quản lý những gì bạn vẽ.
       
        
    private int WIDTH 480;//Chiều rộng vùng hiện thị
        
    private int HEIGHT 320;//Chiều cao vùng hiện thị
       
       
        
    private BitmapTextureAtlas bitmapTextureAtlas;//Lưu ảnh trong bộ nhớ
        
    private TextureRegion textureRegion;//Lưu khi load ảnh
        
    private Sprite sprite;//Sprite quả bóng
       
        
    private BitmapTextureAtlas bg_bitmapTextureAtlas;//Lưu ảnh trong bộ nhớ
        
    private TextureRegion bg_textureRegion;//Lưu khi load ảnh
        
    private Sprite bg_sprite;//Sprite tạo cảnh nền
       
        //Khai báo các biến dùng cho vùng điều khiển
        
    private DigitalOnScreenControl mDigitalOnScreenControl;
        private 
    BitmapTextureAtlas mOnScreenControlTexture;
        private 
    TextureRegion mOnScreenControlBaseTextureRegion;
        private 
    TextureRegion mOnScreenControlKnobTextureRegion;
       
        
    /** Called when the activity is first created. */
        
    @Override
        
    public void onCreate(Bundle savedInstanceState) {
            
    super.onCreate(savedInstanceState);
        }
     
        @
    Override
        
    public Engine onLoadEngine() {
            
    //Khởi tạo vùng hiện thị là 320*480
            
    this.MyCamera = new Camera(00WIDTHHEIGHT);
            
    //Yêu cầu màn hình hiện thị nằm ngang thì ScreenOrientation.LANDSCAPE
            
    Engine engine =    new Engine(new EngineOptions(trueScreenOrientation.LANDSCAPE,
                        new 
    RatioResolutionPolicy(WIDTHHEIGHT),
                        
    this.MyCamera));
            return 
    engine;
        }
     
        @
    Override
        
    public void onLoadResources() {
            
    //Khai báo vùng lưu trữ ảnh có kích thước 256,256. Đây là cái khó nhất đó. Sẽ giải thích sau.
            
    this.bitmapTextureAtlas = new BitmapTextureAtlas(256256TextureOptions.BILINEAR_PREMULTIPLYALPHA);
            
    //Load ảnh
            
    this.textureRegion BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.bitmapTextureAtlasthis"ball.png"00);
            
    mEngine.getTextureManager().loadTextures(this.bitmapTextureAtlas);
           
     
            
    this.bg_bitmapTextureAtlas = new BitmapTextureAtlas(512512TextureOptions.BILINEAR_PREMULTIPLYALPHA);
            
    this.bg_textureRegion BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.bg_bitmapTextureAtlasthis"bg_image.png"00);
            
    mEngine.getTextureManager().loadTextures(this.bg_bitmapTextureAtlas);
           
           
            
    //Load phần điều khiển
            
    this.mOnScreenControlTexture = new BitmapTextureAtlas(256256TextureOptions.BILINEAR_PREMULTIPLYALPHA);
            
    this.mOnScreenControlBaseTextureRegion BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mOnScreenControlTexturethis"ControlBase.png"00);
            
    this.mOnScreenControlKnobTextureRegion BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mOnScreenControlTexturethis"ControlKnob.png"1280);
            
    this.mEngine.getTextureManager().loadTextures(this.mOnScreenControlTexture);
        }
     
        @
    Override
        
    public Scene onLoadScene() {
            
    this.mEngine.registerUpdateHandler(new FPSLogger());
     
            
    MyScene = new Scene();
            
    this.bg_sprite = new Sprite(00this.bg_textureRegion);
            
    MyScene.setBackground(new SpriteBackground(this.bg_sprite));
           
            
    //Đặt sprite1 tại vị trí x = 100,y = 100
            
    this.sprite = new Sprite(100100this.textureRegion);
            
    MyScene.attachChild(sprite);//Add vào MyScene
           
            //=======================================ĐIỂM QUAN TRỌNG NHẤT================
            //Khai báo và sử lý điều kiện khi ta chạm vào vùng điều khiển
            
    mDigitalOnScreenControl = new DigitalOnScreenControl(0HEIGHT this.mOnScreenControlBaseTextureRegion.getHeight(),
                    
    this.MyCamerathis.mOnScreenControlBaseTextureRegionthis.mOnScreenControlKnobTextureRegion0.1f,
                    new 
    IOnScreenControlListener() {
                public 
    void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY) {
                    
    // vùng điều khiển thay đổi ta sẽ cho sprite di chuyển theo hướng ta điều khiển
                    
    TestAndengineActivity.this.sprite.setPosition(TestAndengineActivity.this.sprite.getX() + pValueXTestAndengineActivity.this.sprite.getY() + pValueY);
                }           
            });
            
    mDigitalOnScreenControl.getControlBase().setBlendFunction(GL10.GL_SRC_ALPHAGL10.GL_ONE_MINUS_SRC_ALPHA);
            
    mDigitalOnScreenControl.getControlBase().setAlpha(0.7f);
            
    mDigitalOnScreenControl.getControlBase().setScaleCenter(0128);
            
    mDigitalOnScreenControl.getControlBase().setScale(0.8f);
            
    mDigitalOnScreenControl.getControlKnob().setScale(0.8f);
            
    mDigitalOnScreenControl.refreshControlKnobPosition();
           
            
    MyScene.setChildScene(mDigitalOnScreenControl);
            
    //==============================================================================
           
            
    return MyScene;
        }
     
        @
    Override
        
    public void onLoadComplete() {
            
    // TODO Auto-generated method stub
           
        
    }

    Mình comment rồi, nó đơn giản và dễ hiểu nên mình không giải thích. Các bạn cần download thêm 2 ảnh sau:
    [​IMG]
    [​IMG]

    Ok. Các bạn chạy và kiểm tra kết quả. Nhớ thanks khi chạy được nhé.hi
    tác giả : vangioicnt nguồn: vietandroid
     
    4 people like this.
    Đang tải...
  2. tuanvn New Member

    tuanvn

    Tham gia ngày:
    18/9/12
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    0
    cảm ơn bài viết của bạn, cho mình hỏi mình thêm bộ điều khiển mDigitalOnScreenControl cho MyScene thì các chức năng vẫn chạy được, nhưng các sprite ảnh trắng xóa không hiện được ảnh là sao vậy
     
  3. cuongBK New Member

    cuongBK

    Tham gia ngày:
    9/7/12
    Bài viết:
    64
    Đã được thích:
    18
    Điểm thành tích:
    0
  4. linhngok New Member

    linhngok

    Tham gia ngày:
    16/8/12
    Bài viết:
    23
    Đã được thích:
    7
    Điểm thành tích:
    0
    phần lập trình game này chắc phải nghiên cứu dần dần thui, nhiều vấn đề quá
     
  5. VietFun New Member

    VietFun

    Tham gia ngày:
    10/9/12
    Bài viết:
    8
    Đã được thích:
    4
    Điểm thành tích:
    0
    hic sao mà khó thế, chằng hiểu gì
     
  6. thethanh1207 New Member

    thethanh1207

    Tham gia ngày:
    9/4/13
    Bài viết:
    36
    Đã được thích:
    14
    Điểm thành tích:
    0
    Giới tính:
    Nam
    anh khaipt up lại mấy cái ảnh đi, nhìn như này khó hình dung ra chức năng của nó
     

Chia sẻ trang này