分享
 
 
 

游戏框架之心得体会(2)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

游戏框架之心得体会(2)

上次写到的合金代表框架,所有的框架内容都集中在1个类中。

也就是说大众的游戏(商业)的大都是这样的写法,为了节省空间!

今天要介绍的另一个框架体系是以Funmobile公司的代码为代表的,各个功能版块分别个为一个类,另外强烈推荐

这种代码的另一个优点是混合了高级UI和低级UI,个人认为游戏对菜单界面的美观程度要求不大。而且这种写发很利于

应用代码的书写!

MSN alfylove@hotmail.com

下面还是老习惯 先看我截取的代码

游戏都是那几个部分

开始游戏

关于

游戏帮助

最高分

游戏设置

游戏菜单

//主菜单 以下所有类都满足默认构造函数和按键控制

public class NokiaUI_menu extends List

implements CommandListener{

NokiaUI_menu(RollerMIDlet pMidlet, RollerLogic pLogic)

{

super("Menu", 3); }

public void commandAction (Command pCommand, Displayable pDisplay)

{} }

//最高分

public class NokiaUI_hiscore extends Form

implements CommandListener{}

//游戏帮助

public class NokiaUI_help extends Form

implements CommandListener {}

//游戏关于

public class NokiaUI_about extends Form

implements CommandListener{}

//游戏设置

public class NokiaUI_setting extends Form

implements CommandListener{}

//游戏暂停 实际是游戏中菜单

public class NokiaUI_pause extends List

implements CommandListener{}

RollerMIDlet.Java

/*在生命控制程序中所有的类都在此集合,实例化。

这种方法相当便利了各个类的调用*/

public class RollerMIDlet extends MIDlet

{

public RollerMIDlet()

{

mLogic = new RollerLogic(this);

mNokia = new NokiaUI_menu(this, mLogic);

mSetting = new NokiaUI_setting(this, mLogic);

mHiScore = new NokiaUI_hiscore(this, mLogic);

mHelp = new NokiaUI_help(this);

mAbout = new NokiaUI_about(this);

mPause = new NokiaUI_pause(this, mLogic);

}

protected void startApp()

throws MIDletStateChangeException

{

if(mLogic != null)

{

Display.getDisplay(this).setCurrent(mLogic);

mLogic.start();

}

}

protected void pauseApp()

{

if(mLogic != null)

mLogic.stop();

}

protected void destroyApp(boolean p0)

{

if(mLogic != null)

mLogic.stop();

}

void StartGame()

{

if(mLogic != null)

mLogic.NewGame();

}

void QuitGame()

{

destroyApp(false);

notifyDestroyed();

}

//转控分支

public void ToNokiaUI()

{

if(mNokia != null)

Display.getDisplay(this).setCurrent(mNokia);

}

public void ToNokiaUI_Setting()

{

if(mSetting != null)

Display.getDisplay(this).setCurrent(mSetting);

}

public void ToNokiaUI_HiScore()

{

mHiScore = null;

mHiScore = new NokiaUI_hiscore(this, mLogic);

if(mHiScore != null)

Display.getDisplay(this).setCurrent(mHiScore);

}

public void ToNokiaUI_Help()

{

if(mHelp != null)

Display.getDisplay(this).setCurrent(mHelp);

}

public void ToNokiaUI_About()

{

if(mAbout != null)

Display.getDisplay(this).setCurrent(mAbout);

}

public void ToNokiaUI_Pause()

{

if(mPause != null)

Display.getDisplay(this).setCurrent(mPause);

}

public void ReturnUI()

{

if(mLogic != null)

Display.getDisplay(this).setCurrent(mLogic);

}

private RollerLogic mLogic;

private NokiaUI_menu mNokia;

private NokiaUI_setting mSetting;

private NokiaUI_hiscore mHiScore;

private NokiaUI_help mHelp;

private NokiaUI_about mAbout;

private NokiaUI_pause mPause;

}

RollerLogic.java

//中控部分

//游戏的驱动所在,线程控制生命循环。

public class RollerLogic extends FullCanvas

implements Runnable

{

RollerLogic(RollerMIDlet pMidlet)

{

lThread = null;

maxsprite = 5;

sprite = new Image[maxsprite];

lMidlet = pMidlet;

lWidth = getWidth();

lHeight = getHeight();

lCanvas = new RollerCanvas(this);

Stage = 0;

m_bSoundOn = true;

m_bVibrationOn = true;

}

public synchronized void start()

{

if(lThread == null)

{

lThread = new Thread(this);

lThread.start();

}

}

public synchronized void stop()

{

lThread = null;

}

public void run()

{

Thread pThreadTemp = Thread.currentThread();

do

{

if(pThreadTemp != lThread)

break;

long lTimeStart = System.currentTimeMillis();

System.out.println("run");

repaint(0, 0, lWidth, lHeight);

serviceRepaints();

long lTimeTaken = System.currentTimeMillis() - lTimeStart;

if(lTimeTaken < (long)60)

try

{

synchronized(this)

{

Thread.sleep((long)60 - lTimeTaken);

}

}

catch(InterruptedException e)

{

System.out.println("error=".concat(String.valueOf(String.valueOf(e))));

}

} while(true);

}

public void paint(Graphics g)

{

lCanvas.paint(g);

System.out.println("paint");

}

public void keyPressed(int iKeyCode)

{

int _tmp = Stage;

lCanvas.keyPressed(iKeyCode);

}

public void keyReleased(int iKeyCode)

{

lCanvas.keyReleased(iKeyCode);

}

static int rand_no(int iRange)

{

int r = rand.nextInt() % iRange;

if(r < 0)

r = -r;

return r;

}

public void NewGame()

{

start();

lCanvas.InitStage(1);

}

public void UI_Newgame()

{

NewGame();

}

public void UI_Title()

{

start();

lCanvas.reset();

}

public void UI_Game()

{

start();

}

public void menu()

{

lMidlet.ToNokiaUI();

stop();

}

public void pause_menu()

{

lMidlet.ToNokiaUI_Pause();

stop();

}

public int getCanvas()

{

return lCanvas.showtitle;

}

public void ExitGame()

{

lMidlet.QuitGame();

}

private void Execute()

{

int _tmp = Stage;

}

public static int Stage;

public static final int Stage_Loading = 0;

public static final int Stage_Logo = 10;

public static final int Stage_Play = 50;

private static final int up = -1;

private static final int down = -2;

private static final int left = -3;

private static final int right = -4;

private static final int center = -5;

private static final int left_key = -6;

private static final int right_key = -7;

private static final int num_up = 50;

private static final int num_down = 56;

private static final int num_left = 52;

private static final int num_right = 54;

private static final Random rand = new Random(System.currentTimeMillis());

private Thread lThread;

private RollerMIDlet lMidlet;

private RollerCanvas lCanvas;

private GameRecord lRecord;

public GameEffect m_pEffect;

private static final int NO_SAVEDATA = 4;

private static final int LENGTH_SAVEDATA = 40;

public static int lWidth;

public static int lHeight;

private static String RecordValue;

public boolean m_bSoundOn;

public boolean m_bVibrationOn;

public int m_iTopScore;

int showsplash;

int maxsprite;

Image sprite[];

}

从截取代码来看 ,这个游戏的框架更为清晰,更便于修改。

总结就是

各个单元分别是1个单独的类!

每个类都拥有自己的初始化内容和按键控制

由一个主类控制(RollerLogic),此类也是游戏循环的动力。

显示部分交给Midlet(RollerMIDlet)。

这种方法可以方便的把低级UI和高级UI结合使用,虽然用不到1张图中,但交替使用效果也不错。

唯一的不足是类太多,占用了不必要的空间。

(出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有