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. }

23 comments:

  1. Thank bạn đã post bài. Bạn có thể cho link down thư viện andengine luôn không. Hiện tại thư viện mình đang tìm hiểu không thấy có các lớp giống như ví dụ của bạn.

    ReplyDelete
  2. Sorry vì reply muộn. Link down thì bạn có thể lên trang chủ để down https://github.com/nicolasgramlich/AndEngine.
    Import nhiều lúc gặp lỗi. Bạn có thể PM mình để mình giúp bạn cài nhé !

    ReplyDelete
  3. Dạo này bận không viết blog nữa ah bạn ơi ?

    ReplyDelete
  4. Uh! Dao nay minh cung dang ban, chua co thoi gian viet.
    Ma ban can minh viet phan nao thi post len ! Luc nao ranh minh viet !

    ReplyDelete
  5. Thanks for sharing the post.Your article is very nice thank you for share this such a wonderful article. I know that you explain it in very good manner.
    facebook help chat live chat on facebook, autoketing app

    ReplyDelete
  6. Hmm is anyone else experiencing problems with the images on this
    blog loading? I’m tryhing to determine if its a problem on my end or if it’s the blog.
    autoketing
    Free shipping bar
    Shopify free shipping bar app

    ReplyDelete
  7. Good day. I discovered your online journal utilizing msn.I study one thing tougher on completely different blogs everyday.
    Discount master app 2018, Product discount app, autoketing

    ReplyDelete
  8. I guess you are a smart cookie because of your knowledge and insight.They are my cup of tea.I want to thank you for sharing.
    friv10games club, kizi-2018 games, gogy xyz games

    ReplyDelete
  9. Best work you have done, this online website is cool with great facts and looks. I have stopped at this blog after viewing the excellent content. I will be back for more qualitative work.
    Fortnite Building Simulator GamePlay
    Shell Shockers Game
    Sling-drift Game

    ReplyDelete
  10. Everything you provide in your blog site is so superb topic. This was a wonderful site and I really enjoy it the data you shared.It's nice to see that some people still understand how to write a quality post!
    gogy play now juegos motox3m3 abcya3 play now

    ReplyDelete

  11. I don t have the time at the moment to fully read your site but I have bookmarked it and also add your RSS feeds. I will be back in a day or two. thanks for a great site.
    Games of madalin stunt cars 2 club , the world cup soccer 2018 clubunblocked , jogos geometry jump club ,

    ReplyDelete
  12. Games xmas magic tiles
    Truck physics free
    Gunmaster onslaught games for kid
    Have you ever considered writing an e-book or guest authoring on other sites? I have a blog centered on the same information you discuss and would really like to have you share some stories/information. I know my subscribers would value your work. If you are even remotely interested, feel free to shoot me an email.

    ReplyDelete
  13. Nice blog and absolutely outstanding. You can do something much better but i still say this perfect.Keep trying for the best
    mr dubstep for girls , moto x3m 4 winter unblocked games , santa claus jumponline ,

    ReplyDelete
  14. This website basically beautiful points and things right.This was a wonderful site and I really enjoy it the data you shared.Cheers for sharing with us your wonderful blog.
    Ride The Bus Simulator funny game Mommy Elsa Baby Caring play for free Tomb Runner best online game

    ReplyDelete
  15. thank you a ton for sharing your knowledge! I am very Happy to find your blog.This is one wonderful blog article.I am sure that if I ask enough people, they'll agree with me, too
    Papa's Scooperia free game for kids game Def Island Kick The Buddy game for kids

    ReplyDelete
  16. Awesome substance material and incredible design. Your site merits the majority of the positive input it's been getting.
    cars simulator free , game nighty knight , fnaf world unblocked games ,

    ReplyDelete
  17. therefore significantly for the blog.Thanks Again. Much obliged.I truly recognize that website article.Really getting excited about read more. Much obliged.I can't thanks enough for the blog article.Really getting excited about study more. Great
    miniclip online, play a10games, Jogos live

    ReplyDelete
  18. Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post. io jogos for kids
    play free 2 player game
    friv free online juegos

    ReplyDelete

  19. food games 2019 online
    basketball games online
    soccer games play
    Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post.

    ReplyDelete