J2ME游戏引擎程序结构- -

j2me游戏引擎程序结构
2004-11-17

唐良

游戏引擎的结构很多,不过基本上都是在一个游戏主循环内实现。程序里面的主循环包含了程序框架的最主要的结构体。J2me的程序一般都包含两个class文件,一个是MIDlet,一个是Displayable。一般我都是把游戏的主要代码放在Displayable这个类里面。这个类是基于事件驱动的程序,有三个主要相应函数void paint(Graphics g),void keyPressed(int keyCode),void keyReleased(int keyCode)。

1. 使用Runnable和创建线程的主循环

一般主体的做法就是让Displayable这个类实现Runnable这个接口,然后在其构造函数中创建一个线程,启动其run()函数,而run函数里面就包含了游戏的主循环。下面是我在仙剑里面的片断代码。

public class GameMIDlet extends MIDlet {

static GameMIDlet instance;

Display display;

GameDisplayable displayable = null;

public GameMIDlet() {

instance = this;

display = Display.getDisplay(this);

displayable = new GameDisplayable();

}

public void startApp() {

display.setCurrent(displayable);

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

displayable.running = false;

}

public static void quitApp() {

instance.destroyApp(true);

instance.notifyDestroyed();

instance = null;

}

}

public class GameDisplayable extends FullCanvas implements Runnable {

/** 主控制线程 */

Thread MainThread = null;

/** 游戏时钟间隔 毫秒为单位 */

public static long timeinterval = 20;

public static boolean Isstable = true;

/* 用于游戏时钟的变量 */

public static long timeold = 0;

public static long timenow = 0;

public long interval = 0;

public static long frames_per_second = 0;

int count = 0;

long second = 0;

public static boolean running = true;

public GameDisplayable() {

// 开始主线程

Thread MainThread = new Thread(this);

MainThread.start();

}

public void run() {

while (running) {

timenow = System.currentTimeMillis();

interval = timenow - timeold;

if (interval >= timeinterval) {

timeold = timenow;

Game_Process();

if (second != (System.currentTimeMillis() / 1000)) {

second = System.currentTimeMillis() / 1000;

frames_per_second = count;

count = 1;

}

else

count++;

}

lib.sleep(30);

}

}

其中关于控制主循环速度的代码可以不要,但是lib.sleep(30)必须保留,因为在Nokia 60的手机上,如果去除了sleep(30),那么游戏将无法切换回来。同时,在游戏中任何一个内部循环中,也必须加入sleep(30)这个等待,才能让游戏可以切换回来,至于为什么这样做,我暂时还不清楚。30ms是我测试过没有问题的数值,可能比30ms还小的值也是没有问题的。

同时,在MOTO的手机上,必须将游戏的主循环放在一个线程中,游戏才能切换回来,不过可以不加上面说的sleep(30)延时。

2. 不使用线程的主循环办法

这个办法只能在Nokia的平台上实现,而我只建议在Nokia 40的平台上做,这样不需要线程,道理上来说节约了一些内存,如果不是内存很紧张的机型,那么最好还是使用上一种办法。

游戏的主循环放在MIDlet的class里面,具体做法如下:

public class GameMIDlet extends MIDlet {

GameDisplayable displayable = null;

/** 游戏时钟间隔 毫秒为单位 */

public static long timeinterval = 0;

//用于游戏时钟的变量

public static long timeold = 0;

public static long timenow = 0;

public long interval = 0;

public static long frames_per_second=0;

int count=0;

long second =0;

public static boolean running = false;

static boolean exitApp =false;

public GameMIDlet() {

displayable = new GameDisplayable();

running =true;

}

public void startApp() {

running =true;

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

while(running) {

timenow = System.currentTimeMillis();

interval = timenow - timeold;

if (interval >= timeinterval) {

timeold = timenow;

displayable.Game_Process();

if(second != (System.currentTimeMillis() /1000)){

second = System.currentTimeMillis()/1000;

frames_per_second = count;

count = 1;

}else

count ++;

}

}

if(exitApp) {

destroyApp(true);

notifyDestroyed();

}

}

public void pauseApp() {

running =false;

}

public void destroyApp(boolean unconditional) {

running = false;

}

public static void quitApp() {

running =false;

exitApp =true;

}

}

版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。

发表于 2004年11月17日 10:44 PM

评论
# j2me游戏引擎程序结构 2004-11-19 2:00 PM 属于我地
Ping Back来自:[url]www.donews.net[/url]

# 回复:j2me游戏引擎程序结构 2004-11-19 8:39 PM Tony.ming
呵呵~~唐唐今天看到你的Blog了~~

关于游戏结构
>>同时,在游戏中任何一个内部循环中,也必须加入sleep(30)这个等待,才能让游戏可以切换回来至于为什么这样做,我暂时还不清楚。30ms是我测试过没有问题的数值,可能比30ms还小的值也是没有问题的。

这是因为如果没有让线程暂停一定时间,循环线程将抢占所有系统资源,切换时系统就没有资源给其他线程了。

>>这个办法只能在Nokia的平台上实现,而我只建议在Nokia 40的平台上做,这样不需要线程,道理上来说节约了一些内存,如果不是内存很紧张的机型,那么最好还是使用上一种办法。

我觉得还是不要用下面这种算法,哪怕是在40的机器上面。采取剥夺式循环很容易造成很多问题。要解决这些问题,需要很多技巧,在这个层面上来讲唐唐的智商非常了得,但代码将会缺乏易读性和可移植性了。

# 回复:j2me游戏引擎程序结构 2004-11-20 11:46 AM tangl_99
楼上的是哪位哦?

# 回复:j2me游戏引擎程序结构 2004-11-20 11:22 PM eltonto
不错不错

# 回复:j2me游戏引擎程序结构 2004-11-22 3:47 PM wangtao
那个是小明

# 回复:j2me游戏引擎程序结构 2004-11-24 2:18 PM vlee
这就叫游戏引擎?

# 回复:j2me游戏引擎程序结构 2004-11-25 10:51 AM tangl_99
晕死,没有人说这是引擎啊。
说了是程序结构。

# 回复:j2me游戏引擎程序结构 2004-11-28 9:21 PM 阿泉
我总结了一下GameLoft的游戏循环,是这种方式

public void run() {

while (game_run) {

game_time = System.currentTimeMillis();
Game_Cycle(); /*游戏更新*/
DeviceControl.setLights(0, 100); /*开灯*/

/*辅助信息,桢率测试*/
if (game_second < (game_time / 1000)) {
game_second = game_time / 1000;
game_framePreSec = game_count;
game_count = 1;
} else {
game_count++;
}
/*辅助信息,桢率测试*/

/*阻塞一段时间*/
while (System.currentTimeMillis() - game_time < 60L) {
sleep(1L);
}
}
}

职场 程序设计 游戏 程序设计

0

分享

微博 QQ 微信

收藏

上一篇:Linux 下串口编程入门教程 下一篇:ADA 语言文档
hagejid

44篇文章,35W+人气,1粉丝

关注

转载于:https://blog.51cto.com/hagejid/74848

J2ME游戏引擎程序结构相关推荐

  1. J2ME手机游戏引擎程序结构简述

    游戏引擎的结构很多,不过基本上都是在一个游戏主循环内实现.程序里面的主循环包含了程序框架的最主要的结构体.J2me的程序一般都包含两个class文件,一个是MIDlet,一个是Displayable. ...

  2. 游戏引擎程序员养成计划

    说的很好,和我走的道路有点不谋而合,文章中提到的书本我基本都知道,很多都看过或者浏览过,英雄所见略同?O(∩_∩)O~ 游戏引擎程序员养成计划 三维图形学:  搞三维图形学首先还是要扎扎实实的先看解析 ...

  3. 0909期即将上市:游戏引擎启示录

    本期封面报道:游戏引擎启示录 镜之边缘.生化骑兵.最后的神迹.战争机器等游戏大作是如何制作的?Social Game的背后由什么来支撑?网页游戏引擎的结构是什么样子?零世界最核心的理念是什么?本期特别 ...

  4. 【贪玩巴斯】Unity3D初学圣经(一)——学习要求 Unity简单介绍 游戏引擎介绍 课程体系介绍 「1-1 到 1-4 」—— 2021年12月9日

    Unity3D初学圣经 一 --学习要求 & Unity简单介绍 & 游戏引擎介绍 & 课程体系介绍 本文对应视频P1 1-1 到P2 1-4 1.学习要求 2.Unity简单 ...

  5. 使用J2ME技术开发RPG游戏(一)——程序框架

    使用J2ME技术开发RPG游戏(一)--程序框架 作者:陈跃峰 出自:http://blog.csdn.net/mailbomb RPG(角色扮演游戏)是手机游戏中的一类主要类型,也是相对来说比较麻烦 ...

  6. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  7. HTML5游戏引擎(二)02-egret引擎之hello world——快速上手-清理项目 程序入口 绘制单色背景 调整屏幕的适配模式 添加文字 响应用户操作-让文字变色

    HTML5游戏引擎(二)02-egret引擎之hello world--快速上手-清理项目 & 程序入口 & 绘制单色背景 & 调整屏幕的适配模式 & 添加文字 &am ...

  8. python 游戏引擎 cocos2d_2.2 完成一个Cocos2d游戏程序代码

    本视频基于**Python 3.6版本 Python语言之所以受欢迎,很大的原因是有很多可以使用的库,Python社区也有很多游戏开发库,其中较为优秀有:Cocos2d.Pyglet和Pygame,还 ...

  9. 小程序游戏开发有哪些游戏引擎可以选择?

    小游戏与小游戏引擎的关系 小游戏现在囊括的范围包括微信小游戏.QQ 空间小游戏.QQ 玩一玩(厘米游戏).Facebook Instant Games.各手机厂商的快应用小游戏,他们都在尝试着将社交场 ...

最新文章

  1. Windows 技巧篇-鼠标指针安装方法,漂亮的鼠标指针推荐
  2. Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])
  3. draw graph
  4. Unity3D研究院之获取摄像机的视口区域(转)
  5. 3d 多相机分流_徕卡电影四摄的华为Mate30 Pro到底有多猛?开箱了解一下!
  6. 【机器学习】Andrew Ng——05Octave
  7. 力扣题目系列:1299. 将每个元素替换为右侧最大元素 -- 一道算法优化入门题
  8. 内联失败函数变成static函数的一些问题
  9. 微信小程序开发(一):小程序代码构成
  10. java中 移位运算符_java中的移位运算符心得总结
  11. 利用动态数组生成魔方矩阵
  12. 管家婆 mysql_管家婆软件恢复账套数据图解-通过数据库源文件
  13. 怎样通过《Sbo维护与开发助手软件》进行Sbo开发和维护(1/3)
  14. iomega ix2 Android,Lenovo Iomega ix2共享功能_联想 IOMEGA IX2_服务器评测与技术-中关村在线...
  15. Ubuntu16.04 桌面 launcher 丢失
  16. matlab中的a逆怎么使用方法,在MATLAB中,求矩阵A逆矩阵可用命令( )。
  17. 【C】指针的相关运算练习题
  18. JSP实现word文档的上传,在线预览,下载
  19. 前端笔记:Grid布局
  20. 关于pycharm中html在页面访问的记录(授权问题)

热门文章

  1. carthage update --no-use-binaries --platform mac,ios
  2. ios 设计模式 MVC ,MVVM
  3. Linux与shell环境,Linux 环境及 Shell 程序
  4. java calendar.add方法_Java Calendar add()方法与示例
  5. java 调内存_java内存设置
  6. ubuntu 如何右上角显示键盘
  7. eeglab教程系列(5)-预处理工具
  8. 你的iPhone 13,粉了吗?
  9. 全球首次!AI研制新药物仅需18个月,李开复梁颕宇:AI医疗已突破,但只打1分...
  10. 时隔3年,华为又有人入选IEEE Fellow