1. 程式人生 > >flash 遊戲設計筆記 人物行走一種做法

flash 遊戲設計筆記 人物行走一種做法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

 

 

 

目前來講,我依然還不會做一個小遊戲出來。做遊戲需要知道很多東西,這個flash 只是一個自娛自樂的東西。要是看了誤導就別怪了。

好,製作這個東西之前,其實這篇文章有一些重複了,不過只是一種demo式的演示。通過鍵盤來控制控制一個人物走動。

上面是一張透明的png點陣圖。有四個不同的方向。可以看到 基本上上下左右都齊全了。現在來。我們就來一起玩一下這個東西。

由於這個東西不涉及很強的面向物件 和重用性。因此看下面的程式碼的時候需要注意一下。在這裡的目的,只是希望一起玩一下這個flash。

 

好廢話少說。有了這張圖,筆者就打算通過複製畫素的方式來將這種圖片切成16份,每一份都代表了一張不同方向的不同步的圖片。

 

首先,先通過一個類,複製這張點陣圖。返回一個二維陣列。注意,裡面的類是可以進行修改。這裡放出一個比較簡單的。沒有擴充套件的

 

 

[c-sharp]
view plain copy print ?
  1. package com.game  
  2. {  
  3.     /* 切割點陣圖類,返回一個二維陣列*/  
  4.     // version 1.0 版本  
  5.     import flash.display.Sprite;  
  6.     import flash.display.Bitmap;  
  7.     import flash.display.BitmapData;  
  8.     import flash.geom.*;  
  9.     public class BitmapSplice   
  10.     {  
  11.         private var Step:Array=new Array();//存取步數陣列  
  12.         public function BitmapSplice()  
  13.         {  
  14.               
  15.         }  
  16.         //進行切割  
  17.         public function Splice(bitmapdata:BitmapData,titleWidth:uint,titleHeight:uint):Array  
  18.         {  
  19.             var iWidth:int=bitmapdata.width /titleWidth;  
  20.             var iHeight:int=bitmapdata.height /titleHeight;  
  21.             for (var i:uint=0; i < titleHeight; i++)  
  22.             {  
  23.                 var array:Array=new Array();  
  24.                 for (var j:uint=0; j < titleWidth; j++)  
  25.                 {  
  26.                     var tempBMP:BitmapData=new BitmapData(iWidth,iHeight,true,0x00000000);  
  27.                     tempBMP.copyPixels(bitmapdata,new Rectangle(j * iWidth,i * iHeight,iWidth,iHeight),new Point(0,0));  
  28.                     array.push(tempBMP);  
  29.                 }  
  30.                 this.Step.push(array);  
  31.             }  
  32.             bitmapdata.dispose();  
  33.                
  34.           return this.Step;  
  35.   
  36.         }  
  37.     }  
  38. }  
package com.game{ /* 切割點陣圖類,返回一個二維陣列*/ // version 1.0 版本 import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.*; public class BitmapSplice  {  private var Step:Array=new Array();//存取步數陣列  public function BitmapSplice()  {     }  //進行切割  public function Splice(bitmapdata:BitmapData,titleWidth:uint,titleHeight:uint):Array  {   var iWidth:int=bitmapdata.width /titleWidth;   var iHeight:int=bitmapdata.height /titleHeight;   for (var i:uint=0; i < titleHeight; i++)   {    var array:Array=new Array();    for (var j:uint=0; j < titleWidth; j++)    {     var tempBMP:BitmapData=new BitmapData(iWidth,iHeight,true,0x00000000);     tempBMP.copyPixels(bitmapdata,new Rectangle(j * iWidth,i * iHeight,iWidth,iHeight),new Point(0,0));     array.push(tempBMP);    }    this.Step.push(array);   }   bitmapdata.dispose();              return this.Step;  } }}

 

通過這個類,我們獲取到一個二維陣列陣列。 下面我們就使用一個鍵盤來控制一下。

為了展示,只是方便演示一下。可以對其進行更改。後面的 有時間去放出其他的版本,因為不是一個遊戲,因此只能當是玩一下,學習裡面的填充點陣圖的方法了。

[c-sharp] view plain copy print ?
  1. package   
  2. {  
  3.     import flash.display.MovieClip;  
  4.     import flash.display.Sprite;  
  5.     import flash.events.*;  
  6.     import flash.display.Bitmap;  
  7.     import flash.display.BitmapData;  
  8.     import flash.ui.Keyboard;  
  9.     import com.game.BitmapSplice;  
  10.     public class Main extends MovieClip  
  11.     {  
  12.   
  13.         private var array:Array;//儲存圖片序列的  
  14.         private var bitmap:BitmapSplice;  
  15.         private var Step:int=0;//步數  
  16.         private var Direction:uint=0;//方向  
  17.         private var speed:int=10;  
  18.   
  19.         private var Isup:Boolean;  
  20.         private var Isdown:Boolean;  
  21.         private var Isleft:Boolean;  
  22.         private var Isright:Boolean;  
  23.   
  24.         private var bitmapdata:BitmapData=new Player(0,0);  
  25.         private var contain:Sprite=new Sprite();  
  26.   
  27.         private var vx:Number;  
  28.         private var vy:Number;  
  29.         public function Main()  
  30.         {  
  31.             init();  
  32.         }  
  33.         //初始化  
  34.         private function init():void  
  35.         {  
  36.             addChild(contain);  
  37.             bitmap=new BitmapSplice();//切割點陣圖  
  38.             array=bitmap.Splice(bitmapdata,4,4);//將點陣圖分成很多塊  
  39.             addEventListener(Event.ENTER_FRAME,gameLoop);  
  40.             keyboardListener();  
  41.   
  42.         }  
  43.         //遊戲迴圈  
  44.         private function gameLoop(event:Event):void  
  45.         {  
  46.             control();  
  47.             paint();//繪製填充  
  48.   
  49.         }  
  50.         //鍵盤監聽  
  51.         private function keyboardListener():void  
  52.         {  
  53.             stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);  
  54.             stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler);  
  55.         }  
  56.         private function KeyDownHandler(event:KeyboardEvent):void  
  57.         {  
  58.             switch (event.keyCode)  
  59.             {  
  60.   
  61.                 case Keyboard.UP :  
  62.                     Isup=true;  
  63.                     break;  
  64.   
  65.                 case Keyboard.DOWN :  
  66.                     Isdown=true;  
  67.                     break;  
  68.   
  69.                 case Keyboard.LEFT :  
  70.                     Isleft=true;  
  71.                     break;  
  72.   
  73.                 case Keyboard.RIGHT :  
  74.                     Isright=true;  
  75.                     break;  
  76.   
  77.   
  78.             }  
  79.         }  
  80.         private function KeyUpHandler(event:KeyboardEvent):void  
  81.         {  
  82.             switch (event.keyCode)  
  83.             {  
  84.   
  85.                 case Keyboard.UP :  
  86.                     Isup=false;  
  87.                     break;  
  88.   
  89.                 case Keyboard.DOWN :  
  90.                     Isdown=false;  
  91.                     break;  
  92.   
  93.                 case Keyboard.LEFT :  
  94.                     Isleft=false;  
  95.                     break;  
  96.   
  97.                 case Keyboard.RIGHT :  
  98.                     Isright=false;  
  99.                     break;  
  100.   
  101.                     break;  
  102.             }  
  103.         }  
  104.         //填充繪圖  
  105.         private function paint():void  
  106.         {  
  107.             contain.graphics.clear();  
  108.             contain.graphics.beginBitmapFill(array[Direction][Step]);  
  109.             contain.graphics.drawRect(0,0,array[Direction][Step].width,array[Direction][Step].height);  
  110.             contain.graphics.endFill();  
  111.         }  
  112.         //移動  
  113.         private function Move(directtion:uint,dx:int,dy:int):void  
  114.         {  
  115.             Direction=directtion;  
  116.             Step++;  
  117.             vx=dx*speed;  
  118.             vy=dy*speed;  
  119.             if (Step>3)  
  120.             {  
  121.                 Step=0;  
  122.             }  
  123.             contain.x+=vx;//產生位移  
  124.             contain.y+=vy;//產生位移  
  125.         }  
  126.         private function control():void  
  127.         {  
  128.             if (Isup &&!Isdown && !Isleft &&!Isright)  
  129.             {  
  130.                 Move(3,0,-1);  
  131.             }  
  132.             if (Isdown && !Isup && !Isleft &&!Isright)  
  133.             {  
  134.                 Move(0,0,1);  
  135.             }  
  136.             if (Isleft && !Isup && !Isdown && !Isright)  
  137.             {  
  138.                 Move(1,-1,0);  
  139.             }  
  140.             if (Isright && !Isup && !Isdown && !Isleft)  
  141.             {  
  142.                 Move(2,1,0);  
  143.             }  
  144.             if (!Isup && !Isdown && !Isleft && !Isright)  
  145.             {  
  146.                 Step=0;  
  147.             }  
  148.         }  
  149.     }  
  150. }  
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.ui.Keyboard; import com.game.BitmapSplice; public class Main extends MovieClip {  private var array:Array;//儲存圖片序列的  private var bitmap:BitmapSplice;  private var Step:int=0;//步數  private var Direction:uint=0;//方向  private var speed:int=10;  private var Isup:Boolean;  private var Isdown:Boolean;  private var Isleft:Boolean;  private var Isright:Boolean;  private var bitmapdata:BitmapData=new Player(0,0);  private var contain:Sprite=new Sprite();  private var vx:Number;  private var vy:Number;  public function Main()  {   init();  }  //初始化  private function init():void  {   addChild(contain);   bitmap=new BitmapSplice();//切割點陣圖   array=bitmap.Splice(bitmapdata,4,4);//將點陣圖分成很多塊   addEventListener(Event.ENTER_FRAME,gameLoop);   keyboardListener();  }  //遊戲迴圈  private function gameLoop(event:Event):void  {   control();   paint();//繪製填充  }  //鍵盤監聽  private function keyboardListener():void  {   stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDownHandler);   stage.addEventListener(KeyboardEvent.KEY_UP,KeyUpHandler);  }  private function KeyDownHandler(event:KeyboardEvent):void  {   switch (event.keyCode)   {    case Keyboard.UP :     Isup=true;     break;    case Keyboard.DOWN :     Isdown=true;     break;    case Keyboard.LEFT :     Isleft=true;     break;    case Keyboard.RIGHT :     Isright=true;     break;   }  }  private function KeyUpHandler(event:KeyboardEvent):void  {   switch (event.keyCode)   {    case Keyboard.UP :     Isup=false;     break;    case Keyboard.DOWN :     Isdown=false;     break;    case Keyboard.LEFT :     Isleft=false;     break;    case Keyboard.RIGHT :     Isright=false;     break;     break;   }  }  //填充繪圖  private function paint():void  {   contain.graphics.clear();   contain.graphics.beginBitmapFill(array[Direction][Step]);   contain.graphics.drawRect(0,0,array[Direction][Step].width,array[Direction][Step].height);   contain.graphics.endFill();  }  //移動  private function Move(directtion:uint,dx:int,dy:int):void  {   Direction=directtion;   Step++;   vx=dx*speed;   vy=dy*speed;   if (Step>3)   {    Step=0;   }   contain.x+=vx;//產生位移   contain.y+=vy;//產生位移  }  private function control():void  {   if (Isup &&!Isdown && !Isleft &&!Isright)   {    Move(3,0,-1);   }   if (Isdown && !Isup && !Isleft &&!Isright)   {    Move(0,0,1);   }   if (Isleft && !Isup && !Isdown && !Isright)   {    Move(1,-1,0);   }   if (Isright && !Isup && !Isdown && !Isleft)   {    Move(2,1,0);   }   if (!Isup && !Isdown && !Isleft && !Isright)   {    Step=0;   }  } }}

 

程式碼不是很長,這裡和上次切割點陣圖的介紹是一樣的(可以到上次文章觀看 這裡不補充)。但是這次改變了一個方式來顯示點陣圖。

介紹一下,點陣圖顯示的方法。有幾種的方式,上次的一種就是採用Bitmap類顯示,通過addChild 加入顯示列表進行影象的顯示。而這次則通過繪圖API的方式來填充點陣圖。後面,會繼續探討flash  10新增的著色器渲染一個位圖。這裡暫時不討論。

[c-sharp] view plain copy print ?
  1. //填充繪圖  
  2.         private function paint():void  
  3.         {  
  4.             contain.graphics.clear();  
  5.             contain.graphics.beginBitmapFill(array[Direction][Step]);  
  6.             contain.graphics.drawRect(0,0,array[Direction][Step].width,array[Direction][Step].height);  
  7.             contain.graphics.endFill();  
  8.         }  
//填充繪圖  private function paint():void  {   contain.graphics.clear();   contain.graphics.beginBitmapFill(array[Direction][Step]);   contain.graphics.drawRect(0,0,array[Direction][Step].width,array[Direction][Step].height);   contain.graphics.endFill();  }

主要使用繪圖API來繪製。這樣能夠顯示出一些點陣圖出來了。

最後 貼上一個背景,看起來的效果。你就可以控制一個人物走動了

 (裝上一個背景,就可以騙人一下了)

 這個小程式,並不涉及到很高深的知識,在這裡筆者只是希望能夠帶給一點學習flash 的歡樂而這份歡樂就是我想分享的東西。

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述