Thứ sáu, ngày 15 tháng 12 năm 2017

Bài 3: Thay đổi text và tạo vòng lặp hoạt cảnh[andengine]

Ngày đăng: 20/9/2012, 11:38:17AM | Lượt xem: 2,418
Hot!
tag ,

  Text là đối tượng dùng cũng khá nhiều trong game. Lần trước giói thiệu Text rồi nhưng lớp đó ta không thay đổi được giá trị. khi hiện thị điểm của người chơi trong game thì điểm luôn thay đổi nên ta cần thay đổi giá trị Text, để thay đổi text trong Andengine bạn cần dùng đối tượng ChangeableText.

update thêm

Để load được ảnh ta thêm các thành phần vào lớp Game như sau.

 

1. Khai báo thêm 2 biến nữa.

Mã:

Bitmap anh;

  public static Context mcontext;

biến anh dùng để lưu bức ảnh cần vẽ.

biến mcontext dùng để load dữ liệu.

 

2. Tại 2 phương thức khởi dụng ta thêm vào 1 dòng như sau:

Mã:

 mcontext = context;

3. Tại phương thức initialize() ta thêm đoạn code sau để load ảnh.

  anh = BitmapFactory.decodeResource(mcontext.getResources(), R.drawable.android);

ở đây bức ảnh chúng ta vẽ có tên là android. Bức ảnh này đặt trong thư mục res\drawable\android.jpg

 

4. Ảnh đã load song, giờ ta sẽ vẽ ảnh lên màn hình.Thêm câu lệnh sao vào phương thức paint.

 c.drawBitmap(anh, 50, 100, p); // vẽ bức ảnh ở tọa độ x=50, y=100;

  Nhiều bạn sẽ hỏi làm sao để cập nhật các sprite liên tục được, ví dụ như 1 căn rắn nó cứ chạy liên tục vậy. Để cập nhật liên tục ta cần dùng registerUpdateHandler(new IUpdateHandler());

Sau đây là ví dụ minh họa các dùng ChangeText và cập nhật màn hình. Ở đây sau 1s ta sẽ hiện thị giá trị của biến đếm.

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.ColorBackground; 
import org.anddev.andengine.entity.text.ChangeableText; 
import org.anddev.andengine.entity.util.FPSLogger; 
import org.anddev.andengine.opengl.font.Font; 
import org.anddev.andengine.opengl.texture.TextureOptions; 
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; 
import org.anddev.andengine.ui.activity.BaseGameActivity; 

import android.graphics.Color; 
import android.graphics.Typeface; 
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 mFontTexture;//Lưu font vào bộ nhớ 
    private Font mFont;//Dùng để lưu lại font 
     
    private int dem = 0; 
     
    /** 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() { 
        this.mFontTexture = new BitmapTextureAtlas(256, 256, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
        //Tạo font mạc định và style là chữ đậm, cỡ chứ 14 màu đen 
        this.mFont = new Font(this.mFontTexture, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 14, true, Color.BLACK); 
        //Load 
        this.mEngine.getTextureManager().loadTexture(this.mFontTexture); 
        this.mEngine.getFontManager().loadFont(this.mFont);         
    } 

    @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 

        //Khai báo ChangeableText dùng để hiện thị thời gian theo từng giây 
        final ChangeableText textchange = new ChangeableText(100, 160, this.mFont, "", 10);//Tối đa hiện thị 10 ký tự 
        MyScene.attachChild(textchange); 
         
        //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 
                 
            } 
             
            //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 1s 
                    Thread.sleep(1000); 
                } catch (InterruptedException e) { 
                    // TODO Auto-generated catch block 
                    e.printStackTrace(); 
                }                 
                //Cập nhật lại những gì bạn cần vẽ lại liên tục 
                dem++; 
                textchange.setText(String.valueOf(dem));//Cứ sau 1s ta lại hiện thị đếm 
            } 
        }); 

        return MyScene; 
    } 

    @Override 
    public void onLoadComplete() { 
        // TODO Auto-generated method stub 
         
    } 
}  

Chú ý:

final ChangeableText textchange = new ChangeableText(100, 160, this.mFont, "", 10);//Tối đa hiện thị 10 ký tự  

tại sao phải khai báo độ dài là 10 ký tự. Nếu không khai báo thì sao.
Nếu bạn không khai báo thì nó sẽ không thay đổi, giá trị của text, vậy lớn hơn 10 ký tự thì sao . Nếu lớn hơn thì không được hiện thị.

Điều quan trọng trong đoạn ví dụ này là phần cập nhật các đối tượng, hãy chú ý đoạn code này.

MyScene.registerUpdateHandler(new IUpdateHandler() { 
             
            @Override 
            public void reset() { 
                // TODO Auto-generated method stub 
                 
            } 
             
            //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 1s 
                    Thread.sleep(1000); 
                } catch (InterruptedException e) { 
                    // TODO Auto-generated catch block 
                    e.printStackTrace(); 
                }                 
                //Cập nhật lại những gì bạn cần vẽ lại liên tục 
                dem++; 
                textchange.setText(String.valueOf(dem));//Cứ sau 1s ta lại hiện thị đếm 
            } 
        });  

Cái này sẽ cập nhật lại cái MyScene liên tục, nhưng do mình Thread.sleep(1000) nên nó sau 1s nó mới cập nhật lại 1 lần. Bạn mà bỏ cái dòng đó thì nó sẽ chạy liên tục mà không dừng lại.

 

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.