第五話 TQC認證 第四類 綜合應用II  檔案下載
EX6.星際大戰
  • 開啟檔案FLD0506.FLA。
  • 於場景中第一個影格的"載入遊戲"按鈕,加上動作。
    on(release){
    n=1;
    gotoAndPlay(2);
    }

  • 於場景中第二個影格的"感應"淡藍色隱形按鈕,加上動作。
    on (press) {
    //在此設定發射子彈的功能
    //子彈元件的名稱已設定為laser,需在kiwi元件上方出現
    //取得飛機座標
    x=kiwi._x;
    y=kiwi._y;
    //複製子彈元件
    duplicateMovieClip(laser,"laser"+n,n);
    //子彈在飛機相同位置出現
    setProperty("laser"+n,_x,x);
    setProperty("laser"+n,_y,y);
    n++;
    }
  • 將右側的元件庫中影片片段資料夾中,"子彈"影片片段元件雙擊進入編輯環境,第一個影格加上影格動作。
    //設定子彈前進路線
    setProperty("",_y,getProperty("",_y)-20);
    //子彈超出舞台範圍就消失
    if(getProperty("",_y)<0){
    removeMovieClip("");
    }
    //打中第一隻怪獸
    if(this.hitTest(_root.meteo)){
    _root.meteo.gotoAndPlay(28);
    _root.hitno++;
    }
    //打中第二隻怪獸
    if(this.hitTest(_root.meteo2)){
    _root.meteo2.gotoAndPlay(14);
    _root.hitno++;
    }
    //打中第三隻怪獸
    if(this.hitTest(_root.meteo3)){
    _root.meteo3.gotoAndPlay(52);
    _root.hitno++;
    }
  • 第2各影格動作為gotoAndPlay(1);
  • 回到場景中,於"行為指令"圖層第3個影格中加入動作。

    startDrag("kiwi",true);
    mouse.hide();
    duplicateMovieClip("earth","earth"+i,i);
    setProperty("earth" add i, _x, Random(700));
    i++;
    if(i>50){
    i=1;
    }

    //在此設定被怪獸打中的程式碼
    if(_root.meteo.hitTest(_root.kiwi)){_root.live--;}
    if(_root.meteo2.hitTest(_root.kiwi)){_root.live--;}
    if(_root.meteo3.hitTest(_root.kiwi)){_root.live--;}
    //********************
    _root.totale=hitno;
    if(_root.live==0){
    gotoAndPlay(5);
    }

  • 於場景第5各影格,"Once More"按鈕上加上動作。
    on(release){
    stopAllSounds();
    gotoAndPlay(2);
    }
EX7.貪吃蛇
  • 開啟檔案FLD0507.FLA。
  • 於AS圖層第一個影格,加上動作。
    stop();
    function init(){

    score=0; //初始分數
    dir=0; //貪食蛇開始不動
    bodyLong=0; //貪食蛇身體長度

    snakePos=[]; //記錄貪食蛇經過的路
    snakeMC._visible=true;
    //貪食蛇初始位置
    snakeMC._x=197;
    snakeMC._y=293;
    //遊戲區域範圍
    xMin = bgMC._x;
    yMin = bgMC._y;
    xMax = bgMC._x + bgMC._width;
    yMax = bgMC._y + bgMC._height;

    newFood();
    }

    //隨機在遊戲區域內產生食物
    function newFood(){
    attachMovie("foodMC","foodMC",100);
    foodMC._x=int(random(bgMC._width-foodMC._width))+xMin+foodMC._width/2;
    foodMC._y=int(random(bgMC._height-foodMC._height))+yMin+foodMC._height/2;
    }

    //偵測按鍵來決定貪食蛇方向
    function ctrlDir(){
    if(Key.isDown(Key.LEFT)){
    dir="left";
    }else if(Key.isDown(Key.RIGHT)){
    dir="right";
    }else if(Key.isDown(Key.UP)){
    dir="up";
    }else if(Key.isDown(Key.DOWN)){
    dir="down";
    }

    }

    //貪食蛇移動的設定
    function snakeMove(){
    //在遊戲範圍之內移動
    if(snakeMC._x > xMin && snakeMC._x < xMax && snakeMC._y > yMin && snakeMC._y < yMax){
    //依鍵盤方向,每次前進15px
    if(dir=="left"){
    snakeMC._x-=15;
    }else if(dir=="right"){
    snakeMC._x+=15;
    }else if(dir=="up"){
    snakeMC._y-=15;
    }else if(dir=="down"){
    snakeMC._y+=15;
    }
    //把新的位置放進陣列中
    snakePos.unshift({x:snakeMC._x,y:snakeMC._y});
    }else{
    //貪食蛇超出遊戲範圍
    gotoAndStop(2);
    removeSnake();
    }

    //將貪食蛇身體從第一個到最後一個重新定位
    for(i=0;i<=bodyLong;i++){
    _root["snakeMC"+i]._x=snakePos[i].x;
    _root["snakeMC"+i]._y=snakePos[i].y;
    }
    detCollision();
    ctrlDir();
    eatFood();
    }

    //吃到食物後,分數加一分,身體變長一格,並重新產生食物
    function eatFood(){
    if(snakeMC.hitTest(foodMC)){
    _root.score+=1;
    newFood();
    growUp();
    }
    }

    //身體變長
    function growUp(){
    bodyLong++;
    attachMovie("snakeMC","snakeMC"+bodyLong,bodyLong);
    }

    //貪食蛇吃到自己
    function detCollision(){
    for(i=0;i<=bodyLong;i++){
    if(snakeMC.hitTest(_root["snakeMC"+i])){
    gotoAndStop(2);
    snakeMC._visible=false;
    removeSnake();
    }
    }
    }

    //移除身體
    function removeSnake(){
    for(j=0;j<=bodyLong;j++){
    _root["snakeMC"+j].removeMovieClip();
    }
    }

    init();

  • 於第2各影格,"GAME OVER"影片片段元件上加上動作。
    onClipEvent(keyDown){
    if(Key.isDown(Key.SPACE)){//按下空白鍵重新開始
    _root.gotoAndStop(1);
    }
    }
EX8.情緒發洩器
  • 開啟檔案FLD0508.FLA。
  • 於動作圖層第一個影格加上動作stop();
  • 於動作圖層第二個影格加上動作。
    score=0;
    startDrag(hammer,true);
    time.gotoAndPlay(1);

  • 於元件庫中的"計時器"影片片段元件,雙擊進入編輯環境,第一個影格動作為time=30;
  • 第二個影格動作為。
    if(time==0){
    stop();
    _root.gotoAndStop(9);
    }

  • 第13個影格動作為。
    time--;
    gotoAndPlay(2);

  • 於元件庫中的"人動移動"影片片段元件,雙擊進入編輯環境,第6個影格中的"感應區"淡藍色隱形按鈕元件,加上動作。
    on(press,rollOver){
    _root.hammer.gotoAndPlay(2);
    gotoAndPlay(14);
    _root.score++;
    }

  • 回到場景中,動作圖層的第9各影格加入動作。
    stop();
    stopDrag();
    stopAllSounds();

  • 並於"遊戲開始"按鈕加上動作。
    on (press) {
    gotoAndPlay(2);
    }
EX9.漂浮的字母球
  • 開啟檔案FLD0509.FLA。
  • 於場景中第一影格加上影格動作。
    //------------------------------------
    var BallNum:Number = 5; // 字母球數目
    var default_alpha:Number = 50; // 字母球預設透明度
    //--------------------------------------
    // 判斷與紀錄字母球閒置狀態相關的變數
    var Idle:Boolean = true; //閒置狀態
    var Last_Ball:Number = 0; //己經在zoom-in狀態的球
    var Current_Ball:Number; //下一個要zoom-in的球
    var Last_Time:Number = getTimer(); //上一次切換的時間
    var Current_Time:Number; //目前的時間
    //----------------------------------------
    // 計算字母球位置所需的變數
    var OffsetX:Number = 160;
    var OffsetY:Number = 100;
    var perspective:Number = 500;
    var TY:Number = 360;
    var Xangle:Number = 0;
    var Yangle:Number = 0;
    var Xang:Number;
    var Yang:Number;
    var NewPos:Number = 300;
    var x = new Array();
    var y = new Array();
    var z = new Array();
    var xpos = new Array();
    var ypos = new Array();
    var zpos = new Array();
    var Depth = new Array();
    var Pos_List = [200, 300, 330, 390, 440];
    //-----------------------------------------
    var count:Number;
    //-----------------------------------------
    // 初始化字母球的狀態(位置與透明度)
    for ( count = 1; count <= BallNum ; count++ ) {
    z[count] = Math.cos(count * 45 * 0.018) * 50;
    y[count] = Math.sin(count * 45 * 0.018) * 50;
    x[count] = count * 40 - BallNum / 2 * 40;
    eval("b"+count)._alpha = default_alpha;
    }
    //-----------------------------------------
    // 設定 ball 位置
    function setBallPos(Ball,x,y)
    {
    eval("b" + Ball)._x = x;
    eval("b" + Ball)._y = y;
    }
    //控制BALL放大
    function BallIn0 (Ball)
    {
    eval("b"+Ball).gotoAndPlay("in");
    eval("b"+Ball)._alpha=100;
    }

    function BallIn (Ball)
    {
    if(Last_Ball){
    BallOut(Last_Ball);
    Last_Ball=0;
    }
    Idle=false;
    NewPos=Pos_List[Ball-1];
    BallIn0(Ball);
    }
    function BallOut0 (Ball)
    {
    eval("b"+Ball).gotoAndPlay("out");
    eval("b"+Ball)._alpha=default_alpha;
    }
    function BallOut (Ball)
    {
    Idle=true;
    BallOut0(Ball);
    }

  • 於場景中第二影格加上影格動作。
    // 計算字母球新位置
    for ( count = 1; count <= BallNum ; count++ ) {
    Xang = Xangle * 0.018;
    Yang = Yangle * 0.018;
    zpos[count] = z[count] * Math.cos(Yang) - x[count] * Math.sin(Yang);
    xpos[count] = z[count] * Math.sin(Yang) + x[count] * Math.cos(Yang);
    ypos[count] = y[count] * Math.cos(Xang) - zpos[count] * Math.sin(Xang);
    zpos[count] = y[count] * Math.sin(Xang) + zpos[count] * Math.cos(Xang);
    Depth[count] = 1 / (zpos[count] / perspective + 1);
    // 設定字母球位置
    setBallPos(count,xpos[count] * Depth[count] + OffsetX, ypos[count] * Depth[count] + OffsetY);
    }

    // 計算字母球相對位移值
    TY = TY + (NewPos - TY) / 5;
    Xangle = TY;

    // 閒置狀態處理程式
    if(Idle){
    Current_Time=getTimer();
    //若閒置超過2秒
    if(Current_Time-Last_Time>2000){
    Current_Ball=random(BallNum)+1;//隨機選取
    if(Last_Ball != Current_Ball){//判斷是否為同一顆球
    if(Last_Ball)BallOut0(Last_Ball);
    Last_Ball=Current_Ball;//紀錄那一顆有變化
    NewPos=Pos_List[Last_Ball-1];//設定位移值
    Last_Time=Current_Time;//紀錄現在時間
    BallIn0(Ball);
    }
    }
    }

EX5.整數計算機

  • 於as圖層中第1各影格動作如下:

    stop();
    //-------------------------------------
    function NumKeyPress(nn) {
    if(ClearFlag){
    ClearFlag=false;
    out.text="0";
    }
    if(out.length<8){
    out.text=String(Number(out.text)*10+Number(nn));
    }
    }
    //-------------------------------------
    function OpPress(op){
    if(!ClearFlag){
    DoCalc(LastOp,LastOpd,Number(out.text));
    LastOpd=Result;
    }
    LastOp=op;
    out.text=String(LastOpd);
    ClearFlag=true;
    }
    //-------------------------------------
    function DoCalc(op,opd1,opd2) {
    switch(op){
    case 1:
    Result=opd1 + opd2;
    break;
    case 2:
    Result=opd1 - opd2;
    break;
    case 3:
    Result=opd1 * opd2;
    break;
    case 4:
    Result=int(opd1 / opd2);
    break;
    default:
    Result=opd2;
    break;
    }
    }
  • 場景中"CE"按鈕動中:

    on(release){
    out.text="0";
    }

  • 場景中"OFF"按鈕動中:

    on(release){
    fscommand("quit");
    }

  • 其餘按鈕皆加上鍵盤動作,例:

    場景中"0"按鈕動中:

    on (release, keyPress "0") {
    NumKeyPress('0');
    }