游戏框架之心得体会(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.knowsky.com)