2009年8月31日 星期一

Tutorial 04b - Sprite2D

Sprite2D - 一個簡化版的顯示方示,用以取代 3D 顯示物件,可以省去許多額外的計算及資源。此物件在場景中,永遠是面對著 Camera 的。舉例來說,天上的星星、水中的魚、森林裡的樹,都可以利用 Sprite2D 來顯示。

重點API:
sandy.util.LoaderQueue
sandy.core.scenegraph.Sprite2D
sandy.events.QueueEvent

  1. package
  2. {
  3. import flash.display.Bitmap;
  4. import flash.display.Sprite;
  5. import flash.events.Event;
  6. import flash.events.KeyboardEvent;
  7. import flash.events.MouseEvent;
  8. import flash.net.URLRequest;
  9. import sandy.core.Scene3D;
  10. import sandy.core.scenegraph.Camera3D;
  11. import sandy.core.scenegraph.Group;
  12. import sandy.core.scenegraph.Sprite2D;
  13. import sandy.events.QueueEvent;
  14. import sandy.util.LoaderQueue;

  15. public class Example004b extends Sprite
  16. {
  17. private var scene:Scene3D;
  18. private var camera:Camera3D;
  19. // Utility class for 載入外部資源
  20. private var queue:LoaderQueue;
  21. /** numTree 將影響 CPU 的效能 **/
  22. private var numTree:Number = 50;
  23. public function Example004b()
  24. {
  25. // 產生一 LoaderQueue 物件
  26. queue = new LoaderQueue();
  27. // 將欲載入資源之Unique名稱及路徑,加入 queue 中
  28. queue.add("tree", new URLRequest("asset/tree.gif"));
  29. // 為 queue 物件新增監聽事件 - 當資源載入完成時,
  30. // 執行 loadComplete Function
  31. queue.addEventListener(
  32. QueueEvent.QUEUE_COMPLETE,
  33. loadComplete);
  34. // 為 queue 物件新增監聽事件 - 當載入資源發生錯誤時,
  35. // 執行 loadError Function
  36. queue.addEventListener(
  37. QueueEvent.QUEUE_LOADER_ERROR,
  38. loadError);
  39. // 開始載入外部資源
  40. queue.start();
  41. }

  42. public function loadComplete(evt:QueueEvent):void
  43. {
  44. // 產生 Camera3D 物件
  45. camera = new Camera3D(600, 300);
  46. camera.y = 10;
  47. camera.z = -300;

  48. // 產生 Group 物件
  49. var root:Group = createScene();

  50. // 產生 Scene3D 物件,並將 Camera3D 及 Group 加入場景
  51. scene = new Scene3D("scene", this, camera, root);
  52. // 設定當物件超出場景之外時,將不會被畫出
  53. scene.rectClipping = true;

  54. addEventListener(Event.ENTER_FRAME,
  55. enterFrameHandler);
  56. stage.addEventListener(KeyboardEvent.KEY_DOWN,
  57. keyPressHandler);
  58. stage.addEventListener(MouseEvent.MOUSE_MOVE,
  59. mouseMoveHandler);
  60. }

  61. public function loadError(evt:QueueEvent):void
  62. {
  63. trace("load resource error");
  64. }

  65. private function createScene():Group
  66. {
  67. // 產生根 Group 物件
  68. var g:Group = new Group();

  69. // 產生 Sprite2D 物件
  70. for (var i:Number = 0; i <>
  71. {
  72. // 將載入 queue 物件中的資源取出
  73. var bit:Bitmap =
  74. new Bitmap(queue.data["tree"].bitmapData);
  75. // 產生 Sprite2D 物件,並設置其參數,分別為
  76. // Unique名稱,顯示物件 (DisplayObject) 及 縮放比率
  77. var s:Sprite2D = new Sprite2D("tree" + i, bit, 1);
  78. // 隨機設定 Sprite2D 的 x, y, z 座標位置
  79. s.x = Math.random() * 600 - 300;
  80. s.y = 0;
  81. s.z = Math.random() * 600;

  82. g.addChild(s);
  83. }

  84. return g;
  85. }
  86. private function enterFrameHandler(evt:Event):void
  87. {
  88. scene.render();
  89. }
  90. private function keyPressHandler(evt:KeyboardEvent):void
  91. {
  92. // 調整 camera 鏡頭之遠近
  93. switch(evt.keyCode)
  94. {
  95. case KeyboardEvent.KEY_UP:
  96. camera.moveForward(5);
  97. break;
  98. case KeyboardEvent.KEY_DOWN:
  99. camera.moveForward( -5);
  100. break;
  101. }
  102. }
  103. private function mouseMoveHandler(evt:MouseEvent):void
  104. {
  105. // 隨滑鼠移動設置 camera 之方向
  106. camera.pan = (evt.stageX - 300 / 2) / 10;
  107. camera.tilt = (evt.stageY - 300 / 2) / 20;
  108. }
  109. }
  110. }




程式碼出處:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut042

沒有留言:

張貼留言