Bài 3: Thay đổi text và tạo vòng lặp hoạt cảnh - 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
    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.

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

    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.
    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.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(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() {
            
    this.mFontTexture = new BitmapTextureAtlas(256256TextureOptions.BILINEAR_PREMULTIPLYALPHA);
            
    //Tạo font mạc định và style là chữ đậm, cỡ chứ 14 màu đen
            
    this.mFont = new Font(this.mFontTextureTypeface.create(Typeface.DEFAULT, Typeface.BOLD), 14trueColor.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.09804f0.6274f0.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(100160this.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ú ý:
    PHP:
    final ChangeableText textchange = new ChangeableText(100160this.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.
    PHP:
    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.

    Hi. Có vậy thôi, mọi người test xem có chạy được không nhé. Có gì hay anh em nhớ thanks đó.
    Tác giả vangioicnt nguồn : vietandroid
     
    Đang tải...
  2. hainq184 New Member

    hainq184

    Tham gia ngày:
    2/5/13
    Bài viết:
    5
    Đã được thích:
    0
    Điểm thành tích:
    0
    Giới tính:
    Nam
    final ChangeableText textchange = new ChangeableText(100, 160, this.mFont, "", 10);//Tối đa hiện thị 10 ký tự

    Nhờ a chỉ giúp em :

    nếu muốn nhập vào số lượng ký tự <10 thì hiển thị
    còn nếu lớn hơn 10 ký tự thì ko hiển thị

    thì làm thế nào ah ???
     
  3. vangioicnt Moderator

    vangioicnt

    Tham gia ngày:
    11/10/12
    Bài viết:
    180
    Đã được thích:
    352
    Điểm thành tích:
    0
    Ví dụ nhé: Nếu bạn nhập "0123456789" thì nó sẽ hiện thị hết, còn bạn nhập "01234567890" nó có thể chỉ hiện thị đến "9" mà thôi, còn số "0" cuối cùng nó không hiện thị được.
     

Chia sẻ trang này