Actionscript 3.0 - 轉換 as2.0 createEmptyMovieClip 至3.0

在網路上你也許搜尋過,你想要快速動態建立大量MovieClip

在2.0 你會用 createEmptyMovieClip , 但是到了as3.0已經

沒有
createEmptyMovieClip



如果你要快速複製物件在你在as3.0可以用addChild方法

但是如果是想要快速動態建立空MovieClip實體



那我們就要使用到new MovieClip 並且利用空陣列將new

好的MovieClip儲存起來



//as3.0 ----------------------------------

//以下為as3.0取代 2.0
createEmptyMovieClip




var mc:Array = new Array();

for (var i:int = 1 ; i <= 99 ; ++i) {


   mc[i]  = new MovieClip();

   addChild(mc[i]);

}



要控制的目標便是  mc[n]

n -- 指的是你所設定的物件





ActionScript3.0 - 2D 彈幕講座


相信各位都玩過類以下這張圖(早期遊戲:雷電)的平面2D遊戲,

除了本身畫面之外,最重要的部份也是我們最好奇是,它的子
彈,我這邊介紹稱為"彈幕",到底是怎麼做出來的?,或許你
沒有想過這問題,或是看過沒有去多想它,或是把它當成理所
當然的一部份!事實上一點也不!


要做彈幕首先必須知道一些基礎:


1.基本的物件座標操作(敵人與子彈移動座標相關)
2.Math.sin() cos()參數應用
3.new物件與addChild後name的運用
4.removeChild相關



一樣廢話不多說馬上開始!
註:如果以下基礎觀念都不想看的話,那..請拉到最後下載範例!


1.子彈的建立

請在元件庫隨意畫一個子彈,以下圖為例為它類別命名,在此是
命名為 enemy_bullet


2.子彈的排列

子彈的排列考量到以下幾點:

2.1 子彈的旋轉角
2.2 繞半圓路線排列

2.1子彈旋轉角解說:

eb.rotation=-(90-i*(180/20));//每一個子彈旋轉角

簡單說就我們希望把rotation角度 從 90 變化到-90
180是總度數,20是你要產生的子彈數(同迴圈數)


2.2 繞半圓路線排列

到底要怎麼動態讓子彈排成一個弧形?
註:不想看數學邏輯及廢話的人請跳過此步驟!!


很簡單,我們從兩個方向去討論它的邏輯!(參考下圖)
我們若只看 y 軸,實際上它只是先往下再往上的一個路逕
我們若只看 x 軸,其實它只是一個平移一段距離的路逕



說那有什麼算法可以剛好符合這兩個需求?
有,非常好的是我們高中數學三角函數又派上用場,這時候
也許你又想回去重學你的數學了,在這裡分別應用sin跟cos
兩個簡單特性讓它們完成這項工作!!

參考以下兩張圖

(以下是sin的參數,我用紅圈標起來,當參數0-3點多的位置
剛好可以形成一個先往下再往上的函數)
對flash座標來說,數值座標越大就是往下跑.



(以下是cos,當參數是0-3.多,它的位置從1下降到-1)
剛好可以拿來當x平移距離



r*Math.cos(i*3.2/20)+enemy.x;
r*Math.sin(i*3.2/20)+enemy.y;

很簡單吧? 看不懂自己開個新檔把Math.sin拿參數進去try數據!!
這裡 r是半逕,你產生的子彈用以上參數產生的位置充其量也不過
是在-1 到1的距離在跑,這時候你只要乘上一個倍數,子彈就會擴
展開來!




3.彈幕如何散開?

以上我們製作好的彈幕是不會動的,因為實際上數據是固定的,但
我們發現,實際上子彈擴散時,變動的其實只是半逕的大小,因此
我們只要動態的改變半逕讓它不斷的增加,子彈便會射出去!

(r<300)? r+=5:r=0; //讓r半逕不斷增加超過300 則又重新開始



4.多重彈幕?

多重彈幕實計上只是發射的時間延後一個時間點而已

timer_var=getTimer()/1000;
if(timer_var>=0.3){  //希望晚0.3秒後 發射第二波彈幕
(r2<300)? r2+=5:r2=0;
ger_bullet2();
}

//當然了 如果你要一直發射很多重彈幕,你可以改進更好的寫法!



5.最重要的部份,子彈的移除!

上面的部份都理所當然的被建立發射,可是實際上在flash裡被建
立的物件並不會因此而消失.以下是建立與移除的邏輯過程!


半逕1子彈被建立 --> 半逕2子彈被建立(此時半逕1子彈仍存在) --->

於是我們在這之中加了removeChild


 var tmp_eb:MovieClip =  MovieClip(root).getChildByName("eb" + i);
       if( tmp_eb != null ){
        MovieClip(root).removeChild(tmp_eb );
        }//if
   }//for



6.補充說明

所建立的子彈在上述說明要被移除, 我們裡是使用.name的方法
來移除,當然你也可以使用removeChildAt ,指定深度,可是這樣
會太麻煩了,建議還是給它.name後再來移除name即可!

    var eb:enemy_bullet=new enemy_bullet();
    MovieClip(root).addChild(eb);
    eb.name = "eb" + String( i );



範例下載

NXT -8547 1號, 2號,3號機怪手





























3號機怪手完成!


圖片這台是我的第一台試做機, 這台叫做NXT 8547(2009)
是由樂高公司研發的樂高機器人,可程式化核心,可由
電腦藍牙遠端遙控操作.
















可變形多種組合,隨意組合成任何樣子

在網路上看到許多試做的樂高機器人,其中包含了許多模樣,最近看
了堆高機的機器人,於是我想那我來做一台怪手好了,心急之下做出
這模樣,做完了也發現了問題,(這台是打算用捲線的方法來連動把
怪手拉起)



3號機誕生,後來仔細研究了怪手的手臂液壓的連動結構,重新研究製作了
一個新怪手3號機!!





  • 留言者: 探奇自然科學教室
  • Email: touch_classroom@yahoo.com.tw
  • 網址: http://tw.myblog.yahoo.com/touch_classroom/
  • 日期: 2010-07-17 08:59:53
很棒的創作!GOOD!




  • 留言者: ray
  • Email: fray@gmail.com
  • 網址:
  • 日期: 2010-07-30 08:22:06
你真厲害 有空可以多聊聊




  • 留言者: kuma
  • Email:
  • 網址:
  • 日期: 2011-04-01 22:50:42
太酷了!

讚讚讚!

藍牙操作更酷!

ActionScript - System.setClipboard 將文字複製至剪貼簿

常常會看到網站提供 ,按一個鍵就會將flash內文字複製到剪貼簿裡
實際上它是一個騙術,為什麼這麼說呢,因為你複製的不是你所看到
的flash文字,而是寫在內部的變數內容,

不太懂對吧,我們看看以下幾行代碼.

註;\r\n (換行)

var myDATA:String="文字測試\r\n前面這符號是換行相當於shift+
enter\r\n\r\n兩個這符號是空一行";

System.setClipboard(myDATA);

//看到上面的myDATA了嗎,原來是拷貝myDATA變數內容

  • 留言者: Nakara Tuleva
  • Email: oxedoido@hotmail.com
  • 網址:
  • 日期: 2011-09-21 20:58:00
Isso!

nextframe() - 日本遊戲開發網站


http://nextframe.jp/
nextframe() 是在日本開發已久的遊戲小站, 內容包含了網站內部許多
開發人員的創作作品,非常幸運的還可以在他們的blog看到他們開發的
手稿喔!!


Actionscript - FPS (as2.0 & as3.0)

AS2.0:
this.onEnterFrame =
function() {
if (this.lastTimer != undefined) {
var
timerDiff:Number = getTimer()-this.lastTimer;
var fps:Number =
int(10000/timerDiff)/10;
trace(fps);
}
this.lastTimer =
getTimer();
};


AS3.0:

import
flash.utils.getTimer;
import flash.display.Sprite;

this.addEventListener(Event.ENTER_FRAME,GetTimerExample);

function
GetTimerExample(e:Event):void {
if(this.lastTimer != undefined){

var timerDiff:Number = getTimer()-this.lastTimer;
var
fps:Number = int(10000/timerDiff)/10;
trace("fps="+fps);

};
this.lastTimer=getTimer()
}