close

前兩天「情非得已」用 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            
arrow
arrow
    全站熱搜

    鼻涕男孩學習誌 發表在 痞客邦 留言(0) 人氣()