- 最近研究的一段时间的游戏代码,获益不小!细节的掌握不多,但对游戏的框架有了一定的了解。
- 现总结出几套游戏框架,在此写出供大家参考!
- 文章仅代表个人观点,如有观点请在论坛讨论
- MSN alfylove@hotmail.com
- 合金代码 下载地址 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.codesnippet.cn/detail/12122012930.html
来源: http://www.codesnippet.cn/detail/12122012930.html