blog.Ring.idv.tw

ActionScript

事件處理-「MovieClip」、「Button」對於「on」事件處理的變數範圍

「MovieClip」、「Button」對於「on」事件處理的變數範圍

我們建立一個MovieClip及一個Button在Stage上,並將MovieClip命名為「a_mc」,然後在MovieClipButton上各別加些程式以便驗證。

MovieClip

on(release)
{
	bar = 10;
	trace(this);
}

Button

on(release)
{
	foo = 5;
	trace(this);
}

最後再額外多建立一個Button,用來驗證變數的範圍~

測試用的Button

on(release)
{
	trace(foo);
	trace(a_mc.bar);
}

接著依序點擊「MovieClip」、「Button」以及「測試用的Button」,結果如下:

_level0.a_mc
_level0
5
10

從結果我們就可以了解,寫在「MovieClip」和「Button」的變數範圍是不一樣的,寫在「MovieClip」的變數範圍就如同「事件處理-「onClipEvent」vs.「MovieClip.onXXX」變數範圍」這篇所說明的,相對來說「Button」的情況較為特殊,也就是說寫在「Button」上的變數範圍,其實就是隸屬於「_root」的實體變數,更明確的說「_root」相等於MainTimeline的「this」,然而MainTimeline的「this」又是個「MovieClip」~

關於MainTimeline中的「this」,可以參考「ActionScript 2 this vs. ActionScript 3 this」這篇的說明~

範例下載

2007-05-25 18:18:21 | Add Comment

事件處理-「onClipEvent」vs.「MovieClip.onXXX」變數範圍

「onClipEvent」and「MovieClip.onXXX」變數範圍

我們建立一個MovieClip在Stage上,並將它命名為「a_mc」,並在此MovieClip上加些程式以便驗證。

onClipEvent(load)
{
	var bar = 10;
}

在MainTimeline[1]寫入下述程式:

a_mc.onLoad = function()
{
	var foo = 20;
}

在MainTimeline[2]寫入下述程式:

trace("a_mc(bar):"+a_mc.bar);
trace("a_mc(foo):"+a_mc.foo);
stop();

結果:

a_mc(bar):10
a_mc(foo):undefined

結果卻不如預期(bar=10,foo=20),這是因為任何宣告在「function」中的變數都將被視為「區域變數(local variables)」,而由於「onClipEvent」或「on」事件都必須附著在實體的「MovieClip」之上,所以無論哪一種事件,只要宣告在「MovieClip」的變數都將為「實體變數(instance variables)」

值得一提的是「MovieClip.onXXX」的作法,其實就像是C語言中的「函式指標(function pointer)」,可以用來指向一個「function」,這也是寫Linux Kernel的相關程式時,所必要的技能。

範例下載

2007-05-22 18:23:18 | Add Comment

事件處理-「onClipEvent」vs.「MovieClip.onXXX」執行優先權

在ActionScript 3.0之前的Event Model,簡單來說就像是個各自為政的Model,若是硬要評比的話~好處是簡單易用、彈性大~而壞處是沒有統一的Event Model,容易造成學習者混淆~尤其是當一些小細節被忽略時,往往深埋著不定時炸彈,所以在事件的處理上,了解並掌握它是不可或缺的~

「onClipEvent」and「MovieClip.onXXX」執行的優先權

我們建立一個MovieClip在Stage上,並將它命名為「a_mc」,並在此MovieClip上加些程式以便驗證。

onClipEvent(load)
{
	trace("a_mc(load):"+this);
}

然而在MainTimeline也寫入下述程式:

a_mc.onLoad = function()
{
	trace("a_mc(onLoad):"+this);
}
trace("frame[1]");

然後在此MovieClip的Frame[1]也加上:

trace("a_mc(frame[1]):"+this);

最後一樣「Ctrl + Enter」來看結果:

frame[1]
a_mc(load):_level0.a_mc
a_mc(onLoad):_level0.a_mc
a_mc(frame[1]):_level0.a_mc

從結果來看就可以證明「onClipEvent」的執行優先權比「MovieClip.onXXX」來的高!

範例下載

2007-05-22 15:54:01 | Add Comment

在「onClipEvent」事件中的「this」處理

我們來看一下簡單的例子~

假設我們放一個MovieClip在Stage上,並在此MovieClip下點程式,讓它能夠隨著播放時進行旋轉~

以下均發佈成Flash Player 8 & ActionScript 2.0的swf file

程式一

onClipEvent (enterFrame)
{
    this._rotation += 5;
}

程式一ActionCode

onClipEvent (enterFrame)
{
	ActionConstantPool "this" "_rotation"
	ActionPush "this"
	ActionGetVariable
	ActionPush "_rotation" "this"
	ActionGetVariable
	ActionPush "_rotation"
	ActionGetMember
	ActionPush 5
	ActionAdd2
	ActionSetMember
	ActionEndFlag
}

程式一的ActionCode是最多的一個,我們再試著將「this」移掉試試:

程式二

onClipEvent (enterFrame)
{
    _rotation += 5;
}

程式二ActionCode

onClipEvent (enterFrame)
{
	ActionConstantPool ""
	ActionPush "" 10 "" 10
	ActionGetProperty
	ActionPush 5
	ActionAdd2
	ActionSetProperty
	ActionEndFlag
}

從上述的ActionCode可以發現精簡了不少,其實我們可以發現它相當於如下列的程式:

onClipEvent (enterFrame)
{
    setProperty("", _rotation, _rotation + 5);
}

最後我們再試著將「this」取代「double-quote」,如程式三:

程式三

onClipEvent (enterFrame)
{
    setProperty(this, _rotation, _rotation + 5);
}

程式三ActionCode

onClipEvent (enterFrame)
{
	ActionPush "this"
	ActionGetVariable
	ActionPush 10 "" 10
	ActionGetProperty
	ActionPush 5
	ActionAdd2
	ActionSetProperty
	ActionEndFlag
}

從上述三個程式的ActionCode數量來看~ 若是硬要雞蛋裡挑骨頭的話,程式二在執行上應該是有較佳的效率,純屬從結果上來推論~

2007-05-14 18:14:18 | Add Comment

Blur - 影像處理 for AS2

可用來將影像模糊化~ Try it!

Blur

import flash.display.BitmapData;
function Blur():Void
{
	var myBitmapData:BitmapData = BitmapData.loadBitmap("brg");
	var height:Number = myBitmapData.height;
	var width:Number = myBitmapData.width;

	var gray:Array = new Array(width);

	for(var i:Number = 0 ; i < width ; i++)
		gray[i] = new Array(height);
		
	var gray2:Array = new Array(width);

	for(var i:Number = 0 ; i < width ; i++)
		gray2[i] = new Array(height);

	//RGB to GRAY
	for(var i:Number = 0 ; i < width ; i++)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
			var rgb:Number = myBitmapData.getPixel(i,j);
			var r:Number = 0xFF&(rgb >> 16);
			var g:Number = 0xFF&(rgb >> 8);
			var b:Number = 0xFF&rgb;			
			gray[i][j]= 0.299*r + 0.587*g +0.114*b;
		}
	}
	
	for(var x = 1; x < width-1;x++)
	{
		for(var y = 1; y < height-1;y++)
		{
			/**
			 00(a) 10(b) 20(c)
			 01(d) 11(*) 21(e)
			 02(f) 12(g) 22(h)
			*/
			var a = gray[x-1][y-1]*0.1;
			var b = gray[x][y-1]*0.1;
			var c = gray[x+1][y-1]*0.1;
			var d = gray[x-1][y]*0.1;
			var e = gray[x][y]*0.1;
			var f = gray[x+1][y]*0.1;
			var g = gray[x-1][y+1]*0.1;
			var h = gray[x][y+1]*0.1;
			var i = gray[x+1][y+1]*0.1;
			
			var gc = (a+b+c+d+e+f+g+h+i);
			
			gray2[x][y] = 0xff000000  |gc<<16 | gc<<8 | gc;
		}
	}
	
	//set pixel value
	for(var i:Number = 0 ; i < width ; i++)
	{
		for(var j:Number = 0 ; j < height ; j++)
		{
				
			myBitmapData.setPixel(i,j,gray2[i][j]);
		}
	}

	var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
	mc.attachBitmap(myBitmapData,this.getNextHighestDepth());
}
Blur();

2007-05-07 00:09:35 | Add Comment

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment