DEMO
1.Object:
3.Algorithm
基本上先簡易分為子彈與飛機兩種父類別,然後例如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以及相應的演算法也可以,有的人用靜態陣列是非常不好的,一個是物件數量在編譯時期就確定,而且不論有多少物件都必須迭代完整個陣列會使效能非常差。
物件在平面的移動的方法可以將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之類的,當主角位置改變時就改變背景貼圖的轉換矩陣的位移即可,背景圖要比畫面大,然後要確定角色移動所看到的背景不會大出這張背景。
一般俗稱的FPS即Frame Per Second在STG遊戲維持50以上才會順暢,然後為了防止更新閃爍可以自己實做一個類似D3DX或者OpenGL的Front Buffer & Back Buffer。
5.ETC
其實STG的子彈演算法可以套用在類似洛克人之類的ATC遊戲上,然後要實做背景捲軸可以用D3DX或者OpenGL之類的,當主角位置改變時就改變背景貼圖的轉換矩陣的位移即可,背景圖要比畫面大,然後要確定角色移動所看到的背景不會大出這張背景。
沒有留言:
張貼留言