Thứ tư, ngày 20 tháng 9 năm 2017

Bài 6: Sử dụng đối tượng AnimatedSprite để tạo nhân vật chuyển động.

Ngày đăng: 24/9/2012, 8:56:47PM | Lượt xem: 4,947
Hot!

  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:

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(0, 0, WIDTH, HEIGHT); 
        //Yêu cầu màn hình hiện thị nằm ngang thì ScreenOrientation.LANDSCAPE 
        Engine engine =     new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT, 
                    new RatioResolutionPolicy(WIDTH, HEIGHT), 
                    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(64, 32, TextureOptions.BILINEAR); 
         //Số 2 ở đây là 2 cột. Số 1 tức là có 1 hàng 
         this.tiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.bitmapTextureAtlas, this, "sprite.png", 0, 0, 2, 1);
         this.mEngine.getTextureManager().loadTexture(this.bitmapTextureAtlas); 
    } 

    @Override 
    public Scene onLoadScene() { 
        this.mEngine.registerUpdateHandler(new FPSLogger()); 

        MyScene = new Scene(); 
        MyScene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.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(100, 100, this.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()+5, animatedSprite.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()-5, animatedSprite.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: 

 this.tiledTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(this.bitmapTextureAtlas, this, "sprite.png", 0, 0, 2, 1); 

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é.

Các bạn download ảnh sau và cho vào thư mục Assets: 

Như vậy là xong. Giờ các bạn chạy chương trình thì kết quả sẽ như sau:

 

theo vietandroid
 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
ca do bong da online
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.