Chào mừng các bạn đã quay trở lại với loạt bài hướng dẫn lập trình game trên android bằng thư viện
andengine.
    Bài hôm nay mình hướng đẫn các bạn kiểm tra sự va chạm giữa vật cản và nhân vật của mình .
    Bài này sẽ hướng dẫn với nhân vật là chiếc xe tăng với ma trận 1 hàng và 8 cột.
    Sau bài này hi vọng các bạn ứng dụng thêm vào lập trình game cho các bạn!


Video dướng dẫn (like và G+ ủng hộ mình nha):






Untitled 1 Link Source : DOWNLOAD HERE

code :TaiBanDo.class (vẫn như bài trước)

Code : Mainactivity.class

package com.example.loadmap1;
 
import java.util.ArrayList;
 
import javax.microedition.khronos.opengles.GL10;
 
import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.BoundCamera;
import org.anddev.andengine.engine.camera.hud.controls.BaseOnScreenControl;
import org.anddev.andengine.engine.camera.hud.controls.DigitalOnScreenControl;
import org.anddev.andengine.engine.camera.hud.controls.BaseOnScreenControl.IOnScreenControlListener;
import org.anddev.andengine.engine.handler.physics.PhysicsHandler;
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.layer.tiled.tmx.TMXLayer;
import org.anddev.andengine.entity.layer.tiled.tmx.TMXProperties;
import org.anddev.andengine.entity.layer.tiled.tmx.TMXProperty;
import org.anddev.andengine.entity.layer.tiled.tmx.TMXTile;
import org.anddev.andengine.entity.layer.tiled.tmx.TMXTileProperty;
import org.anddev.andengine.entity.layer.tiled.tmx.TMXTiledMap;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.sprite.AnimatedSprite;
import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.entity.util.FPSLogger;
import org.anddev.andengine.input.touch.TouchEvent;
import org.anddev.andengine.opengl.texture.Texture;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.region.TextureRegion;
import org.anddev.andengine.opengl.texture.region.TextureRegionFactory;
import org.anddev.andengine.opengl.texture.region.TiledTextureRegion;
import org.anddev.andengine.ui.activity.BaseGameActivity;
 
import android.util.Log;
import android.widget.Toast;
 
public class MainActivity extends BaseGameActivity {
 
        private static final int CAMERA_WIDTH = 800;
        private static final int CAMERA_HEIGHT = 480;
 
        private BoundCamera mCamera;
        private Texture mTexture;
        //Tạo biến quản lí ảnh animation
        private TiledTextureRegion mXeTangTiledTextureRegion;
 
        private Texture nutBanTexture;
        private TextureRegion nutBanTextureRegion;
 
        private Texture mOnScreenControlTexture;
        private Texture mOnScreenControlTexture1;
        private TextureRegion mOnScreenControlBaseTextureRegion;
        private TextureRegion mOnScreenControlKnobTextureRegion;
 
        private TMXTiledMap mTmxTiledMap;
        private TMXLayer VatCanTMXLayer;
        private String tenBanDo = "map1.tmx";
 
        //Biến lưu giữ trạng thái xe tăng. 0: là đang dừng, 1: là đang chạy.
        private int trangThaiXeTang = 0;
 
        @Override
        public Engine onLoadEngine() {
            this.mCamera = new BoundCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
            return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mCamera));
        }
 
        @Override
        public void onLoadResources() {
            TextureRegionFactory.setAssetBasePath("gfx/");
            //Thay đổi độ rộng cho phù hợp (từ 32,32 -> 256,32)
            this.mTexture = new Texture(256, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
            //Tạo ảnh animation, cho biết bức ảnh animation có 8 cột và 1 dòng
            this.mXeTangTiledTextureRegion = TextureRegionFactory.createTiledFromAsset(this.mTexture, this, "XeTang.png", 0, 0, 8, 1);
   
            this.mOnScreenControlTexture = new Texture(512, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
            this.mOnScreenControlTexture1 = new Texture(512, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
            this.mOnScreenControlBaseTextureRegion = TextureRegionFactory.createFromAsset(this.mOnScreenControlTexture, this, "onscreen_control_base.png", 0, 0);
            this.mOnScreenControlKnobTextureRegion = TextureRegionFactory.createFromAsset(this.mOnScreenControlTexture1, this, "onscreen_control_knob.png", 128, 0);
   
            this.mEngine.getTextureManager().loadTextures(this.mTexture, this.mOnScreenControlTexture,this.mOnScreenControlTexture1);
   
               }
 
        @Override
        public Scene onLoadScene() {
            this.mEngine.registerUpdateHandler(new FPSLogger());
 
            final Scene scene = new Scene();
            scene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));
 
            // khoi tao map
            mTmxTiledMap = TaiBanDo.getTMXTiledMap(scene, mEngine, this, tenBanDo, this);
 
            ArrayList mapLayers = mTmxTiledMap.getTMXLayers();
            for(TMXLayer layer : mapLayers){
                if(layer.getName().equals("vatcan")){
                    VatCanTMXLayer = layer;
                }
                scene.attachChild(layer);
            }
   
            
            //Vị trí khởi tạo AnimatedSprite
            final int centerX = (CAMERA_WIDTH/2-50) ;
            final int centerY = (CAMERA_HEIGHT/2 );
            //Tạo đối tượng AnimatedSprite
            final AnimatedSprite face = new AnimatedSprite(centerX, centerY, this.mXeTangTiledTextureRegion);
 
            final PhysicsHandler physicsHandler = new PhysicsHandler(face);
            face.registerUpdateHandler(physicsHandler);
 
            scene.attachChild(face);
   
   
            final TMXLayer tmxLayer = this.mTmxTiledMap.getTMXLayers().get(0);
            mCamera.setBounds(0, tmxLayer.getWidth(), 0, tmxLayer.getHeight());
            mCamera.setBoundsEnabled(true);
            mCamera.setChaseEntity(face);
 
            final DigitalOnScreenControl digitalOnScreenControl = new DigitalOnScreenControl(0, CAMERA_HEIGHT - this.mOnScreenControlBaseTextureRegion.getHeight(), this.mCamera, this.mOnScreenControlBaseTextureRegion, this.mOnScreenControlKnobTextureRegion, 0.1f, new IOnScreenControlListener() {
                @Override
                public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY) {
                    if(pValueX != 0 || pValueY != 0){
                        float pX = 0, pY = 0;
                        pX = face.getX() + 16;
                        pY = face.getY() + 16;
                        if(pValueX > 0){
                            if(trangThaiXeTang == 0){
                                face.animate(new long[]{200, 200, 200, 200, 200, 200, 200}, 1, 7, true);
                                face.setRotation(0);
                                trangThaiXeTang = 1;
                            }else if(trangThaiXeTang == 1){
                                face.setRotation(0);
                            }
                            //Thiết lập tâm mới xe tăng khi di chuyển qua phải
                            pX = face.getX() + face.getWidth();
                            pY = face.getY() + face.getHeight()/2;
                       
                        }else if(pValueX < 0){
                       if(trangThaiXeTang == 0){
                                 face.animate(new long[]{200, 200, 200, 200, 200, 200, 200}, 1, 7, true);
                                 face.setRotation(180);
                                 trangThaiXeTang = 1;
                             }else if(trangThaiXeTang == 1){
                                 face.setRotation(180);
                             }
                             //Thiết lập tâm mới xe tăng khi di chuyển qua trái
                             pX = face.getX();
                             pY = face.getY() + face.getHeight()/2;
//                        
                        }else if(pValueY > 0){
                            if(trangThaiXeTang == 0){
                                face.animate(new long[]{200, 200, 200, 200, 200, 200, 200}, 1, 7, true);
                                face.setRotation(90);
                                trangThaiXeTang = 1;
                            }else if(trangThaiXeTang == 1){
                                face.setRotation(90);
                            }
                            //Thiết lập tâm mới xe tăng khi di chuyển xuống dưới
                            pX = face.getX() + face.getWidth()/2;
                            pY = face.getY() + face.getHeight();
//                        
                        }else if(pValueY < 0){
                            if(trangThaiXeTang == 0){
                                face.animate(new long[]{200, 200, 200, 200, 200, 200, 200}, 1, 7, true);
                                face.setRotation(270);
                                trangThaiXeTang = 1;
                            }else if(trangThaiXeTang == 1){
                                face.setRotation(270);
                            }
                            //Thiết lập tâm mới xe tăng khi di chuyển lên trên
                            pX = face.getX() + face.getWidth()/2;
                            pY = face.getY();
                        }
                        
                        TMXTile mTMXTile = VatCanTMXLayer.getTMXTileAt(pX, pY);
                        try{
                            if(mTMXTile != null){
                                TMXProperties mTMXProperties = mTMXTile.getTMXTileProperties(mTmxTiledMap);
                                TMXProperty mTmxProperty = mTMXProperties.get(0);
                                if(mTmxProperty.getName().equals("vatcan")){
                                    Log.v("đã đừng", "Chạm phải vật cản rồi !!!");
                                    //Khi chạm vật cản, thiết lập tốc độ xe tăng là 0
                                    physicsHandler.setVelocity(pValueX * 0, pValueY * 0);
                                }
                            }
                        }catch(Exception e){
                            Log.v("đang di chuyển ", "Không có vật cản!");
                            //Khi không gặp chạm vật cản cho xe tăng di chuyển
                            physicsHandler.setVelocity(pValueX * 50, pValueY * 50);
                        }   
                        
                    }else{//Trường xe tăng đứng yên
                        face.animate(new long[]{200}, new int[]{0}, 10000);
                        trangThaiXeTang = 0;
                        //Khi chạm vật cản, thiết lập tốc độ xe tăng là 0
                        physicsHandler.setVelocity(pValueX * 0, pValueY * 0);
                    }
                }
            });
   
            digitalOnScreenControl.getControlBase().setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
            digitalOnScreenControl.getControlBase().setAlpha(0.5f);
            digitalOnScreenControl.getControlBase().setScaleCenter(0, 128);
            digitalOnScreenControl.getControlBase().setScale(0.75f);
            digitalOnScreenControl.getControlKnob().setScale(0.75f);
            digitalOnScreenControl.refreshControlKnobPosition();
  
            digitalOnScreenControl.setTouchAreaBindingEnabled(true);
            scene.setChildScene(digitalOnScreenControl);
            return scene;
        }
 
        @Override
        public void onLoadComplete() {
 
        }
}


0 comments:

Post a Comment

http://knlaptrinhandroid.blogspot.com/

 
Top