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

Bài 7: Tạo cảnh nền cho game [andengine]

Ngày đăng: 26/9/2012, 11:48:49PM | Lượt xem: 7,997
Hot!

  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 đã chạy ok.

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(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);
          
         //Load ảnh từ thư mục Assets 
         this.mGrassBackground = new RepeatingSpriteBackground(WIDTH, HEIGHT, this.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(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 
         
    } 
     
}  

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

this.mGrassBackground = new RepeatingSpriteBackground(WIDTH, HEIGHT, this.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.

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.

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(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() {  
        //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(256, 256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);  
        //Load ảnh  
        this.textureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.bitmapTextureAtlas, this, "ball.png", 0, 0);
        mEngine.getTextureManager().loadTextures(this.bitmapTextureAtlas);  
         

        this.bg_bitmapTextureAtlas = new BitmapTextureAtlas(512, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA);  
        this.bg_textureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.bg_bitmapTextureAtlas, this, "bg_image.png", 0, 0);
        mEngine.getTextureManager().loadTextures(this.bg_bitmapTextureAtlas);  
    }  

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

        MyScene = new Scene();  
        this.bg_sprite = new Sprite(0, 0, this.bg_textureRegion);  
        MyScene.setBackground(new SpriteBackground(this.bg_sprite));  
        //Đặt sprite tại vị trí x = 100,y = 100  
        this.sprite = new Sprite(100, 100, this.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()+5, 100);  
                    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()-5, 100);  
                    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

MyScene.setBackground(new SpriteBackground(this.bg_sprite));  

 

 

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.