Bài 6: Sử dụng đối tượng AnimatedSprite để tạo nhân vật chuyển động - 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
    Chào các bạn. Mấy hôm bận cái đồ án tốt nghiệp nên không post bài lên được, có gì cả nhà thông cảm.

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

    Hôm này mình sẽ hướng dẫn các bạn sử dụng đối tượng AnimatedSprite, đối tượng này dùng cực kỳ nhiều. Các game như mario, tanks... đều phải dùng AnimatedSprite để tạo hiệu ứng nhân vật chuyển động. Cách dùng đối tượng này rất đơn giản, các bạn cùng xem code sau:
    PHP:
    package TestAndengine.Gioi;
     
    import org.anddev.andengine.engine.Engine;
    import org.anddev.andengine.engine.camera.Camera;
    import org.anddev.andengine.engine.handler.IUpdateHandler;
    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.Scene.IOnSceneTouchListener;
    import org.anddev.andengine.entity.scene.background.ColorBackground;
    import org.anddev.andengine.entity.sprite.AnimatedSprite;
    import org.anddev.andengine.entity.util.FPSLogger;
    import org.anddev.andengine.input.touch.TouchEvent;
    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.TiledTextureRegion;
    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 320;//Chiều rộng vùng hiện thị
        
    private int HEIGHT 480;//Chiều cao vùng hiện thị
       
       
        
    private BitmapTextureAtlas bitmapTextureAtlas;//Lưu ảnh trong bộ nhớ
        
    private TiledTextureRegion  tiledTextureRegion;//Lưu khi load ảnh
        
    private AnimatedSprite  animatedSprite ;//AnimatedSprite
       
        /** 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.PORTRAIT,
                        new 
    RatioResolutionPolicy(WIDTHHEIGHT),
                        
    this.MyCamera));
            return 
    engine;
        }
     
        @
    Override
        
    public void onLoadResources() {
            
    //Bức ảnh chỉ rộng 64 và cao 32 nên ta khai báo theo đúng kích thước để đỡ tốn bộ nhớ
            
    this.bitmapTextureAtlas = new BitmapTextureAtlas(6432TextureOptions.BILINEAR);
            
    //Số 2 ở đây là 2 cột. Số 1 tức là có 1 hàng
            
    this.tiledTextureRegion BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.bitmapTextureAtlasthis"sprite.png"0021);
            
    this.mEngine.getTextureManager().loadTexture(this.bitmapTextureAtlas);
        }
     
        @
    Override
        
    public Scene onLoadScene() {
            
    this.mEngine.registerUpdateHandler(new FPSLogger());
     
            
    MyScene = new Scene();
            
    MyScene.setBackground(new ColorBackground(0.09804f0.6274f0.8784f));//Đặt màu nền
           
           
            //=====================================LẮNG NGHE SỰ KIỆN CHẠM VÀO MÀN HÌNH MyScene======================================================================
            //Bắt sự kiện khi chạm vào MyScene
            
    MyScene.setTouchAreaBindingEnabled(true);//cho phép lắng nghe
            
    MyScene.setOnSceneTouchListener(new IOnSceneTouchListener() {               
                    public 
    boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
                        
    System.out.println("Sprite onSceneTouchEvent: chạm vào màn hình");
                        
    System.out.println("Tọa độ X = "+pSceneTouchEvent.getX());
                        
    System.out.println("Tọa độ Y = "+pSceneTouchEvent.getY()); 
                       
                        
    //Khi chạm vào màn hình ta di chuyển AnimatedSprite theo tọ độ y.
                        
    animatedSprite.setPosition(animatedSprite.getX(), pSceneTouchEvent.getY());
                        return 
    true;
                    }
            });
            
    //======================================LẮNG NGHE SỰ KIỆN KHI CHẠM VÀO ANIMATEDSPRITE=====================================================================
            //Đặt AnimatedSprite tại vị trí x = 100,y = 100
            
    this.animatedSprite = new AnimatedSprite(100100this.tiledTextureRegion){
                
    //Lắng nghe sự kiện khi chạm vào sprite
                
    @Override
                
    public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
                    if(
    pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){
                        
    System.out.println("AnimatedSprite onAreaTouched: chạm vào animatedSprite");
                        
    System.out.println("Tọa độ X = "+pTouchAreaLocalX);
                        
    System.out.println("Tọa độ Y = "+pTouchAreaLocalY);                 
                    }
                    return 
    true;
                }
            };
            
    animatedSprite.animate(100);//Sau 100milis ta sẽ đổi bức ảnh
            
    MyScene.attachChild(animatedSprite);//Add vào MyScene
            
    MyScene.registerTouchArea(animatedSprite);//Phải đăng ký là cho phép AnimatedSprite này được lắng nghe sự kiện
            //===========================================================================================================
            //Cập nhật (coi như vòn lặp hoạt cảnh)
            
    MyScene.registerUpdateHandler(new IUpdateHandler() {           
                @
    Override
                
    public void reset() {
                    
    // TODO Auto-generated method stub               
                
    }
               
                
    boolean chuyen false;
                
    //Muốn cập nhật cái gì thì cho vào đây
                
    @Override
                
    public void onUpdate(float pSecondsElapsed) {
                    try {
                        
    //Tạm dừng cập nhật trong 10 ms
                        
    Thread.sleep(10);
                    } catch (
    InterruptedException e) {
                        
    // TODO Auto-generated catch block
                        
    e.printStackTrace();
                    }   
                    
    //Di chuyển sang phải
                    
    if(!chuyen){
                        
    animatedSprite.setPosition(animatedSprite.getX()+5animatedSprite.getY());
                        if(
    animatedSprite.getX() > 200)//Vượt quá giới hạn thì cho di chuyển ngược lại
                            
    chuyen true;
                    }else{
                        
    animatedSprite.setPosition(animatedSprite.getX()-5animatedSprite.getY());
                        if(
    animatedSprite.getX() < 10)
                            
    chuyen false;
                    }
                }
            });
     
            return 
    MyScene;
        }
     
        @
    Override
        
    public void onLoadComplete() {
            
    // TODO Auto-generated method stub
           
        
    }
       

    Code được dùng lại từ bài 5 nhưng có một số thay đổi. Ta khai báo 1 biến animatedSprite, để có các frame cho AnimatedSprite thì ta phải load ảnh bằng TiledTextureRegion.

    Khi load ảnh các bạn cần chú ý dòng này:
    PHP:
    this.tiledTextureRegion BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.bitmapTextureAtlasthis"sprite.png"0021); 
    Do mỗi số ảnh có số hàng và số cột khác nhau nên các bạn cần khai báo rằng trong cái ảnh đó có bao nhiêu hàng và bao nhiêu cột. Số 2 tức là chỉ có 2 cột, số 1 tức là 1 hàng. Nhớ là cột trước hàng sau nhé.[​IMG]

    Các bạn thấy bài viết có ích thì thanks để lấy tinh thần viết bài nhé. Cảm ơn các bạn.
    tác giả:vangioicnt nguồn: vietandroid
     
    8 people like this.
    Đang tải...
  2. Truongcom New Member

    Truongcom

    Tham gia ngày:
    31/5/13
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    0
    Giới tính:
    Nam
    Link ảnh hỏng rồi bạn ơi, up lại đi bạn.
     
  3. dinhhoaict New Member

    dinhhoaict

    Tham gia ngày:
    19/7/13
    Bài viết:
    1
    Đã được thích:
    0
    Điểm thành tích:
    0
    Giới tính:
    Nam
    Chào bạn, Mình mới tập tành làm game trên AndEngine. Nhưng lúc mình sử dụng AnimationSprite để tạo enimation thì lúc mình sử dụng animationSprite trên basegameActivity thì animation không chạy, còn sử dụng trên SimpleBaseGameActivity thì lại hoạt động bình thường. Bạn có thể chỉ giúp mình lỗi sai được không. Cảm ơn.
    Code:
    PHP:
    public class MainActivity extends BaseGameActivity {
        
    Camera mCamera;
        
    Scene mScene;
        
    TiledTextureRegion region;
        
    AnimatedSprite sprite;
     
     
        @
    Override
        
    public EngineOptions onCreateEngineOptions() {
            
    // TODO Auto-generated method stub
            
    int SCREEN_WIDTH getWindowManager().getDefaultDisplay().getWidth();
            
    int SCREEN_HEIGHT getWindowManager().getDefaultDisplay().getHeight();
            
    mCamera = new Camera(00SCREEN_WIDTHSCREEN_HEIGHT);
            
    EngineOptions engineOptions = new EngineOptions(true,
                    
    ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(
                            
    SCREEN_WIDTHSCREEN_HEIGHT), mCamera);
            return 
    engineOptions;
        }
     
        @
    Override
        
    public void onCreateResources(
                
    OnCreateResourcesCallback pOnCreateResourcesCallback)
                
    throws IOException {
            
    BitmapTextureAtlas atlas = new BitmapTextureAtlas(getTextureManager(),
                    
    30723072TextureOptions.BILINEAR);
            
    region BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(
                    
    atlasthis.getAssets(), "giong.png"0033);
            
    this.mEngine.getTextureManager().loadTexture(atlas);
            
    pOnCreateResourcesCallback.onCreateResourcesFinished();
     
        }
     
        @
    Override
        
    public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
                
    throws IOException {
            
    // TODO Auto-generated method stub
            
    mScene = new Scene();
            
    mScene.setBackground(new Background(Color.BLUE));
            
    sprite = new AnimatedSprite(00region,
                    
    this.getVertexBufferObjectManager());
            
    sprite.setPosition(300 600);
            
    sprite.animate(100);
            
    mScene.attachChild(sprite);
            
    mScene.setTouchAreaBindingOnActionDownEnabled(true);
            
    mScene.setOnSceneTouchListener(new IOnSceneTouchListener() {
             
                @
    Override
                
    public boolean onSceneTouchEvent(Scene pSceneTouchEvent pSceneTouchEvent) {
                    
    // TODO Auto-generated method stub
                    
    Log.e("aa" String.format("event position : x = %d y = %d"pSceneTouchEvent.getX() , pSceneTouchEvent.getY()));
                    
    sprite.setPosition(pSceneTouchEvent.getX() , pSceneTouchEvent.getY());
                    return 
    true;
                }
            });
            
    pOnCreateSceneCallback.onCreateSceneFinished(mScene);
     
        }
     
        @
    Override
        
    public void onPopulateScene(Scene pScene,
                
    OnPopulateSceneCallback pOnPopulateSceneCallback)
                
    throws IOException {
            
    // TODO Auto-generated method stub
     
        
    }
     
    }
    Sử dụng với SimpleBaseGameActivity:
    PHP:
    public class MainActivity2 extends SimpleBaseGameActivity {
    Camera mCamera;
    Scene mScene;
    TiledTextureRegion region;
    AnimatedSprite sprite;
     
    @
    Override
    public EngineOptions onCreateEngineOptions() {
    // TODO Auto-generated method stub
    int SCREEN_WIDTH getWindowManager().getDefaultDisplay().getWidth();
    int SCREEN_HEIGHT getWindowManager().getDefaultDisplay().getHeight();
    mCamera = new Camera(00SCREEN_WIDTHSCREEN_HEIGHT);
    EngineOptions engineOptions = new EngineOptions(true,
    ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(
    SCREEN_WIDTHSCREEN_HEIGHT), mCamera);
    return 
    engineOptions;
    }
     
    @
    Override
    protected void onCreateResources() throws IOException {
    BitmapTextureAtlas atlas = new BitmapTextureAtlas(getTextureManager(),
    30721024TextureOptions.BILINEAR);
    region BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(
    atlasthis.getAssets(),  "giong.png"0033);
    atlas.load();
     
    }
     
    @
    Override
    protected Scene onCreateScene() {
    mScene = new Scene();
    mScene.setBackground(new Background(Color.BLUE));
    sprite = new AnimatedSprite(00region,
    this.getVertexBufferObjectManager());
    sprite.setPosition(300300);
    sprite.animate(100);
    mScene.attachChild(sprite);
    return 
    mScene;
    }
     
    }
     
     

Chia sẻ trang này