Java游戏开发中应始终坚持的10项基本原则

关于文章中涉及的两个杜撰概念:

一、绘图器:众所周知,Java GUI以paint进行绘图,以repaint进行图像刷新,而完成repaint及paint这一连贯过程中所用到绘图组件,我将其称为绘图器。就我个人的体会,绘图器的调用时机应始终处于repaint之后paint之前,即通过repaint触发刷新后执行,当其中的具体逻辑完成其对应的图像绘制后,再通过统一接口将其图像插入paint中,为了匹配需要,绘图器应始终以接口方式实现。

二、监听器:这里所说的监听器,并不是特指某个Listener组件,而是包括Java游戏中所需的所有监听器集合。由于Java游戏中很可能会切换不同的游戏模式,而不同模式游戏中需要处理的鼠标或键盘事件也不尽相同。所以在Java游戏开发中,我们需要一个可替换的监听器集合,用以变更不同游戏模式下的不同监听事件,为了匹配需要,监听器应始终以接口方式实现。

正文,关于Java游戏开发中应始终坚持的10项基本原则:

1、始终保持画布的唯一性。

现实生活中,人类通过口腔及消化道摄取的营养物质可以被心、肝、脾、肺、肾等内脏吸收,却没有人会想给自己的心、肝、脾、肺、肾上也弄个嘴,因为一致性的功能实现只要有一个就足够了。但是,有时我们不经意的在游戏中add、remove不同panel或canvas以求转换画面的行为,无异于是想给游戏的心、肝、脾、肺、肾上装嘴的不智之举,切忌Java的GUI都是画出来的,重绘就好,没有切换组件的必要,否则费力不讨好。

2、始终以接口方式转换监听及处理图像绘制,务必将视图及逻辑层分开。

针对一些混合类型的游戏,比如SLG+AVG、RPG+STG,我们将面临不同模式下游戏的监听器及绘图器切换问题。

这时最简单的抉择莫过于为每一个游戏类型都订制一个对应的面板进行切换,这样虽表面上方省心,但却也是最费力而不讨好的,且不说闪烁问题需要单独解决,资源占用问题,光冗余代码就够人头痛了。

其次就是在一个面板中针对不同游戏类型使用switch判断以切换监听及绘图,事件数量少时固然可以,效率也不错,但稍微多一点恐怕就不那么简单,更多时则仅余郁闷,同样不建议使用。

就我个人所见,解决这一问题的最好方法莫过于沿用MVC模式,以接口方式构建绘图器及监听器,当游戏出现变更时,我们仅仅需要切换监听及绘图接口,就可以迅速转变游戏内容,而无需区别对待不同的实现,这样即避免了组件切换的闪烁及延迟,也精简了代码,更有利于开发时的模块划分。

3、始终以静态方式加载游戏常用资源,缓存常用对象,并及时释放无用资源。

即使历史发展到今天,Java依旧没有彻底摆脱其系统资源杀手的可憎面目,GC机制也导致我们无法适时地释放资源,new的越多,系统也变得越慢,这对于大量使用图形资源的游戏来讲尤其要命。所以我们要尽一切可能令常用资源静态化为唯一实例以避免反复调用,而将一些调用后不会再使用或很少使用的资源迅速 null以等待GC自动回收。否则,你将发现你的游戏距离内存溢出是那样的近……

4、始终以循环方式展开游戏,利用线程控制游戏流程,避免出现僵直现象。

事实上所谓的游戏开发,在某种程度上不过是由程序员制作出的一种夹杂着各类图形算法,用以适时地展示各种资源的幻灯程序;唯一的区别在于,普通幻灯程序中人机交互性较弱,而游戏的人机交互性较强罢了。

我们都知道,幻灯程序在展示中无论如何跳转展示页,也必然有其固定的begin与end页面,而且也势必能重复从头至尾顺序循环其begin与end,以此构成一个幻灯片。

实际上游戏制作也一样,无论游戏流程如何转变,游戏都会有也必然会有一个主流程,或者说一个主循环体,这样我们才能由游戏开始进行到游戏结束,而不是从一个结束到另一个结束,也就是说无论游戏中细节分支有多少,它的主流程处理及判定也必然是顺序的。针对这一特性,决定了我们应将游戏主体代码至于一个大的循环体之内,再利用线程控制循环体中的游戏进度,从而更好的顺应这一流程。简单的说,我们应将循环体中每一个使用到的绘图器都当作于flash中的一桢,而线程的各种控制当作时间轴,用以调节不同桢的播放速度及调用时机,以此完成各种不同的事件交互。

5、始终在处理复杂绘图时直接准备贴图而非由程序绘制。

我们都知道Java绘图事实上是GDI实现,因此其绘制复杂画面的效率也就可想而知。通常强况下,除非当前的效果非编程不能实现,或者其所造成的资源损耗确实微小到可以忽略不计,否则最好的方法就是用空间换效率,准备好图片直接贴上去吧,宁可增加些程序体积,也不要让玩家因等待的愤怒而问候你祖宗八辈。

时间: 2024-11-05 18:41:36

Java游戏开发中应始终坚持的10项基本原则的相关文章

J2ME游戏开发中时钟的简单实现

时钟 在游戏开发中,有时候我们需要一个时钟来记录游戏的时间,如果时间结束则结束游戏.本文介绍如何在J2ME中使用Timer和TimerTask来实现这样一个时钟,并给出具体代码实例. 在java.util包中有一个TimerTask类,你可以扩展这个类并且实现他的run()方法,在run()方法中编写我们的逻辑代码.如果我们想制作一个游戏时钟,那么非常简单我们编写一个GameClock类扩展TimerTask,GameClock需要维持一个实例变量timeLeft,这样我们就可以记录游戏剩余的时

Android 重力传感器在游戏开发中的应用_Android

      手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器.        一.何为传感器        所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置.        二.Android提供了哪些传感器        1.加速度传感器(重力传感器)        2.陀螺仪传感器        3.光传感器        4.恒定磁场传感器       

Android 重力传感器在游戏开发中的应用

手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,将它们置于游戏当中,大大提升了游戏的可玩性和趣味性.本节将继续介绍智能手机的另一种神奇之处:传感器. 一.何为传感器 所谓传感器就是能够探测如光.热.温度.重力.方向等等的装置. 二.Android提供了哪些传感器 1.加速度传感器(重力传感器) 2.陀螺仪传感器 3.光传感器 4.恒定磁场传感器 5.方向传感器 6.恒定的压力传感器 7.接近传感器 8.温度传感器 今天我们给大家介绍的是游戏开发中最最常见的,用到的频

Android 游戏开发中绘制游戏触摸轨迹的曲线图_Android

       本篇文章主要来讲解怎样绘制游戏触摸轨迹的曲线图.        我们在onTouchEvent方法中,可以获取到触摸屏幕时手指触摸点的x.y坐标,如何用这些点形成一条无规则轨迹并把这条无规则轨迹曲线显示在屏幕上就是本篇文章的主旨内容.        Android Path类        Android提供了一个Path类 , 顾名思义这个类可以设置曲线路径轨迹.任何无规则的曲线实际上都是由若干条线段组成,而线段的定义为两点之间最短的一条线.path类就 可以记录这两点之间的轨迹

监听器在游戏开发中的应用----消息回调

我一向是不太喜欢给一些东西强加上个名字.但为了随波逐流,我还是这样做了. 在我们的游戏开发中,通常会遇到两个模块之间的通信. 回调估计是最常用的方式了. 回调的设计思想很简单,就是两个对象相互注册,然后在需要的时候调用对方的函数. 如下: class B;   class A   {   public:       void RegisterCallback(B* pB)       {           m_pB = pB;       }       void ActiveA()     

Java web开发中要是用jdbc连接access数据库,连接url怎么写相对位置

问题描述 Java web开发中要是用jdbc连接access数据库,连接url怎么写相对位置 Java web开发中要是用jdbc连接access数据库,连接url怎么写相对位置,注意这里是jdbc方法连接 而不是jdbc-odbc 例如access数据库就在项目中(project文件夹下) 代码为: try { // 加载jdbc - odbc驱动 Class.forName("com.hxtt.sql.access.AccessDriver"); // 根据url创建连接实例 a

java-关于JAVA论坛开发中涉及到的问题

问题描述 关于JAVA论坛开发中涉及到的问题 我想做一个最基本的论坛,它包含发帖,回复等这些论坛基本功能,需要几张表啊,求解答 解决方案 最简单最简单也需要3张表user表,包括userid username passwordtopics表,包括topicid title content postdate authoridreplies表,包括replyid topicid content postdate authorid 解决方案二: 我觉得你在这个问题上不能简单说需要几张表的问题.针对一个

3D数学基础:图形与游戏开发中四元数用以旋转时的疑问

问题描述 3D数学基础:图形与游戏开发中四元数用以旋转时的疑问 书中在10.4.8节 四元数的乘法(叉乘)中定义四元数乘法时出了一个错误(最后四元数虚向量部分应该是W1*V1+W2*V2+V1×V2但是它却"强行"说标准乘法定义最后是V2×V1) 然后在书中提示"本书使用结尾为V1×V2的乘法定义"(非原文,简略表达) 接着在用四元数进行点旋转时说,定义一个四元数p=(0,(x,y,z))对应3D点p(x,y,z),然后通过旋转四元数q对其进行乘法: p1= qpq

关于游戏开发中背包物品的整理算法的问题

问题描述 关于游戏开发中背包物品的整理算法的问题 场景是游戏中的背包里面要整理物品,每个物品在格子中方的量是一定的(假设99), 要求相同的东西放在一块做整理,位置顺序是按照原始背包的顺序, 比如:O O A(50) B(22) A(50) 排好后是 A(99) A(1) B(22 ) 比如:O O B(50)A(50)B (50) A(36)摆好后是 B(99)B( 1) A(86) 我的想法比较low是先合再一起 再分开,效果不太好,请教一下各路大神是否有更好的算法实现 解决方案 建议是先合