天天看點

FLEX和Actionscript開發FLASH遊戲6

FLEX和Actionscript開發FLASH遊戲6

2010年11月15日

  使用FLEX和Actionscript開發FLASH 遊戲-碰撞檢測GameObject.as package{ import flash.display.*; import flash.events.*; import flash.geom.*; public class GameObject { //object position public var position:Point=new Point(0,0); //higher ZOrder objects are rendered on top of lower ones public var zOrder:int=0; //the bitmap data to diaplay public var graphics:GraphicsResource=null; //true if the object is active in the game public var inuse:Boolean=false; public var collisionArea:Rectangle; public var collisionName:String=CollisionIdentifiers.NONE; public function get CollisionArea():Rectangle { return new Rectangle(position.x,position.y,collisionArea.widt h,collisionArea.height); } public function GameObject() { } public function startupGameObject(graphics:GraphicsResource,positi on:Poin,z:int=0):void { if(!inuse) { this.graphics=graphics; this.zOrder=z; this.position=position.clone(); this.inuse=true; GameObjectManager.Instance.addGameObject(this); setupCollision(); } } public function shutdown():void { if(inuse) { graphics=null inuse=false; GameObjectManager.Instance.removeGameObject(this); } } public function copyToBackBuffer(db:BitmapData):void { db.copyPixels(graphics.bitmap,graphics.bitmap.rect ,position, graphics.bitmapAlpha,new Point(0,0),true); } public function enterFrame(dt:Number):void { } public function mouseDown(event:MouseEvent):void { } public function click(event:MouseEvent):void { } public function mouseUp(event:MouseEvent):void { } public function mouseMove(event:MouseEvent):void { } protected function setupCollision():void { collisionArea=graphics.bitmap.rect; } public function collision(other:GameObject):void { } } } 我們增加了兩個新的屬性:碰撞區(collisionArea)和碰撞名(collisionName)。碰撞區屬性代表了上文所述的描述碰撞區的矩形。碰撞名屬性是賦給遊戲對象用來定義它是哪種對象的名字,至少對于碰撞檢測系統而言的種類。例如:被遊戲者發出的子彈的碰撞名為"遊戲者武器",而一架敵機的碰撞名則是"敵人"。預設狀态下我們把它設定為"None",使用CollisionIdentifiers類的NONE屬性。

  另外我們也增加了三個新的函數:碰撞(collision)、碰撞區域(CollisionArea)和設定碰撞(setupCollision)。碰撞函數是一個空函數,以待被繼承類方法所覆寫。設定碰撞函數被用來負責儲存碰撞檢測系統下的圖檔的大小。碰撞區域函數傳回碰撞區矩形目前在螢幕上的位置。

  你可能想問為什麼我們還麻煩地設定一個collsionArea屬性,它實際上和graphics.bitmap.rect是完全一樣的。隻是因為後面(在第七章)我們将增加遊戲的動畫部分。動畫類将用自己的轉門的邏輯覆寫設定碰撞函數。雖然現在碰撞區域和圖檔的矩形一樣。

  CollisionIdentifiers.as

  package

  {

  public class CollisionIdentifiers

  {

  public static const NONE:String="None";

  public static const PLAYER:String="Player";

  public static const PLAYERWEAPON:String="PlayerWeapon";

  public static const ENEMYWEAPON:String="EnemyWeapon";

  public static const ENEMY:String="Enemy";

  public static const POWERUP:String="Powerup";

  }

  }

  就像ZOrders類一樣,CollisionIdentifiers類被用來儲存一些預定義的靜态屬性;這裡就是碰撞名。這麼做的目的還是為了促進自文檔化。CollisionIdentifiers.PLAYER的意思不言自明,然而字元串"Player"卻沒有同樣的内在含義。

  現在讓我們看看在GameObjectManager類中做的改變。