Điều khiển sprite bằng cảm biến gia tốc trong AndEngine

MainActivity.java

package com.mycompany.myapp;

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.ColorBackground;
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.region.TiledTextureRegion;
import org.anddev.andengine.ui.activity.BaseGameActivity;
import org.anddev.andengine.opengl.font.Font;
import org.anddev.andengine.entity.text.ChangeableText;

import android.os.Bundle;
import android.hardware.*;
import android.graphics.*;

public class MainActivity extends BaseGameActivity implements SensorEventListener {
//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 SensorManager sensorManager;
private int getX;
private int getY;
private int moveX;
private int moveY;
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 BitmapTextureAtlas mfontTexture;
private Font mfont;
private TiledTextureRegion tiledTextureRegion;//Lưu khi load ảnh
private AnimatedSprite animatedSprite ;//AnimatedSprite

/** 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);
this.mEngine.getTextureManager().loadTexture(this.mfontTexture);//load
this.mEngine.getFontManager().loadFont(this.mfont);//load
//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);
this.mEngine.getTextureManager().loadTexture(this.bitmapTextureAtlas);
}

@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 textchane = new ChangeableText(0, 0, this.mfont, "", 10);//Tối đa hiện thị 10 ký tự
final ChangeableText toado = new ChangeableText(100, 0, this.mfont, "", 100);//to do
MyScene.attachChild(textchane);//Add text
MyScene.attachChild(toado);
//Đăng kí để lắng nghe sự kiện thay đổi sensor
sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
sensorManager.registerListener( this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),1000); //delay là 1000 mili giây 
//=====================================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(3000);//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
}

//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();
}
textchane.setText("("+String.valueOf(getX)+","+String.valueOf(getY)+")");
toado.setText("X: "+String.valueOf(animatedSprite.getX())+",Y: "+String.valueOf(animatedSprite.getY()));//hien thi toa do
}
});

return MyScene;
}

public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
//lấy giá trị tọa độ X và Y thông qua giá trị thay đổi sensor
getX = Math.round(values[0]);
getY = Math.round(values[1]);

//Giới hạn không cho player ra khỏi scene theo chiều x
if (animatedSprite.getX()-getX<0)
{
moveX =0;
}
else { if(animatedSprite.getX()-getX>320-32)
{
moveX = 320 - 32;
}
else {moveX=Math.round(animatedSprite.getX()-getX);}}

//Giới hạn không cho player ra khỏi scene theo chiều y
if (animatedSprite.getY()+getY<0)
{
moveY =0;
}
else { if(animatedSprite.getY()+getY>480-32)
{
moveY=480-32;
}
else {moveY=Math.round(animatedSprite.getY()+getY);}}

//Di chuyển sprite
animatedSprite.setPosition(moveX, moveY);
}
public void onAccuracyChanged(Sensor arg0, int arg1) {

}

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

}

}

0 nhận xét:

Đăng nhận xét