Search

2012年6月17日 星期日

2D-STG

    基本上2D-STG很好寫,我覺得比AVG還好寫,不過主要還是關卡編排要編排的好玩比較有難度不然其實很簡單,去年因為作業要接觸到Java所以配著Document用兩、三個小時寫個簡單的STG來從零熟悉Java,所以我直接用Java版本(我是把高中寫的C++版轉成Java)做說明還可以馬上看結果比較快。

DEMO


1.Object:

        基本上先簡易分為子彈與飛機兩種父類別,然後例如C++可以將其宣告為pure virtual或者Java的abstract,在由一些延伸去繼承這兩者並且實做自己的方法,例如擴散彈繼承子彈然後實做自己的子彈演算法,或者小兵機繼承飛機然後實做自己的攻擊方式或是移動方式等等...以下直接複製上面DEMO的Source Code:


abstract class BaseObject
{
   public double x,y,speed;

   public boolean Remove(){return false;}

   abstract public void Draw(Graphics g);
   abstract public void Update();
}

abstract class Plane extends BaseObject
{
   public double hp;

   public void Update(){}
   public void Update(double move_x,double move_y){}

   public double GetX(){return this.x;}
   public double GetY(){return this.y;}
 
   public int Fire(List Bullet){return 0;}
   public int Fire(List Bullet,double tx,double ty){return 0;}
}

abstract class Bullet extends BaseObject
{
   public double power;

   public boolean HitTest(double tx,double ty)
   {
      if(tx < this.x + 5 &&
     tx + 20 > this.x + 5 &&
     ty < this.y + 5 &&
     ty + 20 > this.y + 5){
  return true;
      }
      return false;
   }
}


2.Manager

        對於物件的管理最簡單的方法是使用STL的List,因為基本上遊戲中所有物件每個Frame都必須被更新所以使用List可以得到比較好的效能,例如C++可以std::list<Bullet>或者Java可以List<Bullet>,然後如果有新的物件要增加就使用push_back(Bullet)或是add(Bullet)之類的方法,而當飛機被摧毀或是子彈跑出畫面外就可以使用remove(iterator)之類的方法將之消除,然而一個遊戲會有很多子彈以及敵機,針對每種寫一個迭代有點太累人,所以可以直接std::list<std::list<Bullet> >或者List<List<Bullet> >,然後push_back(std::list<Bullet>)或add(List<Bullet>),將上面的各種類型的子彈以及飛機的List集中管理寫一次迭代每次更新即可,如果不要使用STL也可以自己實做個Memory Pool以及相應的演算法也可以,有的人用靜態陣列是非常不好的,一個是物件數量在編譯時期就確定,而且不論有多少物件都必須迭代完整個陣列會使效能非常差。

3.Algorithm
        
        物件在平面的移動的方法可以將X軸加上cos(angle)而Y軸要加上sin(angle),三角函數使用相應的Math Library即可,另外要注意的是大多都是傳入弧度值(C++跟Java都是),所以C++如果使用D3DX可以用D3DXToRadian(angle)或者Java的Math.toRadians(angle)方法取得傳入角度的弧度值,當然也可以自己將角度乘上 π / 180 即可得到弧度。

4.Frame Buffer

        一般俗稱的FPS即Frame Per Second在STG遊戲維持50以上才會順暢,然後為了防止更新閃爍可以自己實做一個類似D3DX或者OpenGL的Front Buffer & Back Buffer。


5.ETC

        其實STG的子彈演算法可以套用在類似洛克人之類的ATC遊戲上,然後要實做背景捲軸可以用D3DX或者OpenGL之類的,當主角位置改變時就改變背景貼圖的轉換矩陣的位移即可,背景圖要比畫面大,然後要確定角色移動所看到的背景不會大出這張背景。

沒有留言:

張貼留言