2012年7月10日 星期二

[AS3.0 學習筆記] 物件拖曳與層疊

前兩天「情非得已」用 AS2.0 寫公司的一個拖曳遊戲,但鼻涕還是比較偏向 3.0 的 AS 程式,所以改寫了一下,並且做下「層疊」的筆記。

這個簡單的範例主要是「拖曳物件與放開滑鼠左鍵的互動,以及最重要的層疊語法,讓被拖曳的物件顯示在最上層,並且每次隨機產生一個正確答案,拖曳到對或錯的球到感應區域會產生不同反應」。

效果預覽:

程式學習:

物件拖曳
影片片段.startDrag() 與影片片段.stopDrag()。 其中,startDrag 還可以代入 2 個參數:影片片段.startDrag(參數 1, 參數 2)
  • 第一個值為布林值(true 或 flase),當其值為 true 時,被拖曳的物件中心點會符合滑鼠游標;其值為 flase 時,則直接拖曳
  • 第二個參數則可以指定限制拖曳範圍,如:obj1.startDrag(true,newRectangle(物件起始 x 座標, 物件起始 y 座標, 可拖曳水平寬度, 可拖曳垂直長度));

例如: obj1.startDrag(true,newRectangle(100,200, 可拖曳 250,450)); 代表拖曳範圍為「從 (100,200) 到 (350,650)」
改變物件層疊
setChildIndex 常用有以下幾種:
  • 置頂:容器.setChildIndex(對象 A, 容器.numChildren-1);
  • 置底:容器.setChildIndex(對象 A,0);
  • 插入物件 B 的前面:容器.setChildIndex(對象 A, 容器.getChildIndex(對象 B));
  • 插入對象 B 的後面:容器.setChildIndex(對象 A, 容器.getChildIndex(對象 B)-1);

物件碰撞偵測
hitTestObject hitTestPoint物件 1.hitTestObject(物件 2): 直接偵測兩個物件是否重疊,若是不規則物件,只要其中一個「矩形區域」重疊即算碰撞。 物件 1.hitTestPoint(物件 2.x, 物件 2.y,true): 實體碰撞,也就是忽略矩形區域,以物件實體碰撞為主。 例如: if (B1.hitTestObject(B2)) { trace("hitTestObject 撞到"); } else { trace("hitTestObject 沒撞到"); } if (B1.hitTestPoint(B2.x,B2.y,true)) { trace("hitTestPoint 碰到"); } else { trace("hitTestPoint 沒碰到"); } 碰撞偵測

製作:

  1. 依序放入三個小球、重玩按鈕、還有一個感應區域。
  2. 實體名稱分別為 obj1~3、replay、box。
    場景物件 
  3. 輸入程式碼:

//初始化 var B1X = obj1.x; var B1Y = obj1.y; var B2X = obj2.x; var B2Y = obj2.y; var B3X = obj3.x; var B3Y = obj3.y; box.gotoAndStop(1); //邊界設定 var LeftX = 13; var RightX = 385; var UpY = 8; var DownY = 285; //位置變數 var ballX:Number; var ballY:Number; var OBJ:MovieClip; //隨機取一個解答1、2、3,解答球帶有透明度 var sol:Number = Math.floor(Math.random() * 3 + 1); this["obj" + sol].alpha = 0.3; //按住三球拖曳及放開 obj1.addEventListener(MouseEvent.MOUSE_DOWN,Draging); obj2.addEventListener(MouseEvent.MOUSE_DOWN,Draging); obj3.addEventListener(MouseEvent.MOUSE_DOWN,Draging); stage.addEventListener(MouseEvent.MOUSE_UP,NoDraging); replay.addEventListener(MouseEvent.CLICK,rePlay); function Draging(e:MouseEvent) { OBJ = e.currentTarget as MovieClip; ballX = OBJ.x; ballY = OBJ.y; OBJ.startDrag(); setChildIndex(OBJ,this.numChildren-1); this.addEventListener(Event.ENTER_FRAME,testRange); } function NoDraging(e:MouseEvent) { OBJ.stopDrag(); this.removeEventListener(Event.ENTER_FRAME,testRange); if (OBJ.hitTestObject(box)) { var thename = Number(OBJ.name.substr(3)); OBJ.visible = false; if (thename == sol) { box.gotoAndStop(2); } else { box.gotoAndStop(3); } } else { OBJ.x = ballX; OBJ.y = ballY; } } function rePlay(e:MouseEvent) { box.gotoAndStop(1); obj1.alpha = 1; obj2.alpha = 1; obj3.alpha = 1; obj1.x = B1X; obj1.y = B1Y; obj2.x = B2X; obj2.y = B2Y; obj3.x = B3X; obj3.y = B3Y; obj1.visible = true; obj2.visible = true; obj3.visible = true; sol = Math.floor(Math.random() * 3 + 1); this["obj" + sol].alpha = 0.3; } function testRange(e:Event){ if (OBJ.x>RightX || OBJ.xDownY || OBJ.y OBJ.x = ballX OBJ.y = ballY OBJ.stopDrag(); } }

原始檔下載:

2 則留言:

  1. 大大你好,原始檔已經消失了,請問可以再補嗎?因為有點看不懂程式中元件跟元件彼此間的關係,很想學習

    回覆刪除
    回覆
    1. https://dl.dropboxusercontent.com/u/18499002/download/fla/Drag3.fla
      這個大大試一試~~我記得應該是cs6的版本~~

      刪除