游戲框架之心得體會(1)
最近研究的一段時間的游戲代碼,獲益不??!細節的掌握不多,但對游戲的框架有了一定的了解。
現總結出幾套游戲框架,在此寫出供大家參考!
文章僅代表個人觀點,如有觀點請在論壇討論
MSN alfylove@hotmail.com
文章出自 J2MEDEV 轉載請注名出處
合金代碼 下載地址 http://www.j2medev.com/Soft/src/game/200610/789.Html
Mid.java
開始啟動線程
public class Mid extends MIDlet implements Runnable
public Mid() {
mscreen = new Game();
Display.getDisplay(this).setCurrent(mscreen);
}
public void run(){
if(mscreen.PRocess()) this.notifyDestroyed();
}
public void startApp() {
(new Thread(this)).start();
}
public void pauseApp() {
mscreen.stayapp();
}
public void destroyApp(boolean unconditional) {
mscreen.exitapp();
}
}
//游戲主體部分
Game.java
public class Game extends Canvas {
public MScreen() {
face_load();//地圖數據
sound_load();//聲音載入
screen_index = SCREEN_RESSLOAD; //這個索引為游戲主索引
}
/////////////////////////////////
///////技巧部分/////////
///////////////////////////////
public final void refresh() { repaint(); serviceRepaints(); } //刷新屏幕
public final void stayapp() { running = false; } //退出循環
public final void exitapp() { exitapp = true; } //退出程序
//相對坐標的轉換
private final int toScreenx(int x) { return x - position_x; }
private final int toScreeny(int y) { return y - position_y; }
////////////////////////////////////////////
///////// ////////////
//////// 描繪 ////////////
////////////////////////////////////////////
protected void paint(Graphics g) {
if(process_lock) return; //游戲關鍵進程鎖
g.setClip(0,0,screen_w, screen_h);
process_draw();
}
protected void process_draw() {
if(process_lock) return;
switch(screen_index){
case SCREEN_MAINMENU: mainmenu_draw(); break;
case SCREEN_HELPINFO: helpinfo_draw(); break;
case SCREEN_COPYRIGH: copyrigh_draw(); break;
case SCREEN_GAMEBODY: gamebody_draw(); break;
case SCREEN_GAMEOVER: gameover_draw(); break;
case SCREEN_HIGHLIST: highlist_draw(); break;
case SCREEN_RESSLOAD: ressload_draw(); break;
case SCREEN_SELEGATE: selegate_draw(); break;
}
}
//////////////////////////////////////////////
/////////////// 按鍵處理//////////////
////////////////////////////////////////////
protected void keyPressed(int keyCode) {
setkeystate(keyConvert(keyCode), true);
process_key(keyConvert(keyCode));
}
protected void keyRepeated(int keyCode) {
setkeystate(keyConvert(keyCode), true);
}
protected void keyReleased(int keyCode) {
setkeystate(keyConvert(keyCode), false);
}
protected final void process_key(int keycode){
if(process_lock) return;
switch(screen_index){
case SCREEN_GAMEBODY: gamebody_key(keycode); break;
case SCREEN_MAINMENU: mainmenu_key(keycode); break;
case SCREEN_HELPINFO: helpinfo_key(keycode); break;
case SCREEN_COPYRIGH: copyrigh_key(keycode); break;
case SCREEN_GAMEOVER: gameover_key(keycode); break;
case SCREEN_HIGHLIST: highlist_key(keycode); break;
case SCREEN_SELEGATE: selegate_key(keycode); break;
case SCREEN_RESSLOAD: ressload_key(keycode); break;
}
}
///////////////////////////////////////////
///// 運行控制////////////////////
/////////////////////////////////////////
public final boolean process(){
int count = 0;
long secon = 0;
long timeold = 0;
long timenow = 0;
running = true;
while (running && !exitapp) {
if(exitapp) return true;
timenow = System.currentTimeMillis();
if (timenow >= interval + timeold) {//FPS控制參見文章 如何控制游戲中的FPS
http://www.j2medev.com/code/j2me/gui/200611/3802.html
timeold = timenow;
framenum = (framenum < 9999)? framenum +1 : 0;
process_tick();//轉入分支運行控制
//計算當前的刷新幀數
if(secon < (timenow / 1000)){
secon = timenow/1000;
framesec = count;
count = 1;
}else
count ++;
}
}
return exitapp;
}
public final void process_tick() {
if(process_lock) return;
switch(screen_index){
case SCREEN_GAMEBODY: gamebody_run(); break;
case SCREEN_MAINMENU: mainmenu_run(); break;
case SCREEN_HELPINFO: helpinfo_run(); break;
case SCREEN_COPYRIGH: copyrigh_run(); break;
case SCREEN_GAMEOVER: gameover_run(); break;
case SCREEN_HIGHLIST: highlist_run(); break;
case SCREEN_RESSLOAD: ressload_exec(); break;
case SCREEN_SELEGATE: selegate_run(); break;
}
}
////////////////////////////////
///////各部分方法/////////
///////////////////////////////
游戲分為GAMEBODY//游戲主體
MAINMENU//主菜單
HELPINFO//幫助信息
COPYRIGH//版權所有
HIGHLIST//高分顯示
RESSLOAD//載入畫面
SELEGATE//關卡選擇
7個部分
每個部分都有5個方法
以mainmenu為例寫出
//初使化
private final void mainmenu_init(){初使化mainmenu_index
mainmenu_index = 0;
}
////響應按鍵
private final void mainmenu_key(int keycode){/*里面內容省略*/
case KEY_SOFT1:
mainmenu_execute(mainmenu_index);//轉入按鍵執行
break;
}
//按鍵執行
private final void mainmenu_execute(int index){
/*按鍵響應相應命令 */ }
//命令描繪
private final void mainmenu_run(){
refresh();
//描繪部分
private final void mainmenu_draw(){}
}
總結來看這個游戲的框架是
主結構
構造函數(聲音載入圖片載入)
PAINT (描繪-->分支描繪)
RUN (運行-->分支運行)
KEY (按鍵響應-->分支按鍵)
分支結構
init()
key(int keycode)
execute(int index)//轉入命令執行(注 不是所有的都需要此執行可以把這個命令歸 進key執行)
run() //運行(描繪)
draw()
這個游戲很清晰的顯示游戲運行思路將大框架再小框架,便于修改和查找;
這里所給出的只是游戲框架部分,具體的AI和游戲主體框架出于篇幅沒有給出,希望這篇文章能對新手有一定幫助!
(出處:http://www.49028c.com)
新聞熱點
疑難解答