function apple():void
{
trace("apple");
}
function traceFun(func:Function):void
{
func();
}
traceFun(apple);
traceFun(apple);
traceFun(apple);
產生的結果為
apple
apple
apple
2007/11/29
2007/11/19
2007/10/31
2007/10/30
XML與XMLList的差異
XML 類別包含使用 XML 物件的方法和屬性。 XML 類別 (以及 XMLList、Namespace 和 QName 類別) 會實作 ECMAScript for XML (E4X) 規格 (ECMA-357 第 2 版) 中定義的強大 XML 處理標準。
XMLList 類別包含用來處理一個或多個 XML 元素的方法。 XMLList 物件可以代表一個或多個 XML 物件或元素 (包括多個節點或特質),所以您可以針對組成群組的元素或集合中的個別元素呼叫方法。
簡單說,
XML是... ,一個。length鏓是為1
XMLList是... ... ,一個或多個,而還可以以陣列方式使用其中之料。length大於等於1
child傳回的是XML
children傳回的是XMLList
child(1)等於childrem()[1] 的資料
attribute("參數名稱") 可以得到該參數的值
arrtibutes() 可以得到以參數組成的XMLList
appendChild(xml結點) 在最後端加入xml結點
insertChildBefore(目前結點,xml結點) 在現存xml結點前加入新的xml結點
delete xml.book[0].authors.author[1].@middle 刪除結點
XMLList 類別包含用來處理一個或多個 XML 元素的方法。 XMLList 物件可以代表一個或多個 XML 物件或元素 (包括多個節點或特質),所以您可以針對組成群組的元素或集合中的個別元素呼叫方法。
簡單說,
XML是
XMLList是
child傳回的是XML
children傳回的是XMLList
child(1)等於childrem()[1] 的資料
attribute("參數名稱") 可以得到該參數的值
arrtibutes() 可以得到以參數組成的XMLList
appendChild(xml結點) 在最後端加入xml結點
insertChildBefore(目前結點,xml結點) 在現存xml結點前加入新的xml結點
delete xml.book[0].authors.author[1].@middle 刪除結點
2007/10/24
dataProvider and DataGrid
1、flex有一個DataGrid可以製作資料表,而透過dataProvider,可以建立起DataGrid的內容。
2、dataProvider可以是Object或是Array,透過遠端得到的array資料傳給了dataProvider,就可以做資料庫的展現法。
< ! [ CDATA [
public var COLOR_ARRAY:Array =
[{label:"Red", data:"#FF0000"},
{label:"Green", data:"#00FF00"},
{label:"Blue", data:"#0000FF"} ];
]]>
2、dataProvider可以是Object或是Array,透過遠端得到的array資料傳給了dataProvider,就可以做資料庫的展現法。
< ! [ CDATA [
public var COLOR_ARRAY:Array =
[{label:"Red", data:"#FF0000"},
{label:"Green", data:"#00FF00"},
{label:"Blue", data:"#0000FF"} ];
]]>
2007/10/5
flex放入as的displayObject
先載入mx.core.UIComponent,再定義一個UIComponent,透過此Component將已寫好的as class罝入即可
import mx.core.UIComponent;
…
var c:UIComponent = new UIComponent();
c.addChild(new Sprite);
panel1.addChild(c);
import mx.core.UIComponent;
…
var c:UIComponent = new UIComponent();
c.addChild(new Sprite);
panel1.addChild(c);
2007/9/30
FLEX的MXML
flex使用了mxml語法與actionscript搭配來完成他的介面
參考網址
http://www.adobe.com/tw/devnet/flex/quickstart/coding_with_mxml_and_actionscript/
Application的容器,root標籤 panel容器,可放文字、圖小、標頭等等 放文字的容器 參考網址
http://www.adobe.com/tw/devnet/flex/quickstart/coding_with_mxml_and_actionscript/
2007/9/19
BitmapData轉ByteArray
BitmapData有一個方法,可以將BitmapData中的矩形區域的ARGB值轉為byteArray
getPixels(new Rectangle(0,0,bmp.width,bmp.height));
其中參數為BitmapData之中的的矩形區城
這樣就可以透過byteArray做運算
使用byteArray的readInt就可以讀取每一點的值,但轉出來的值為int,因此需要用uint轉成一般的argb的值
getPixels(new Rectangle(0,0,bmp.width,bmp.height));
其中參數為BitmapData之中的的矩形區城
這樣就可以透過byteArray做運算
使用byteArray的readInt就可以讀取每一點的值,但轉出來的值為int,因此需要用uint轉成一般的argb的值
2007/9/17
過濾器colorTransform的用法、上色
import flash.geom.ColorTransform;
var color:ColorTransform=dis.transform.colorTransform;
color.redMultiplier=0;
color.greenMultiplier=0;
color.blueMultiplier=0
color.alphaMultiplier=0
color.redOffset=100;
color.greenOffset=100;
color.blueOffset=100;
color.alphaOffset=0;
obj.transform.colorTransform=color;
--------------------------------------------------
結果為顏色
新紅色為 舊紅色*redMultiplier+redOffset
新綠色為 舊綠色*redMultiplier+redOffset
新藍色為 舊綠色*redMultiplier+redOffset
var color:ColorTransform=dis.transform.colorTransform;
color.redMultiplier=0;
color.greenMultiplier=0;
color.blueMultiplier=0
color.alphaMultiplier=0
color.redOffset=100;
color.greenOffset=100;
color.blueOffset=100;
color.alphaOffset=0;
obj.transform.colorTransform=color;
--------------------------------------------------
結果為顏色
新紅色為 舊紅色*redMultiplier+redOffset
新綠色為 舊綠色*redMultiplier+redOffset
新藍色為 舊綠色*redMultiplier+redOffset
2007/8/28
Matrix的重新設定
運用Matrix的identity()方法,可以將Matrix重設回初始設定值,也就是沒有變形功能的Matrix
程式碼:
var m:Matrix=new Matrix();
trace(m.toString());
m.scale(0.5,0.5);
trace(m.toString());
m.identity();
trace(m.toString());
結果:
(a=1, b=0, c=0, d=1, tx=0, ty=0)
(a=0.5, b=0, c=0, d=0.5, tx=0, ty=0)
(a=1, b=0, c=0, d=1, tx=0, ty=0)
程式碼:
var m:Matrix=new Matrix();
trace(m.toString());
m.scale(0.5,0.5);
trace(m.toString());
m.identity();
trace(m.toString());
結果:
(a=1, b=0, c=0, d=1, tx=0, ty=0)
(a=0.5, b=0, c=0, d=0.5, tx=0, ty=0)
(a=1, b=0, c=0, d=1, tx=0, ty=0)
2007/8/23
get_magic_quotes_gpc與addslashes
get_magic_quotes_gpc()
取得伺服器的magic_quotes_gpc的設定值,當 magic_quotes_gpc 為true時,所有的 ' (單引號), " (雙引號), \ (反斜線) and 空字元會自動轉為含有反斜線的溢出字元。
參考網址
http://member.ettoday.com/book/function.php-get_magic_quotes_gpc.htm
addslashes($var)
將變數中的如雙引號、單引號、反斜線等等加上斜線成為溢出字元。
參考網址
http://member.ettoday.com/book/function.php-AddSlashes.htm
兩個函式配合則為
$var=(get_magic_quotes_gpc())? $var :addslashes($var)
依伺服器設定決是$var是否需要加上溢出字元
取得伺服器的magic_quotes_gpc的設定值,當 magic_quotes_gpc 為true時,所有的 ' (單引號), " (雙引號), \ (反斜線) and 空字元會自動轉為含有反斜線的溢出字元。
參考網址
http://member.ettoday.com/book/function.php-get_magic_quotes_gpc.htm
addslashes($var)
將變數中的如雙引號、單引號、反斜線等等加上斜線成為溢出字元。
參考網址
http://member.ettoday.com/book/function.php-AddSlashes.htm
兩個函式配合則為
$var=(get_magic_quotes_gpc())? $var :addslashes($var)
依伺服器設定決是$var是否需要加上溢出字元
2007/8/21
loadVariables函式的用途
loadVariables函式
可用來與php、asp、cgi、perl、coldfusion等動態網頁語言做為連繫
loadVariables(url:String, target:Object, [method:String]) : Void
import_request_variables函式
php 4.0多了一種新方法,透過import_request_variables 函式,可以不用像以前設register_globals設定成on就可以存取get、post、cookie的傳來資料
http://www.php.net/manual/zh/function.import-request-variables.php
import_request_variables("gp", "rvar_");
gp是指get跟post得到的變數,如gpc就是指三個資料都接收
rvar_則是前置綴詞,如原本user_name就變成了rvar_user_namehttp://www.php.net/manual/zh/function.import-request-variables.php
2007/8/19
小試了一下php for flash
最近買了一本書, 『Php For Flash網站開發手扎』,作者是張亞飛,主要是已經過php的經驗,加上目前都在研究flash上面相關的應用與測試,還有一些過去未完成的心願,等等,畢盡多媒體與程式的整合才是我目前該做的事
書藉相關資料:
http://findbook.tw/book/9789867199812/basic
目前看了一點點,以這種進度來看似乎太摱了些,需要再加點油。
這種flash--php--mysql三者的連接,運用完全flash開發介面,php除理程式邏輯,mysql處理資料庫,感覺上是完全分工了,不會像以前寫php網頁跟程式攪在一點,不過flash似手也不是太理想的介面,雖然很好看,不過網頁處理速度、還好一些小功能,等等這些卻不是flash可以達成的,又有java script在。不知道程式在flash上是否有他的發展之路?
書藉相關資料:
http://findbook.tw/book/9789867199812/basic
目前看了一點點,以這種進度來看似乎太摱了些,需要再加點油。
這種flash--php--mysql三者的連接,運用完全flash開發介面,php除理程式邏輯,mysql處理資料庫,感覺上是完全分工了,不會像以前寫php網頁跟程式攪在一點,不過flash似手也不是太理想的介面,雖然很好看,不過網頁處理速度、還好一些小功能,等等這些卻不是flash可以達成的,又有java script在。不知道程式在flash上是否有他的發展之路?
可拖曳、破撞的物件
這次是可拖曳、碰撞的物件,繼承了之前的拖曳類別,再加上碰撞的功能,可以與自已同類別的物件相互碰撞,產生動作
package {
import flash.display.*;
import flash.events.*;
public class myHitObj extends myDrawObj {
static public var dispatcher:EventDispatcher=new EventDispatcher();
public function myHitObj(my_name:String,r:uint,color:uint) {
this.name=my_name;
this.graphics.beginFill(color);
this.graphics.drawCircle(0,0,r);
this.graphics.endFill();
this.addEventListener(MouseEvent.MOUSE_DOWN,start_hit);
this.addEventListener(MouseEvent.MOUSE_UP,stop_hit);
dispatcher.addEventListener("hittest",hittest);
}
public function start_hit(e:MouseEvent):void {
this.addEventListener(Event.ENTER_FRAME,send_hit_test);
}
public function stop_hit(e:MouseEvent):void {
this.removeEventListener(Event.ENTER_FRAME,send_hit_test);
}
public function send_hit_test(e:Event):void {
dispatcher.dispatchEvent(new HitEvent("hittest",this));
}
public function hittest(e:HitEvent):void {
//trace("sender is "+e.sender.name+" , i am "+this.name);
if (this!=e.sender) {
//被碰撞後的動作
if (this.hitTestObject(DisplayObject(e.sender))) {
//trace("hit");
dispatcher.removeEventListener("hittest",hittest);//記得要先移除,不然還是會繼續聽事件
//this.parent.removeChild(this);//trace(this.parent);
this.addEventListener(Event.ENTER_FRAME,have_hit);
}
}
}
public function have_hit(e:Event):void {
scaleX+=0.05;
scaleY+=0.05;
if (scaleX>=2) {
this.removeEventListener(Event.ENTER_FRAME,have_hit);
}
}
}
}
import flash.events.*;
class HitEvent extends Event {
private var _sender:Object;
public function HitEvent(type:String,the_sender:Object) {
_sender=the_sender;
//trace("sender is "+sender.name);
super(type);
}
public function get sender():Object {
return _sender;
}
}
package {
import flash.display.*;
import flash.events.*;
public class myHitObj extends myDrawObj {
static public var dispatcher:EventDispatcher=new EventDispatcher();
public function myHitObj(my_name:String,r:uint,color:uint) {
this.name=my_name;
this.graphics.beginFill(color);
this.graphics.drawCircle(0,0,r);
this.graphics.endFill();
this.addEventListener(MouseEvent.MOUSE_DOWN,start_hit);
this.addEventListener(MouseEvent.MOUSE_UP,stop_hit);
dispatcher.addEventListener("hittest",hittest);
}
public function start_hit(e:MouseEvent):void {
this.addEventListener(Event.ENTER_FRAME,send_hit_test);
}
public function stop_hit(e:MouseEvent):void {
this.removeEventListener(Event.ENTER_FRAME,send_hit_test);
}
public function send_hit_test(e:Event):void {
dispatcher.dispatchEvent(new HitEvent("hittest",this));
}
public function hittest(e:HitEvent):void {
//trace("sender is "+e.sender.name+" , i am "+this.name);
if (this!=e.sender) {
//被碰撞後的動作
if (this.hitTestObject(DisplayObject(e.sender))) {
//trace("hit");
dispatcher.removeEventListener("hittest",hittest);//記得要先移除,不然還是會繼續聽事件
//this.parent.removeChild(this);//trace(this.parent);
this.addEventListener(Event.ENTER_FRAME,have_hit);
}
}
}
public function have_hit(e:Event):void {
scaleX+=0.05;
scaleY+=0.05;
if (scaleX>=2) {
this.removeEventListener(Event.ENTER_FRAME,have_hit);
}
}
}
}
import flash.events.*;
class HitEvent extends Event {
private var _sender:Object;
public function HitEvent(type:String,the_sender:Object) {
_sender=the_sender;
//trace("sender is "+sender.name);
super(type);
}
public function get sender():Object {
return _sender;
}
}
2007/8/8
as3的拖曳物件
好像跟as2沒太大不同,事件管理變嚴謹了,但也變麻煩了。可能是我還不夠熟練的關系吧
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class myDrawObj extends Sprite
{
public function myDrawObj():void
{
this.addEventListener(MouseEvent.MOUSE_DOWN,mouse_down_handler);
this.addEventListener(MouseEvent.MOUSE_UP,mouse_up_handler);
}
public function mouse_down_handler(e:MouseEvent):void
{
this.startDrag();
}
public function mouse_up_handler(e:MouseEvent):void
{
this.stopDrag();
}
}
}
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
public class myDrawObj extends Sprite
{
public function myDrawObj():void
{
this.addEventListener(MouseEvent.MOUSE_DOWN,mouse_down_handler);
this.addEventListener(MouseEvent.MOUSE_UP,mouse_up_handler);
}
public function mouse_down_handler(e:MouseEvent):void
{
this.startDrag();
}
public function mouse_up_handler(e:MouseEvent):void
{
this.stopDrag();
}
}
}
2007/8/7
Timer與TimerEvent
Timer計時器的使用
可以每幾秒執行一個函式
import flash.events.TimerEvent;
import flash.utils.Timer;
var timer:Timer=new Timer(1000,0);
//毫秒,次數,0代表無限次
timer.addEventListener(TimerEvent.TIMER,onTick);
//事件名稱,執行函式或方法
timer.start();
//開始
ps~
TimerEvent.TIMER 計時器事件
TimerEvent.TIMER_COMPLETE 最後一次計時器事件
可以每幾秒執行一個函式
import flash.events.TimerEvent;
import flash.utils.Timer;
var timer:Timer=new Timer(1000,0);
//毫秒,次數,0代表無限次
timer.addEventListener(TimerEvent.TIMER,onTick);
//事件名稱,執行函式或方法
timer.start();
//開始
ps~
TimerEvent.TIMER 計時器事件
TimerEvent.TIMER_COMPLETE 最後一次計時器事件
2007/7/30
飄葉,無風
onMouseDown=function()
{
var tmp=this.createEmptyMovieClip("obj"+this.getNextHighestDepth(),this.getNextHighestDepth());
tmp._x=_xmouse;
tmp._y=_ymouse;
tmp.onEnterFrame=function()
{
tmp._y+=1;
}
var myleaf=tmp.attachMovie("leaf",
"myeaf"+this.getNextHighestDepth(),
this.getNextHighestDepth(),{_xscale:50+random(50),_yscale:_xscale});
myleaf._rotation=random(360);
myleaf.degree=30+random(120);//30=?pi ,30/180
myleaf.r=120+random(40);
myleaf.dcx=myleaf.r*Math.cos(degree_to_pi(myleaf.degree));
myleaf.dcy=myleaf.r*Math.sin(degree_to_pi(myleaf.degree));
myleaf.cl=myleaf.degree < onenterframe="function()" _x="myleaf.r*Math.cos(degree_to_pi(myleaf.degree))-myleaf.dcx;" _y="myleaf.r*Math.sin(degree_to_pi(myleaf.degree))-myleaf.dcy;">=135)
{
myleaf.cl=-1;
}
if(myleaf.degree<45)
{
myleaf.cl=1;
}
myleaf.r+=(random(10)-5)/10;
myleaf.degree+=1*myleaf.cl;
myleaf._rotation+=10;
}
}
function degree_to_pi(degree:Number):Number
{
degree=degree/180;// 30/2pi
degree=Math.PI*degree;
return degree;
}
{
var tmp=this.createEmptyMovieClip("obj"+this.getNextHighestDepth(),this.getNextHighestDepth());
tmp._x=_xmouse;
tmp._y=_ymouse;
tmp.onEnterFrame=function()
{
tmp._y+=1;
}
var myleaf=tmp.attachMovie("leaf",
"myeaf"+this.getNextHighestDepth(),
this.getNextHighestDepth(),{_xscale:50+random(50),_yscale:_xscale});
myleaf._rotation=random(360);
myleaf.degree=30+random(120);//30=?pi ,30/180
myleaf.r=120+random(40);
myleaf.dcx=myleaf.r*Math.cos(degree_to_pi(myleaf.degree));
myleaf.dcy=myleaf.r*Math.sin(degree_to_pi(myleaf.degree));
myleaf.cl=myleaf.degree < onenterframe="function()" _x="myleaf.r*Math.cos(degree_to_pi(myleaf.degree))-myleaf.dcx;" _y="myleaf.r*Math.sin(degree_to_pi(myleaf.degree))-myleaf.dcy;">=135)
{
myleaf.cl=-1;
}
if(myleaf.degree<45)
{
myleaf.cl=1;
}
myleaf.r+=(random(10)-5)/10;
myleaf.degree+=1*myleaf.cl;
myleaf._rotation+=10;
}
}
function degree_to_pi(degree:Number):Number
{
degree=degree/180;// 30/2pi
degree=Math.PI*degree;
return degree;
}
飄葉,有風
onMouseDown = function () {
var j=random(5)+1;
for(var i=1;i=750) {
obj.removeMovieClip();
}
obj._y += obj._yspeed;
obj._x += obj._xspeed;
};
var mc = obj.attachMovie("ball", "mc"+this.getNextHighestDepth(), this.getNextHighestDepth(),{_rotation:random(360)});
mc.dy = -1;
mc.arc = random(360);
mc.radius = random(25)+15;
mc.onEnterFrame = function() {
mc._yscale += 10*mc.dy;
if (mc._yscale<=0 || mc._yscale>=100) {
mc.dy *= -1;
}
mc.arc -= 0.2;
mc._rotation -= 5;
mc._x = mc.radius*Math.cos(mc.arc);
mc._y = mc.radius*Math.sin(mc.arc);
};
}
var j=random(5)+1;
for(var i=1;i
obj.removeMovieClip();
}
obj._y += obj._yspeed;
obj._x += obj._xspeed;
};
var mc = obj.attachMovie("ball", "mc"+this.getNextHighestDepth(), this.getNextHighestDepth(),{_rotation:random(360)});
mc.dy = -1;
mc.arc = random(360);
mc.radius = random(25)+15;
mc.onEnterFrame = function() {
mc._yscale += 10*mc.dy;
if (mc._yscale<=0 || mc._yscale>=100) {
mc.dy *= -1;
}
mc.arc -= 0.2;
mc._rotation -= 5;
mc._x = mc.radius*Math.cos(mc.arc);
mc._y = mc.radius*Math.sin(mc.arc);
};
}
2007/7/29
AS3的事件練習,物件之間的連繫
搞半天,其實也不是很清楚as3的事件程序,不過小試出一些心得,其實跟as2有一些類似,雖然不是還不是很了解其羅輯,不過可以試試。
以下是一個同類別物件之間的訊息廣播溝通
1、as3亦是利用EventDispatcher傳送事件,但可以直接透過EventDispatcher類別定義的物件來做到事件的控管
2、所有的displayObject都是繼承至EventDispatcher,所以其實所有的顯示物件都可以拿來做管理事件的物件
3、與as2不同,不能再用dispatchEvent({type:"type",Target:this})這個方法廣播訊息,而改dispatchEvent(event),可以自定義event物件夾帶相關的參數、訊息等等
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.EventDispatcher;
import flash.events.Event;
public class ball extends Sprite
{
static public var dispatcher:EventDispatcher=new EventDispatcher();
public function ball(Name:String)
{
this.name=Name;
graphics.beginFill(0xeeeeee);
graphics.drawRect(0,0,50,50);
graphics.endFill();
addEventListener(MouseEvent.CLICK, mouse_click);
dispatcher.addEventListener("msc", msc);
}
public function mouse_click(e:MouseEvent)
{
trace(this.name+" : "+e.type+" from "+e.target.name);
//trace(this);
var myCustomEvent=new CustomEvent("msc",this)
dispatcher.dispatchEvent(myCustomEvent);
//dispatcher.doAction(this);
}
public function msc(e:CustomEvent)
{
//trace(this.name+" listen a event("+e.type+") from "+e);
//trace(e.from.name);
trace(this.name + " listen a event("+e.type+") from "+e.target+" by "+e.from.name);
}
}
}
import flash.events.Event;
class CustomEvent extends Event
{
public var from:Object;
public function CustomEvent(type:String,o:Object)
{
from=o;
trace("from is "+from);
super(type);
}
}
以下是一個同類別物件之間的訊息廣播溝通
1、as3亦是利用EventDispatcher傳送事件,但可以直接透過EventDispatcher類別定義的物件來做到事件的控管
2、所有的displayObject都是繼承至EventDispatcher,所以其實所有的顯示物件都可以拿來做管理事件的物件
3、與as2不同,不能再用dispatchEvent({type:"type",Target:this})這個方法廣播訊息,而改dispatchEvent(event),可以自定義event物件夾帶相關的參數、訊息等等
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.EventDispatcher;
import flash.events.Event;
public class ball extends Sprite
{
static public var dispatcher:EventDispatcher=new EventDispatcher();
public function ball(Name:String)
{
this.name=Name;
graphics.beginFill(0xeeeeee);
graphics.drawRect(0,0,50,50);
graphics.endFill();
addEventListener(MouseEvent.CLICK, mouse_click);
dispatcher.addEventListener("msc", msc);
}
public function mouse_click(e:MouseEvent)
{
trace(this.name+" : "+e.type+" from "+e.target.name);
//trace(this);
var myCustomEvent=new CustomEvent("msc",this)
dispatcher.dispatchEvent(myCustomEvent);
//dispatcher.doAction(this);
}
public function msc(e:CustomEvent)
{
//trace(this.name+" listen a event("+e.type+") from "+e);
//trace(e.from.name);
trace(this.name + " listen a event("+e.type+") from "+e.target+" by "+e.from.name);
}
}
}
import flash.events.Event;
class CustomEvent extends Event
{
public var from:Object;
public function CustomEvent(type:String,o:Object)
{
from=o;
trace("from is "+from);
super(type);
}
}
2007/7/28
IEventDispatcher
package flash.events
{
public interface IEventDispatcher
{
function addEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false,
priority:Integer=0,
useWeakReference:Boolean=false):Boolean;
function removeEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false):Boolean;
function dispatchEvent(eventObject:Event):Boolean;
function hasEventListener(eventName:String):Boolean;
function willTrigger(eventName:String):Boolean;
}
}
{
public interface IEventDispatcher
{
function addEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false,
priority:Integer=0,
useWeakReference:Boolean=false):Boolean;
function removeEventListener(eventName:String,
listener:Object,
useCapture:Boolean=false):Boolean;
function dispatchEvent(eventObject:Event):Boolean;
function hasEventListener(eventName:String):Boolean;
function willTrigger(eventName:String):Boolean;
}
}
2007/7/22
從原件庫新增物件到影片
目前還不是很清楚as3,不過小試一下
as2從原件庫新增元件到場景之中,是用attachMovie方法,而要新增的元件需要先設定連結
as3則更物件導向化了,元件庫的元件若要給AS使用,就必需變成類別,再從程式裡新增一個該類別的物件。再透過addChild或addChildAt放入顯示物件,而場景也是一種顯示物件。
var new_obj: class_name=new class_name();
addChild(new_obj);
事實上,運用addChild是將物件放置顯示清單內。
as2從原件庫新增元件到場景之中,是用attachMovie方法,而要新增的元件需要先設定連結
as3則更物件導向化了,元件庫的元件若要給AS使用,就必需變成類別,再從程式裡新增一個該類別的物件。再透過addChild或addChildAt放入顯示物件,而場景也是一種顯示物件。
var new_obj: class_name=new class_name();
addChild(new_obj);
事實上,運用addChild是將物件放置顯示清單內。
2007/7/20
is、as的功用
AS3多了is、as這兩種新的運算子
is可以用來測試物件是否為特定資料類形的成員、或特定類別介面的實做,回傳true或false
ex:
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // true
as可以用來檢驗物件是否為特定資料類形的的成員,但會回傳該值
ex:
var mySprite:Sprite = new Sprite();
trace(mySprite as Sprite); // [object Sprite]
trace(mySprite as DisplayObject); // [object Sprite]
trace(mySprite as IEventDispatcher); // [object Sprite]
trace(mySprite as Number); // null
as手冊p76
is可以用來測試物件是否為特定資料類形的成員、或特定類別介面的實做,回傳true或false
ex:
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // true
as可以用來檢驗物件是否為特定資料類形的的成員,但會回傳該值
ex:
var mySprite:Sprite = new Sprite();
trace(mySprite as Sprite); // [object Sprite]
trace(mySprite as DisplayObject); // [object Sprite]
trace(mySprite as IEventDispatcher); // [object Sprite]
trace(mySprite as Number); // null
as手冊p76
2007/7/18
AS3事件簡介
AS3的事件處理包含三個元素
事件來源、事件、回應
function eventResponse(eventObject:EventType):void
{
// 在此輸入為回應事件而執行的動作。
}
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);
EX:安鈕範例
function eventResponse(event:MouseEvent):void
{
trace("click");
}
btn.addEventListener(MouseEvent.CLICK, eventResponse);
當使用者按下按鈕btn就會執行eventResponse函式,也就會trace "clcik"
請參考使用手冊p33
事件來源、事件、回應
function eventResponse(eventObject:EventType):void
{
// 在此輸入為回應事件而執行的動作。
}
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);
EX:安鈕範例
function eventResponse(event:MouseEvent):void
{
trace("click");
}
btn.addEventListener(MouseEvent.CLICK, eventResponse);
當使用者按下按鈕btn就會執行eventResponse函式,也就會trace "clcik"
請參考使用手冊p33
2007/7/16
2007/7/12
影像、物體、追縱
步驟 1. 由讀入的影像統計出X軸上與背景相異之取樣像素的數量,如圖3-10所示,其中白點為相異的取樣像素,而圖示上方則為統計出的曲線。
步驟 2. 由統計出的曲線中找出最高點的位置,如圖3-10中X0,所標示的位置。
步驟 3. 由X0開始向右遞增,當統計值為零時停止,此時所在位置為Xmax。
步驟 4. 由X0開始向左遞減,當統計值為零時停止,此時所在位置為Xmin。
步驟 5. 由統計出的曲線中找出最高點的位置,如圖3-10中Y0,所標示的位置。
步驟 6. 由Y0開始往上遞增,當統計值為零時停止,此時所在位置為Ymax。
步驟 7. 由Y0開始往下遞減,當統計值為零時停止,此時所在位置為Ymin。
步驟 8. 當找出Xmin、Xmax、Ymin、Ymax四個值時,則圍繞出的區域為追蹤出的目標。
步驟 2. 由統計出的曲線中找出最高點的位置,如圖3-10中X0,所標示的位置。
步驟 3. 由X0開始向右遞增,當統計值為零時停止,此時所在位置為Xmax。
步驟 4. 由X0開始向左遞減,當統計值為零時停止,此時所在位置為Xmin。
步驟 5. 由統計出的曲線中找出最高點的位置,如圖3-10中Y0,所標示的位置。
步驟 6. 由Y0開始往上遞增,當統計值為零時停止,此時所在位置為Ymax。
步驟 7. 由Y0開始往下遞減,當統計值為零時停止,此時所在位置為Ymin。
步驟 8. 當找出Xmin、Xmax、Ymin、Ymax四個值時,則圍繞出的區域為追蹤出的目標。
2007/7/7
同一類別的物件之間事件廣播
讓同類別的物件其中之一發出廣播事件給同類別的所有物件
1、建立一個事件物件的類別,供其他物件使用,負責放出事件訊息與納入其他欲監聽事件的物件;
import mx.events.EventDispatcher;
class Event_manage
{
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public function Listener()
{
EventDispatcher.initialize(this);
}
}
2、欲接收訊息的物件在建立的時候,建立一個為Event_manage的共用物件e_manage,並將自已納入e_manage其下,使自已可以得到e_manage發出的事件訊息
class ball extends MovieClip
{
static public var e_manage:Event_manage=new Event_manage();//建立共用物件
public function ball()
{
e_manage.addEventListener("onpes",this);//將自已納入事件物件其下
}
public function onPress()
{
e_manage.dispatchEvent({Target:this, type:"onpes"})//藉由共用物件放出事件訊息
}
public function onpes(e:Object)
{
trace("onpes:"+e.Target+"==>>"+this);
}
}
1、建立一個事件物件的類別,供其他物件使用,負責放出事件訊息與納入其他欲監聽事件的物件;
import mx.events.EventDispatcher;
class Event_manage
{
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public function Listener()
{
EventDispatcher.initialize(this);
}
}
2、欲接收訊息的物件在建立的時候,建立一個為Event_manage的共用物件e_manage,並將自已納入e_manage其下,使自已可以得到e_manage發出的事件訊息
class ball extends MovieClip
{
static public var e_manage:Event_manage=new Event_manage();//建立共用物件
public function ball()
{
e_manage.addEventListener("onpes",this);//將自已納入事件物件其下
}
public function onPress()
{
e_manage.dispatchEvent({Target:this, type:"onpes"})//藉由共用物件放出事件訊息
}
public function onpes(e:Object)
{
trace("onpes:"+e.Target+"==>>"+this);
}
}
2007/6/23
會連鎖引爆的球(類別應用)
import mx.utils.Delegate;
class ball extends MovieClip
{
var _target:MovieClip;
public var id:Number;
public var start_hit=0;
private static var all_of_class:Array=new Array();
public function ball(parent:MovieClip,ball_name:String,icon_photo:String)
{
_target=parent.attachMovie(icon_photo,ball_name,
parent.getNextHighestDepth(),{_x:Math.random()*Stage.width,_y:Math.random()*Stage.height});
_target.stop();
_target.onEnterFrame=Delegate.create(this,freerun);
_target.onPress=Delegate.create(this,onpress_fun);
id=all_of_class.push(_target)-1; //矩陣長度減一
trace(id);
}
public function freerun(sss:String)
{
_target._x+=(Math.random()*Stage.width-_target._x)*0.05;
_target._y+=(Math.random()*Stage.height-_target._y)*0.05;
check_hit()
if(_target._currentframe==_target._totalframes)
{
_target.removeMovieClip();
}
}
public function onpress_fun()
{
start_hit=1;
trace(_target+"press");
}
public function check_hit()
{
if(start_hit==1)
{
_target.play()
for(var i=0;i
{
if(_target!=all_of_class[i] &&_target.hitTest(all_of_class[i]))
{
var tmp=all_of_class[i];
tmp.onPress();
}
}
}
}
}
class ball extends MovieClip
{
var _target:MovieClip;
public var id:Number;
public var start_hit=0;
private static var all_of_class:Array=new Array();
public function ball(parent:MovieClip,ball_name:String,icon_photo:String)
{
_target=parent.attachMovie(icon_photo,ball_name,
parent.getNextHighestDepth(),{_x:Math.random()*Stage.width,_y:Math.random()*Stage.height});
_target.stop();
_target.onEnterFrame=Delegate.create(this,freerun);
_target.onPress=Delegate.create(this,onpress_fun);
id=all_of_class.push(_target)-1; //矩陣長度減一
trace(id);
}
public function freerun(sss:String)
{
_target._x+=(Math.random()*Stage.width-_target._x)*0.05;
_target._y+=(Math.random()*Stage.height-_target._y)*0.05;
check_hit()
if(_target._currentframe==_target._totalframes)
{
_target.removeMovieClip();
}
}
public function onpress_fun()
{
start_hit=1;
trace(_target+"press");
}
public function check_hit()
{
if(start_hit==1)
{
_target.play()
for(var i=0;i
{
if(_target!=all_of_class[i] &&_target.hitTest(all_of_class[i]))
{
var tmp=all_of_class[i];
tmp.onPress();
}
}
}
}
}
2007/6/21
FLASH物件導向範例
FLASH物件導向範例
這是一個會自動追縱滑鼠的影片
FLA中只要加入
new my_icon(母影片片段,元件庫元件名稱即可)
AS類別 my_icon的程式碼:
import mx.utils.Delegate;
class my_icon extends MovieClip {
private var _target:MovieClip;
private var sx:Number;
private var sy:Number;
public function my_icon(parent, icon_photo)
{
_target=parent.attachMovie(icon_photo, "icon"+parent.getNextHighestDepth(),
parent.getNextHighestDepth(), {_x:Math.random()*550, _y:Math.random()*400});
sx=_target._x;
sy=_target._y;
_target.onEnterFrame=Delegate.create(this,okok);
}
public function okok()
{
//trace(_root._xmouse+","+_root._ymouse);
//trace(_target._x+","+_target._y)
if( Math.sqrt((sx-_root._xmouse)*(sx-_root._xmouse) + (sy-_root._ymouse)*(sy-_root._ymouse)) <70>
{
//trace(_target);
//_target._x=_root._xmouse;
//_target._y=_root._ymouse;
trace_mouse(_root._xmouse,_root._ymouse);
}else
{
trace_mouse(sx,sy);
}
}
public function trace_mouse(dx:Number,dy:Number)
{
_target._x+=Math.round((dx-_target._x)*0.2);
_target._y+=Math.round((dy-_target._y)*0.2);
}
}
這是一個會自動追縱滑鼠的影片
FLA中只要加入
new my_icon(母影片片段,元件庫元件名稱即可)
AS類別 my_icon的程式碼:
import mx.utils.Delegate;
class my_icon extends MovieClip {
private var _target:MovieClip;
private var sx:Number;
private var sy:Number;
public function my_icon(parent, icon_photo)
{
_target=parent.attachMovie(icon_photo, "icon"+parent.getNextHighestDepth(),
parent.getNextHighestDepth(), {_x:Math.random()*550, _y:Math.random()*400});
sx=_target._x;
sy=_target._y;
_target.onEnterFrame=Delegate.create(this,okok);
}
public function okok()
{
//trace(_root._xmouse+","+_root._ymouse);
//trace(_target._x+","+_target._y)
if( Math.sqrt((sx-_root._xmouse)*(sx-_root._xmouse) + (sy-_root._ymouse)*(sy-_root._ymouse)) <70>
{
//trace(_target);
//_target._x=_root._xmouse;
//_target._y=_root._ymouse;
trace_mouse(_root._xmouse,_root._ymouse);
}else
{
trace_mouse(sx,sy);
}
}
public function trace_mouse(dx:Number,dy:Number)
{
_target._x+=Math.round((dx-_target._x)*0.2);
_target._y+=Math.round((dy-_target._y)*0.2);
}
}
反彈練習
/*
onClipEvent (load) {
var max_move_x:Number = 1;
var max_move_y:Number = 1;
var dx:Number = 0;
var dy:Number = 0;
var dirx:Number = 1;
var diry:Number = 1;
var lastx = _x;
var lasty = _y;
var press_ch:Number=0;
var gg:Number=10;
setInterval(this, "setlast", 500);
function setlast():Void {
this.lastx = _x;
this.lasty = _y;
}
}
onClipEvent (enterFrame) {
//動力
_x += (this.dx*dirx);
_y += (this.dy*diry);
//阻力
this.dx = (this.dx>0) ? (this.dx-0.1) : 0;
this.dy = (this.dy>0) ? (this.dy-0.1) : 0;
//trace(bounds.xMin+","+bounds.yMin+","+bounds.xMax+","+bounds.yMax);
//改變方向
var bounds:Object = this.getBounds(_root);
if ((bounds.xMin<0>550 &&amp;amp; this.dirx>0)) {
this.dirx *= -1;
}
if ((bounds.yMin<0>400 &&amp;amp; this.diry>0)) {
this.diry *= -1;
}
}
on (press) {
this.dx = 0;
this.dy = 0;
this.startDrag();
this.press_ch=1;
}
on (release, releaseOutside) {
this.press_ch=0;
this.stopDrag();
if (_x>this.lastx) {
this.dirx = 1;
this.dx = this.max_move_x*(_x-this.lastx)*0.2;
} else if (_xthis.lasty) {
this.diry = 1;
this.dy = this.max_move_y*(_y-this.lasty)*0.2;
} else if (_y
this.diry = -1;
this.dy = this.max_move_y*(this.lasty-_y)*0.2;
}
}
*/
onClipEvent (load) {
var max_move_x:Number = 1;
var max_move_y:Number = 1;
var dx:Number = 0;
var dy:Number = 0;
var dirx:Number = 1;
var diry:Number = 1;
var lastx = _x;
var lasty = _y;
var press_ch:Number=0;
var gg:Number=10;
setInterval(this, "setlast", 500);
function setlast():Void {
this.lastx = _x;
this.lasty = _y;
}
}
onClipEvent (enterFrame) {
//動力
_x += (this.dx*dirx);
_y += (this.dy*diry);
//阻力
this.dx = (this.dx>0) ? (this.dx-0.1) : 0;
this.dy = (this.dy>0) ? (this.dy-0.1) : 0;
//trace(bounds.xMin+","+bounds.yMin+","+bounds.xMax+","+bounds.yMax);
//改變方向
var bounds:Object = this.getBounds(_root);
if ((bounds.xMin<0>550 &&amp;amp; this.dirx>0)) {
this.dirx *= -1;
}
if ((bounds.yMin<0>400 &&amp;amp; this.diry>0)) {
this.diry *= -1;
}
}
on (press) {
this.dx = 0;
this.dy = 0;
this.startDrag();
this.press_ch=1;
}
on (release, releaseOutside) {
this.press_ch=0;
this.stopDrag();
if (_x>this.lastx) {
this.dirx = 1;
this.dx = this.max_move_x*(_x-this.lastx)*0.2;
} else if (_x
this.diry = 1;
this.dy = this.max_move_y*(_y-this.lasty)*0.2;
} else if (_y
this.diry = -1;
this.dy = this.max_move_y*(this.lasty-_y)*0.2;
}
}
*/
如何從原件庫中,把影片物件丟入場景
如何從原件庫中,把影片物件丟入場景呢?
1、
在原件庫中的影片原件上>右鍵>連結>連結屬性:
識別名稱:定義要在AS裡產要用的物件類別名稱。
並在匯出給AS使用打勾
2、
var 容器:MovieClip=this.attachMovie("識別名稱","產生的影片名稱",深度);
另外再定義容器的所在他置即可
3、
參考書本9-5頁
1、
在原件庫中的影片原件上>右鍵>連結>連結屬性:
識別名稱:定義要在AS裡產要用的物件類別名稱。
並在匯出給AS使用打勾
2、
var 容器:MovieClip=this.attachMovie("識別名稱","產生的影片名稱",深度);
另外再定義容器的所在他置即可
3、
參考書本9-5頁
由一個物件發出訊息給另一個物件
如何由一個物件發出訊息給另一個物件呢?
1、預先載入import mx.events.EventDispatcher;套件
EventDisatcher套件可以給予Flash中的類別有廣播事件和接收事件的能力。載入後,就可使用addEventListener()加入接收事件、removeEventListener()移除接收事件、dispatchEvent()廣播事件函式。
2、載入後,仍需要另定義宣告每個函式
public var addEventListener:Function;
public var removeEventListener:Function;
private var dispatchEvent:Function;
3、要讓目前物件有事件發的功能,初始化。
EventDispatcher.initialize(this);
4、廣播事件訊息
diapatchEvent是針對類別內部的事件傳送方法。
diapatchEvent({type:"事件的類別名稱",欲傳遞的參數或物件});
5、讓欲對事件有反應的物件有接受的功能
物件.addEventListener("事件的類別名稱",執行函式名稱)
1、預先載入import mx.events.EventDispatcher;套件
EventDisatcher套件可以給予Flash中的類別有廣播事件和接收事件的能力。載入後,就可使用addEventListener()加入接收事件、removeEventListener()移除接收事件、dispatchEvent()廣播事件函式。
2、載入後,仍需要另定義宣告每個函式
public var addEventListener:Function;
public var removeEventListener:Function;
private var dispatchEvent:Function;
3、要讓目前物件有事件發的功能,初始化。
EventDispatcher.initialize(this);
4、廣播事件訊息
diapatchEvent是針對類別內部的事件傳送方法。
diapatchEvent({type:"事件的類別名稱",欲傳遞的參數或物件});
5、讓欲對事件有反應的物件有接受的功能
物件.addEventListener("事件的類別名稱",執行函式名稱)
將flash資訊儲存在cookie之中,SharedObject的使用
var myobject:SharedObject = SharedObject.getLocal("name");
從電腦中載入name中的資料,如果沒有則建立一個。
myobject.data.userName從中取得userName的資料
myobject.clear()清空電腦中存的資料
myobject.flush()立即存檔。
從電腦中載入name中的資料,如果沒有則建立一個。
myobject.data.userName從中取得userName的資料
myobject.clear()清空電腦中存的資料
myobject.flush()立即存檔。
檢視flash是否讀完,或讀到
_framesloaded可以得知目前影片讀取的情形,如果影片總長120,未讀完是0,讀完就變120,可以判斷_framesloaded是否等於120,決定是否讀完。
_root.onEnterFrame = function() {
if (this._framesloaded//判斷是否讀完
this.gotoAndPlay(1);//繼續留在同一個影格
var pctLoaded:Number = Math.round(this.getBytesLoaded()/this.getBytesTotal()*100);//計算百分比
bar_mc._xscale = pctLoaded;
} else {
this.gotoAndStop(2);//跳下一個影格
}
};
stop();
_root.onEnterFrame = function() {
if (this._framesloaded
this.gotoAndPlay(1);//繼續留在同一個影格
var pctLoaded:Number = Math.round(this.getBytesLoaded()/this.getBytesTotal()*100);//計算百分比
bar_mc._xscale = pctLoaded;
} else {
this.gotoAndStop(2);//跳下一個影格
}
};
stop();
flash,攝影機運用,使用攝影機抓取影像
還沒有加入互動
希望不久的將來可以放入一些互動
import flash.display.BitmapData;
var map :BitmapData = new BitmapData(320,240,true, 0);
var cam:Camera=Camera.get();
//cam.setMode(320,240,10,true);
webcam.attachVideo(cam);
_root.createEmptyMovieClip("fake",this.getNextHighestDepth());
onEnterFrame=function()
{
map.draw(webcam);
var clr=map.getPixel(webcam._xmouse,webcam._ymouse);
trace(clr.toString(16));
}
希望不久的將來可以放入一些互動
import flash.display.BitmapData;
var map :BitmapData = new BitmapData(320,240,true, 0);
var cam:Camera=Camera.get();
//cam.setMode(320,240,10,true);
webcam.attachVideo(cam);
_root.createEmptyMovieClip("fake",this.getNextHighestDepth());
onEnterFrame=function()
{
map.draw(webcam);
var clr=map.getPixel(webcam._xmouse,webcam._ymouse);
trace(clr.toString(16));
}
flash影片百分比
_root.getBytesLoaded()
目前已讀的byte數
_root.getBytesTotal()
總byte數
100*(_root.getBytesLoaded()/_root.getBytesTotal())
已讀百分比
if(_root.getBytesLoaded()<_root.getBytesTotal())
檢查是影片是否已讀完
stop();
this.onEnterFrame=function()
{
if(_root.getBytesLoaded()<_root.getBytesTotal())
{
gotoAndPlay(1);
}
bar._xscale=Math.round(100*(_root.getBytesLoaded()/_root.getBytesTotal()))
}
目前已讀的byte數
_root.getBytesTotal()
總byte數
100*(_root.getBytesLoaded()/_root.getBytesTotal())
已讀百分比
if(_root.getBytesLoaded()<_root.getBytesTotal())
檢查是影片是否已讀完
stop();
this.onEnterFrame=function()
{
if(_root.getBytesLoaded()<_root.getBytesTotal())
{
gotoAndPlay(1);
}
bar._xscale=Math.round(100*(_root.getBytesLoaded()/_root.getBytesTotal()))
}
訂閱:
文章 (Atom)