Bài 7: Tạo cảnh nền cho game- 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
    Hi. Vừa bảo vệ tốt nghiệp xong, giờ có nhiều thời gian để nghiên cứu và làm việc rồi, trong thời gian này mình sẽ cố gắng viết hết những kiến thức mình học được. Có gì mà còn thiếu sót thì mọi người bổ sung giúp.

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

    Trong game hậu cảnh cũng là yếu tố quan trọng để game thành công. Đầu tiên mình hướng dẫn các bạn tảo cảnh nền bằng cách lặp đi lặp lại 1 bức ảnh nhỏ để nó tràn đầy màn hình. Đây là code mình đã chạy ok.
    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.RepeatingSpriteBackground;
    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.atlas.bitmap.source.AssetBitmapTextureAtlasSource;
    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
       
        
    private RepeatingSpriteBackground mGrassBackground;//Khai báo đối tượng để làm thực hiện lặp ảnh tạo cảnh nền
       
        /** 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);
           
            
    //Load ảnh từ thư mục Assets
            
    this.mGrassBackground = new RepeatingSpriteBackground(WIDTHHEIGHTthis.mEngine.getTextureManager(), new AssetBitmapTextureAtlasSource(this"bg.png"));
           
            
    this.mEngine.getTextureManager().loadTexture(this.bitmapTextureAtlas);
        }
     
        @
    Override
        
    public Scene onLoadScene() {
            
    this.mEngine.registerUpdateHandler(new FPSLogger());
     
            
    MyScene = new Scene();       
            
    MyScene.setBackground(this.mGrassBackground);//Đặt đối tượng mGrassBackground làm cảnh 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
           
        
    }
       

    Chú ý như sau: Để lặp 1 bức ảnh ta cần khai báo một biến của đối tượng RepeatingSpriteBackground, trong ví dụ trên mình khai báo biến này là mGrassBackground. Khi load ảnh ta chỉ cần viết như sau
    PHP:
    his.mGrassBackground = new RepeatingSpriteBackground(WIDTHHEIGHTthis.mEngine.getTextureManager(), new AssetBitmapTextureAtlasSource(this"bg.png")); 
    Mình cho chiều cao, rộng do mình định nghĩa
    ở đây mình cho chiều cao và rộng của màn hình mà mịnh định trước, nó sẽ load ảnh và lặp theo chiều cao, rộng. Khi đó trong khi load onLoadScene() thì ta khai báo thêm code sau để đặt biến mGrassBackground là cảnh nền.
    PHP:
    MyScene.setBackground(this.mGrassBackground); 
    Rất đơn giản nhưng lại sử dụng nhiều.
    Để chạy được code trên bạn download ảnh sau và cho nó vào thư mục Assets:

    Mọi người sẽ đặt câu hỏi trong tình huống này: Vậy tạo cảnh nền từ 1 bức ảnh bằng chiều cao, rộng của màn hình?. Cái này cũng đơn giản, sau đây là code minh họa.
    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.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 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 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
       
        /** 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() {
            
    //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);
        }
     
        @
    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 sprite tại vị trí x = 100,y = 100
            
    this.sprite = new Sprite(100100this.textureRegion);
            
    MyScene.attachChild(sprite);//Add vào MyScene
           
            //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){
                        
    sprite.setPosition(sprite.getX()+5100);
                        if(
    sprite.getX() > 200)//Vượt quá giới hạn thì cho di chuyển ngược lại
                            
    chuyen true;
                    }else{
                        
    sprite.setPosition(sprite.getX()-5100);
                        if(
    sprite.getX() < 10)
                            
    chuyen false;
                    }
                }
            });
     
            return 
    MyScene;
        }
     
        @
    Override
        
    public void onLoadComplete() {
            
    // TODO Auto-generated method stub
           
        
    }

    Cách làm rất đơn giản. ta tạo ra 1 sprite sau đó dùng cầu lệnh sau để đặt sprite đó là cảnh nền
    PHP:
    MyScene.setBackground(new SpriteBackground(this.bg_sprite));  
    Kết quả của chương trình các bạn chạy thử nhé. Hi có ích thi nhớ thanks mình nhé.
    Tác giả: vangioicnt nguồn : vietandroid
     
    4 people like this.
    Đang tải...
  2. Dong Dinh New Member

    Dong Dinh

    Tham gia ngày:
    4/1/13
    Bài viết:
    9
    Đã được thích:
    9
    Điểm thành tích:
    0
    CHo em xin emaill hay nick yahoo cua anh với. Em đang tim hieu ve AndEngine nhưng vẫn ko chay duoc cái project huong dẫn đơn giản nhất.hic.hic
     

Chia sẻ trang này