前兩天「情非得已」用 AS2.0 寫公司的一個拖曳遊戲,但鼻涕還是比較偏向 3.0 的 AS 程式,所以改寫了一下,並且做下「層疊」的筆記。
這個簡單的範例主要是「拖曳物件與放開滑鼠左鍵的互動,以及最重要的層疊語法,讓被拖曳的物件顯示在最上層,並且每次隨機產生一個正確答案,拖曳到對或錯的球到感應區域會產生不同反應」。
效果預覽:
程式學習:
物件拖曳
影片片段.startDrag() 與影片片段.stopDrag()。 其中,startDrag 還可以代入 2 個參數:影片片段.startDrag(參數 1, 參數 2) 。- 第一個值為布林值(true 或 flase),當其值為 true 時,被拖曳的物件中心點會符合滑鼠游標;其值為 flase 時,則直接拖曳。
- 第二個參數則可以指定限制拖曳範圍,如:obj1.startDrag(true,newRectangle(物件起始 x 座標, 物件起始 y 座標, 可拖曳水平寬度, 可拖曳垂直長度));
改變物件層疊
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 沒碰到");
}
製作:
- 依序放入三個小球、重玩按鈕、還有一個感應區域。
- 實體名稱分別為 obj1~3、replay、box。
- 輸入程式碼:
//初始化
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();
}
}
原始檔下載:
大大你好,原始檔已經消失了,請問可以再補嗎?因為有點看不懂程式中元件跟元件彼此間的關係,很想學習
回覆刪除https://dl.dropboxusercontent.com/u/18499002/download/fla/Drag3.fla
刪除這個大大試一試~~我記得應該是cs6的版本~~