flash 遊戲設計筆記 人物行走一種做法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
目前來講,我依然還不會做一個小遊戲出來。做遊戲需要知道很多東西,這個flash 只是一個自娛自樂的東西。要是看了誤導就別怪了。
好,製作這個東西之前,其實這篇文章有一些重複了,不過只是一種demo式的演示。通過鍵盤來控制控制一個人物走動。
上面是一張透明的png點陣圖。有四個不同的方向。可以看到 基本上上下左右都齊全了。現在來。我們就來一起玩一下這個東西。
由於這個東西不涉及很強的面向物件 和重用性。因此看下面的程式碼的時候需要注意一下。在這裡的目的,只是希望一起玩一下這個flash。
好廢話少說。有了這張圖,筆者就打算通過複製畫素的方式來將這種圖片切成16份,每一份都代表了一張不同方向的不同步的圖片。
首先,先通過一個類,複製這張點陣圖。返回一個二維陣列。注意,裡面的類是可以進行修改。這裡放出一個比較簡單的。沒有擴充套件的
[c-sharp]
- 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 ?- 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 ?- //填充繪圖
- 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 的歡樂而這份歡樂就是我想分享的東西。