Wednesday, September 11, 2013

Tổng hợp các lỗi và cách xử lí !

Updating...

Saturday, September 7, 2013

Bài 2.1 : Entity Modifier - Removing Entity - TouchEvent

1. Entity Modifier :- Bạn có thể sử đổi trạng thái của Entity như : dịch chuyển, xoay, phóng to, thu nhỏ, đôi màu v.v. Mọi class hổ trợ việc này nằm trong gói org.andengine.entity.modifier  bạn có thể vào tìm hiểu. Bài viết này mình chỉ hướng dẫn đăng ký Modifier.
- Để đăng ký một Modifier cho entity bạn làm như sau :
     - Tạo một Modifier và đắng ký cho Entity:
  1. MoveXModifier x = new MoveXModifier(200f,fromX,toX);
  2. x.setAutoUnregisterWhenFinished(true);//tự động hủy đăng ký khi kết thúc
  3. entity.registerEntityModifier(x);
     - Để một Modifier lặp đi lặp lại nhiều lần, sử dụng bạn sửa dòng 3 lại như sau :
  1. entity.registerEntityModifier(new LoopEntityModifier(x));
    - Ngoài ra, bạn có thể thêm các sự kiện khi bắt đâu, hoặc kết thúc Modifier bằng cách tạo một IEntityModifier.IEntityModifierListener lúc này bạn sẽ phải override 2 phương thức onModifierStarted và onModifierFinished. Và truyền vào tham số cuối cùng của modifier.

2.Removing Entity
Để xóa một Entity ra khỏi scene bạn làm như sau :

  1. activity.runOnUpdateThread(new Runnable() {
  2. @Override
  3. public void run() {
  4. entity.clearEntityModifiers();
  5. entity.clearUpdateHandlers();
  6. mScene.unregisterTouchArea(entity);//nếu đã được đăng ký Touch Event
  7. entity.detachSelf();
  8. entity.dispose();
  9. }
  10. }
3. TouchEvent
Đăng ký Touch Event cho Entity:
   - Để đăng ký một sự kiện khi người chơi chạm vào  Entity. Lúc khởi tạo Entity bạn override lại phương thức onAreaTouched. Ví dụ khí touch vào sprite thì xóa sprite đó :

  1. Sprite image = new Sprite(0, 0, mPlayerTextureRegion,
  2. mEngine.getVertexBufferObjectManager()){
  3.    @Override
  4.    public boolean onAreaTouched(TouchEvent pSceneTouchEvent,
  5. float pTouchAreaLocalX, float pTouchAreaLocalY) {
  6.            if (pSceneTouchEvent.isActionDown()) {
  7.               activity.runOnUpdateThread(new Runnable() {
  8. @Override
  9. public void run() {
  10. image.clearEntityModifiers();
  11. image.clearUpdateHandlers();
  12. scene.unregisterTouchArea(image);
  13. image.detachSelf();
  14. image.dispose();
  15.                  image.reset();
  16. }
  17.            }
  18. };
  19. scene.registerTouchArea(image);

Wednesday, September 4, 2013

Bài 2 : Entity - Làm việc với Sprite

Sprite là một phần mở rộng của Entity (xem bài mở đâu). Thường được dùng để vẽ các bức ảnh tỉnh lên scene. Bài này mình sẽ hướng dẫn cách vẽ một sprite lên scene và các phương thức thường dùng của nó.
Download ảnh bên dưới và copy vào thư mục assets trong project.
Lấy ví dụ ở bài hướng dẫn trước .Đầu tiên, mình sẽ load resources của sprite mà mình muốn vẽ như sau :
- Khởi tạo 2 biến
  1. private BitmapTextureAtlas mBitmapTextureAtlas;
  2. private ITextureRegion mPlayerTextureRegion;
    -BitmapTextureAtlas đinh nghĩa một vùng kết cấu hình chữ nhật với chiều dài và chiều rộng xác định. TextureRegion đinh nghĩa cụ thể hình ảnh được hiển thị trong BitmapTextureAtlas  . Bạn có thể hiểu BitmapTextureAtlas giống như một cái hộp, và TextureRegion là vật màn trong cái hộp đó. Vì vậy TextureRegion không thể có kích thước lớn hơn BitmapTextureAtlas. Vì vậy kích thước hình ảnh mà bạn định nghĩa trong TextureRegion phải bé hơn kích thước của BitmapTextureAtlas.
    - Trong phương thức onCreateResources khởi tạo các biến như sau:
  1. mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 214, 320);
  2. //214 chiều rộng + độ cao của ảnh
  3. mPlayerTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "minion.png", 0, 0);
  4.  mBitmapTextureAtlas.load();
Lưu ý : 0,0 tọa độ được vẽ trên BitmapTextureAtlas. Bạn có thể hình dung như sau :
     - Màu đỏ là vùng được BitmapTextureAtlas định nghĩa. Màu vàng là vùng TextureRegion được hiển thị theo các tọa độ khác nhau.

Nếu bạn đặt ảnh trong folder con của assets thêm phương thức sau để xác định đường dẫn cho anh :
  1. BitmapTextureAtlasTextureRegionFactory
  2. .setAssetBasePath("path");


Sau khi đã load texture tạo một đối tượng Sprite .Có rất nhiều contructor cho bạn lựa chọn mình thường tạo Sprite sử dụng contructor như sau:

  1. Sprite image = new Sprite(0, 0, mPlayerTextureRegion, mEngine.getVertexBufferObjectManager());

Và vẽ ảnh này lên scene:

  1. currentScene.attachChild(image);
Sau đây mình liệt kê một số phương thức thường dùng để hỗ trợ trong việc vẽ sprite lên scene :
- setPosition : set theo vị trí của Entity khác hoặc theo tọa độ x,y.
- setAlpha : chỉnh độ trong suốt .
- setScale : phóng to, thu nhỏ.
- setFlipped : lật ảnh 180 độ theo chiều x và y.
- setSize : chỉnh size của sprite.
- setVisible : ẩn hoặc hiển thị sprite.
- setZIndex : chỉnh vị trí sprite theo tọa độ Z khá quan trong khi bạn làm với nhiều layer.

Sau đây là toàn bộ code sau khi hoàn thành :

  1. public class  MyGameActivity extends BaseGameActivity {
  2. private Camera mCamera;// tạo camera, lưu ý camera không thể thay đổi
  3. private int CAMERA_HEIGHT = 720;// khai báo chiều cao cho camera
  4. private int CAMERA_WIDTH = 480;// khai báo chiều dọc cho camera
  5. private BitmapTextureAtlas mBitmapTextureAtlas;
  6. private ITextureRegion mPlayerTextureRegion;

  7. @Override
  8. public EngineOptions onCreateEngineOptions() {
  9. // Cài đặt EngineOptions với 1 camera. Ngoài ra bạn có thể tùy chọn có
  10. // music,sound hay có Multi Touch

  11. mCamera = new BoundCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
  12. EngineOptions eni = new EngineOptions(true,
  13. ScreenOrientation.PORTRAIT_SENSOR, new FillResolutionPolicy(),
  14. this.mCamera); // set fullscreen = true , theo chiều dọc =
  15. // PORTRAIT_SENSOR, full màn hình = new
  16. // FillResolutionPolicy()
  17. eni.getAudioOptions().setNeedsMusic(true);// set game có music
  18. eni.getAudioOptions().setNeedsSound(true);// set game có Sound
  19. eni.getTouchOptions().setNeedsMultiTouch(true);
  20. if (MultiTouch.isSupported(this)) {
  21. if (MultiTouch.isSupportedDistinct(this)) {
  22. } else {
  23. }
  24. } else {
  25. Toast.makeText(
  26. this,
  27. "Sorry your device does NOT support MultiTouch!\n\n(Falling back to SingleTouch.)\n\nControls are placed at different vertical locations.",
  28. Toast.LENGTH_LONG).show();
  29. } // set game co multi touch
  30. return eni;
  31. }

  32. @Override
  33. public void onCreateResources(
  34. OnCreateResourcesCallback pOnCreateResourcesCallback)
  35. throws Exception {
  36. mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(),
  37. 214, 320);
  38. // 214 chiều rộng + độ cao của ảnh
  39. mPlayerTextureRegion = BitmapTextureAtlasTextureRegionFactory
  40. .createFromAsset(this.mBitmapTextureAtlas, this, "minion.png",
  41. 0, 0);
  42. mBitmapTextureAtlas.load();
  43. // Tạo tất cả các Resources. Load các Resourt như ảnh, font chữ,
  44. // music,sound.
  45. // Phần này mình sẽ hướng dẫn ở các bài sau. Thêm câu lệnh sau
  46. pOnCreateResourcesCallback.onCreateResourcesFinished();
  47. }

  48. @Override
  49. public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
  50. throws Exception {
  51. // Tạo scene và attach các thứ mà bạn vẽ vào scene
  52. Sprite image = new Sprite(0, 0, mPlayerTextureRegion,
  53. mEngine.getVertexBufferObjectManager());
  54. Scene currentScene = new Scene();
  55. currentScene.attachChild(image);
  56. pOnCreateSceneCallback.onCreateSceneFinished(currentScene);
  57. }

  58. @Override
  59. public void onPopulateScene(Scene pScene,
  60. OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {
  61. // Attach các thứ mà bạn thường xuyên hiển thị trên Scene.
  62. pOnPopulateSceneCallback.onPopulateSceneFinished();
  63. }
  64. }