J2ME 潜艇大战游戏设计与实现Demo

设计

 
J2ME 潜艇大战游戏设计与实现Demo

黄叶 (www.hyweb.net)

摘要

本文给出了一个飞机射击类(潜艇)游戏的设计过程以及相应的流程图,并提供了Demo版源代码下载地址,游戏在sun wtk v2.2 下调试通过。

声明

本游戏所用的资源大多不属于作者,代码仅供非商业用途的学习参考。

以下为游戏的几张截图

设计

1 游戏操作流程:

游戏的初始画面是一个implusive的List列表格式,选择new game以后就可以启动游戏,游戏是以全屏方式开启,但仍有用于暂停/开始和退出的命令响应功能键。在游戏当中启动暂停,海水和海洋生物仍将继续活动,但敌方潜艇和所有鱼雷都将静止下来,玩家的控制也将不起作用,直到游戏被再次启动为止。从游戏状态退出将回到菜单界面,再次选择退出将退出程序。

以下是游戏的总体流程图:

2 算法处理

游戏自身是一个单态结构(singletone),由一个Controller来处理目前应该显现的屏幕和状态。主要的显示类包括主画面,游戏画布,帮助画面和一些辅助的Alert,其中最重要是游戏画面。游戏是在MIDP 2的状态下运行的,所以画面继承了GameCanvas。游戏中的角色图层全部加载在一个远大于手机屏幕大小的图层管理器上。当玩家位置移动时,图层管理器同步计算出玩家的相对位置,移动当前图层的显示位置。

这个游戏的本质就是在midlet启动后把整个画布作为一个线程,每隔25ms扫描一下用户按键操作,每隔50ms扫描一次敌人和鱼雷等物体的运动状态,对于比较苛求的子弹射出实时响应,则继承了keyPressed方法。

在扫描玩家移动操作时,按键编码被传入到玩家潜艇的响应方法。在扫描敌人和鱼雷运动时,分两步完成。

第一步,执行各个物体画面的移动方法。程序并不为每个新增鱼雷或者敌人开启一个新线程,太多线程会造成程序的性能直线下降;而是为每一个物体类型保留一个Vector数组,每当一个新物体产生,他将首先被加入改类型所属的数组中,然后才在图层上画出;当物体消除时,除了在图层上被消除,也需要从响应数组中删除。这样就形成一种注册机制,所有游戏物体的产生和消除都需要向画布注册,画布拥有不同类型物体的所有“名单”,所以,当执行移动命令时,只需要遍历各个类型数组,依次执行其中每个元素的移动方法即可。

第二步,就是一般意义上重画,这里使用flushGraphics()替代了传统的repaint(),由于本游戏是以导入图片为操作对象,图片位置的更改已经在第一步被执行,所以没有怎么涉及到象素级的重画,只是在游戏初始化状态时需要加载各个物体数组所对应的图层到新的图层管理器。

画布触发流程简图:

(由于手上没有rose,只有暂时用EclipseUML的流程图画出草图,若干有问题的地方需要商榷,也希望擅长此到的朋友不吝指正)

3 类结构

以下列出了主要组成类的含义结构,并以游戏画布为中心列出一个类关联图。

Controller: 控制类,用以控制当前屏幕显示哪一个Displayable类。

SubObject: 接口类型。玩家潜艇,敌人潜艇以及鱼雷等可移动图层类型皆扩展于此接口。

Sub: 玩家潜艇。包含了位置,生命值等成员变量以及移动,开火等方法。

EnemySub, MoveableSprite, Tinfish: 敌人潜艇,海洋生物,鱼雷。都是可移动图层类型,一旦产生就在画布中注册,由时间触发器维护其运动和生命状态。

SubCanvas: 游戏主画布。存储着游戏地图信息,游戏状态,玩家信息,同步维护着敌人潜艇,鱼雷,海洋生物的运动和生存状态。

SubCanvas关联类图:

4 源代码

本程序的源代码,包括jad,混淆过的jar和一个rar文件,全部可以在 http://www.hyweb.net/BrowseFiles.aspx?Folder=Public/My%20Project 上下载到,代码中包含了较为详细的注释。这份程序只是一个demo版本,有一些遗留问题(玩家生命值显示,性能优化)还需要进一步完善,有任何好的建议,请一定联系我. ^_^

 

时间: 2016-02-08

J2ME 潜艇大战游戏设计与实现Demo的相关文章

J2ME潜艇大战游戏设计与实现

设计   摘要     本文给出了一个飞机射击类(潜艇)游戏的设计过程以及相应的流程图,并提供了Demo版源代码下载地址,游戏在sun wtk v2.2 下调试通过. 声明:本游戏所用的资源大多不属于作者,代码仅供非商业用途的学习参考. 以下为游戏的几张截图 游戏设计 1 游戏操作流程:     游戏的初始画面是一个implusive的List列表格式,选择new game以后就可以启动游戏,游戏是以全屏方式开启,但仍有用于暂停/开始和退出的命令响应功能键.在游戏当中启动暂停,海水和海洋生物仍将

State模式在J2ME游戏设计中的应用(需要源代码留下e-mail)

设计|源代码    游戏设计中的状态转换是一个既是非常重要又十分复杂的部分.我前几天做移植的时候看到一个public void keyPressed(int keyCode)中间竟然有着近2000千行的代码,这样的话冗长的代码不仅不符合OO的思更加严重的是会打扰我们的程序思路.这两天运用State模式做了一个J2ME游戏中的状态转换由于只是一个实验的例子所以只做了开始菜单和帮助的转换,在这个框架下再加入其他的状态实际就是十分的简单的了. 现在DEMO中只有两个状态,两种状态下keyPressed

Silverlight游戏设计(Game Design):(十)梦幻西游(Demo) 之 “天人合一”①

与当年盛大通过代理<传奇>一举成名,九城代理<奇迹>一夜发迹完全不同,金山.网易凭借他们 自主的研发团队,数年时间倾力打造了<剑侠>及<西游>等系列非常优秀的纯国产网游,不仅开创了此 领域的先河,且作为中国网游行业的榜样,让我时常感到崇敬与骄傲.西山居.烈火.大话西游等工作室 这些如雷贯耳的称号已家喻户晓,所有成功的背后都有着一段源自对中国古风古韵故事的生动阐述,事实 也证明了神化传说终是游戏设计中永不褪色的主题. 让经典重现是无比让人神往的体验.本节,我将

Silverlight游戏设计(Game Design)

Silverlight游戏设计(Game Design):(十五)如果还有梦(完) Silverlight游戏设计(Game Design):(十四) Silverlight游戏设计(Game Design):(十三)帝国时代II(Demo)之" Silverlight游戏设计(Game Design):(十二)帝国时代II(Demo) 之" Silverlight游戏设计(Game Design):(十一)梦幻西游(Demo) 之 " Silverlight游戏设计(Gam

Silverlight网页游戏设计思想(WebGame Essence):(一)动态资源

即开即玩是网页游戏相比传统客户端游戏的最大优势.如果说在每台电脑安装上G的客户端是一种资源浪费及时间污染:那么 Silverlight作为RIA界的新宠儿,在继承祖辈优秀血统的前提下拥有更加卓越的性能及更为曼妙的动态表现,势将引领网络未来世界进入那 令人神往的低碳空间. 笔者学习Silverlight开发1年有余,在写第一部Silverlight游戏系列教程时为了尽快的实现目标而将所有素材资源打包进XAP中.与其 他Silverlight初学者一样,这或许是我们所必须会经历的一个过程.QXGam

Silverlight游戏设计(Game Design):(十五)如果还有梦(完)

Silverlight游戏设计系列到此就全部结束了,原先计划至少为大家献上5个最有影响力的Demo,由于 近期生活及工作的原因让我感到实在疲惫不堪因而未能如愿,还望大家见谅. Silverlight在游戏开发方面拥有它独到之处,目前最新版本为4.0,开发环境集成于强大的 VisualStudio2010中.Silverlight在短短的数年时间里能成长得如此迅速与微软的强力支持分不开,从 Silverlight 5 Wishlist字里行间中我再次感受到世界对Silverlight未来的强烈期待

Silverlight游戏设计(Game Design):(十四)

练习用游戏素材资源的获取及相关工具使用心得 通过前6节的Demo制作演示,大家应该已经相当熟悉这款Silverlight-2D游戏场景编辑器了:通过它我 们可以构建出各种类型的游戏,这也让广大的Silverlight游戏爱好者们变得蠢蠢欲动,近一段时间里有 很多朋友询问我游戏素材资源是如何获取的,那么本节我将向大家分享这方面的经验与心得,漂亮的游戏 素材配合上不断的游戏编码练习,在成就感中提升自身的游戏设计能力,让我们一同努力吧! 推荐一,免费的RPG游戏素材资源提取工具:RPGViewer R

Silverlight游戏设计:(六)场景编辑器之开源畅想

所有的游戏设计辅助工具都是为了提高游戏开发效率而出现的,Silverlight-2D游戏场景编辑器 (QXSceneEditor)同样也不例外,虽然它不比<魔兽>.<星际>.<帝国>等大作的地图编辑器拥有强 大到甚至可以通过"换肤"直接创造出一款新游戏:但是大家可以通过它,配合上前几节讲述的游戏架设 方式几乎能搭建任意一款2D游戏图形框架.无论是RPG(角色扮演).SLG(策略).RTS(即时战略)还是ACT( 动作).STG(射击).CAG(卡片游

如何修改得到散弹效果-android飞机大战散弹设计

问题描述 android飞机大战散弹设计 package com.example.beatplane; import java.util.Random; import com.example.beatplane.R; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas;