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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/truhfcg/article/details/83887255
今日推荐