站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题[原创]昨天晚上写的关于RPG游戏的一点点心得_RPG游戏引擎的构建

[原创]昨天晚上写的关于RPG游戏的一点点心得_RPG游戏引擎的构建

摘要: [原创]昨天晚上写的关于RPG游戏的一点点心得_RPG游戏引擎的构建
<tr><td>
http:///tech/article2479.html
[watermark]    RPG游戏引擎的构建
     作者:syz QQ:455910706
日期:2006-07-31
  回想起自己当初在网上疯狂查找有关RPG游戏制作资料时的情景,真是叫人苦不堪言,最后没办法还是自己
研究算法完成了游戏的开发,虽然游戏是通过J2ME(java语言,游戏运行在手机平台)语言实现的,但不管是什
么语言什么平台算法是一致的,笔者有使用VB.VC语言的经验,在介绍时尽量做到通俗易懂,希望给各位已经会
使用开发工具但不晓得如何应用和急需这方面资料的朋友些帮助,废话不多说了让我们开始我们的RPG游戏之旅
[]吧!
  首先各位需要了解有限状态机的理论,听起名字来好像挺复杂其实在简单不过,就是使用一个变量表示当
前某个事件的状态,还是让我们来举例说明吧,比如定义一个整型变量叫做GameState用来表示当前游戏所处状
态,其值为0时表示游戏出错状态,为1时表示游戏Logo状态,为2时表示显示主菜单状态,为3时表示游戏运行状
态,有些朋友可能会认为为什么不使用String类型来表示呢?这样直接存入Error、Logo、Run等字符起不更明
了,确实这样比使用0、1、2的方式更明了,但这是游戏,游戏要讲刷新频率的,字符类型比较的速度远不及整
型的效率。现在状态是有了,可是如何使用呢?当然是使用switch(vb里面使用select)这语句比使用if来判断
分支要快,比如编写绘图代码时我们就可以这样写了:
java的:
int GameState=0
private void GamePaint(){
switch(GameState){
case 1:
//添加游戏Logo的绘图代码
[] break;
case 2:
//添加游戏菜单的绘图代码
break;
case 3:
//游戏运行时的绘图代码
break;
default:
//如不是如上几个状态就报错,防止操作GameState变量时出错
}
}
VB的:
Dim GameState As Integer'全局变量
private sub GamePaint()
Select Case GameState
Case 1
[] '添加游戏Logo的绘图代码
Case 2
'添加游戏菜单的绘图代码
Case 3
'游戏运行时的绘图代码
Case Else
[] '如不是如上几个状态就报错,防止操作GameState变量时出错
End Select
End Sub
  那么如何切换游戏的状态呢?我们必须事先安排好切换条件,假设想从Logo状态转至Menu状态,条件是
Logo显示了5秒后切换我们可这样编写代码:
java的:
int GameState=0;
long StateTime;
[] //该函数可由计时器每隔50ms调用一次,用来更新整个游戏
private void GameRun(){
switch(GameState){
case 1:
//**注意这里判断在当前状态的时间是否大于5秒,如大于进入菜单状态**
if(System.curr-StateTime>5000) newState(2);
break;
case 2:
[] //添加游戏菜单的选项判断
break;
case 3:
//游戏运行时的人物场景更新
break;
default:
//如不是如上几个状态就报错,防止操作GameState变量时出错
}
GamePaint();//更新游戏绘图
[] }
[] //该函数负责加载释放资源
private void newState(int state){
//释放原来状态的资源
switch(GameState){
case 1:
//添加释放Logo状态使用资源代码
break;
case 2:
//添加释放Menu状态使用资源代码
break;
case 3:
.
.
.
}
System.gc();//垃圾回收启动,收回占用的内存
[] //加载新状态的资源
switch(state){
case 1:
//添加加载Logo状态使用资源代码
StateTime=System.curr;//todo
break;
case 2:
//添加加载Menu状态使用资源代码
break;
[] case 3:
.
.
.
}
StateTime=System.curr;//todo
GameState=state;//设置新的状态
}
VB的:
Dim GameState As Integer'全局变量
[] Dim StateTime As Date'用来记录当前状态的起始时间
'该函数可由计时器每隔50ms调用一次,用来更新整个游戏
private sub GameRun()
Select Case GameState
Case 1
[] '**注意这里判断在当前状态的时间是否大于5秒,如大于进入菜单状态**
if DateDiff("s", StateTime, Now)>5 then newState(2);
Case 2
'添加游戏菜单的选项判断
Case 3
'游戏运行时的人物场景更新
Case Else
'如不是如上几个状态就报错,防止操作GameState变量时出错
End Select
GamePaint();'更新游戏绘图
End Sub
'该函数负责加载释放资源
private sub newState(state as Integer)
[] '释放原来状态的资源
select case GameState
case 1
'添加释放Logo状态使用资源代码
case 2
'添加释放Menu状态使用资源代码
case 3
.
.
.
[] end select
'加载新状态的资源
select case state
case 1
'添加加载Logo状态使用资源代码
case 2
'添加加载Menu状态使用资源代码
case 3
.
.
.
end select
[] StateTime=now
GameState=state;'设置新的状态
End if
下面让我们来看看整个游戏的框架图,看看游戏间状态是怎样切换的
Logo->主菜单->新游戏->游戏主循环
->继续游戏->加载存档->游戏主循环
->帮助
[] ->设置
->关于
->退出
游戏主循环包括以下功能:
1.主角与各人物碰撞判断.(如出现碰撞则触发相应的事件,比如不小心撞到张三,张三肯定要责怪你几句)
2.主角站立坐标事件判断.(比如游戏中常见的得到XX物品,走到某地被告知说不能通过-_-!)
3.地图出口判断.(切换地图这是很常见的地球人都知道)
4.玩家按键判断.(没有这是那是电影)
什么没发现什么地方用状态机??只听听游戏主循环就有多少个状态:
1.人物碰撞后要触发对话,进入对话状态。
2.言语不合要进入战斗状态。
3.打不过NPC要进入失败状态。
4.所有NPC全部干掉救出PLMM要进入胜利状态。(当然不能胜利后就不负责的丢下"胜利"两个字,不然玩家会很失
望)
5.得到物品后想使用要进入道具箱状态。
6.走到地图尽头要进入场景切换状态。
7.玩家想退出游戏要进入菜单状态。
8.对了还有一个重要的状态,空状态。(就是没有任何事件的状态)
嗨!可怜的程序呀,要实现的功能已经很多了,但还要和美工商量人物怎样制作才能方便贴图,还要面临策划诸
多不可能实现的要求,然后费尽唇舌的给策划讲解为什么不能实现(对于一个外行只能这样),嗨....
喂,说你呢怎么讲着讲着跑题了.....
嗯?是呀,抱歉,不过时间不多了今天就到这里吧,剩下的内容我们有时间再详细讨论。
syz要睡了,有什么问题尽管问我,如要转载这篇文章请保留我的联系方式,以免读的人遇到问题不知让谁来解
[]答,如有时间的话我很希望和大家一起研究游戏。各位88..(所有代码均使用记事本编写如有错误请见谅)[/watermark]
http:///tech/article2479.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: J2ME游戏中的图片处理
后一篇: 手机游戏——精彩的方寸之间