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;
}

飄葉,有風

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);

};
}

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);
}
}

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;
}
}

2007/7/22

從原件庫新增物件到影片

目前還不是很清楚as3,不過小試一下

as2從原件庫新增元件到場景之中,是用attachMovie方法,而要新增的元件需要先設定連結

as3則更物件導向化了,元件庫的元件若要給AS使用,就必需變成類別,再從程式裡新增一個該類別的物件。再透過addChild或addChildAt放入顯示物件,而場景也是一種顯示物件。

var new_obj: class_name=new class_name();
addChild(new_obj);

事實上,運用addChild是將物件放置顯示清單內。

2007/7/20

浮點數變整數

直接使用

int(浮點數);

負數時

int(-3.7)
會回傳-3

類形轉換

var myBoolean:Boolean = true;
var myINT:int = int(myBoolean);

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

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

AS3的Int、Uint、Number

AS3提供了三種定義數目的變數
Number:雙精度浮點數,過去AS2所使用的,也因此速度不太快
Int:正負自然數,
Uint:無號自然數,含零的正整數

2007/7/16

AS3的方法與參數(parameter )

定義方法
function fun_name(a:int,b:int):void
{
...
}


如果輸入的參數(parameter)不明確,像不知道有幾個參數,即可用下面這種方法
function fun_name(...args):void
{
...
}

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四個值時,則圍繞出的區域為追蹤出的目標。

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);
}
}