现在的位置: 首页 > 综合 > 正文

J2ME滚屏游戏的设计——补充说明关于地图与碰撞判断等

2013年11月20日 ⁄ 综合 ⁄ 共 1887字 ⁄ 字号 评论关闭

李振鹏

版权所有,转载请注明出处.

Java ME

滚屏游戏的设计——补充说明关于地图与碰撞判断等

 

关于滚屏游戏对于在我的书中介绍的属于其中的一个种类,
2D

并且是平面
90

度视角的,对于人物的设计应该已经讲述的很明白了,这里从很少有人提出关于人物设计方面的问题可以看出,大部分的问题,集中在地图的设计上。对于地图的设计,我这里对一些书中未尽地方进行详细的说明。这边文章可能来得晚了一些,由于我一直都比较忙,事情比较多,这个文章都准备很久了。

第一部
      


地图绘制

地图的绘制很多人都说讲述的不明白,这里从绘制的程序说起,其实地图的绘制的原理就是把一个一个
16X16

或者是
32X32

的图片绘制的屏幕上,至于为什么需要那么复杂的程序,主要是为了减少绘制的区域。一般来说,屏幕大小并不能正好适合图块的大小,比如说屏幕宽度是宽度
176

,而图块大小是
32X32

,这样如果从左边算起,图块一块一块的排列只能排列
5.5

块,这是左边的图块从坐标
0

开始算起的,如果要是地图移动了,可能出现从
10

开始算起,这样最左边的图块只能显示
22X32

的大小了,而不能实际的现实
32X32

了。如下图所示:


 

此图使用的是我书中的图片,在
518

页。在写书的时候,我认为有上面的图在程序(在书中
517

页)中应该比较好理解。但是有人问,这里我就再解释一下,
map.x


map.y

其实就是屏幕相对地图的坐标,比如说,
map.x = 100, map.y = 200,

这代表屏幕的左上角坐标,在整个地图中的坐标为(
100


200

),这个如书中所说,采用的是投影的原理,屏幕显示的区域就是地图中的一部分,这里地图坐标是这样解释的。这里使用
map.x


map.y

作为命名,可能有混淆,造成了理解的困难。

关于整个坐标系统,这里再强调一下,有两个参考系,分别是使用地图作为参考,使用屏幕作为参考。在不同的地方,相对参考的坐标不相同,比如屏幕坐标有时候是参考地图的,只是屏幕在地图上移动,而有时候屏幕又作为参考,比如当人物移动的时候,使用的就是屏幕的坐标系。

第二部分
 


碰撞判断

        


人物在地图上行走必然需要一些碰断判断,不然无法处理何处可以行走和通过,何处有阻挡的问题,这里就需要在地图上设置一些属性,或者是增加可判断区域。这里我原来做的时候有两种方式,一种是我采用的方式,有人采用另外一种方式。

        


我先说一下另一种的方式,在已经存在地图矩阵的情况下,增加一个判断的矩阵,这样比如说广大的平地,就可以使用一个碰撞矩形来判断,这样在广大的平地的时候,就使用一个矩形,只要与这个矩形相交,就不能下落等。也就是采用如下图的方式。


 

        


其中红色的是判断矩形,黄色的是人物,黑色的是地图。这样不需要判断地图,只需要判断碰撞矩形就可以了。只要是与碰撞矩形有相交,就不能通过。这样的好处是碰撞判断的矩形较少,缺点就是无论走到哪里,都需要遍历所有的矩形,检查是否有碰撞。这里就可以引出我采用的方式,其实从图上来看,人物碰撞所需要的矩形区域是确定,怎样来反响查找矩形,这里唯一能利用的就是坐标,可以立刻获得是人物附近地图矩形的坐标。这样只要把判断信息写入地图图块即可。

        


具体的碰撞判断区域在我的书上有图,可以作为参考。这里说一下地图矩阵的属性。本来使用地图矩阵即可,但是矩阵只有图片的索引,没有任何的判断信息,这就需要增加图片的属性。可以使用两种方式,一种是单独的判断矩阵,大小与地图矩阵相同。另外是增加地图矩阵的数据量,本来是用
UINT8

的类型,现在使用
UINT16

的类型,这样就增加了
8

个数据位,可以判断
8

种属性,这里有人会说,这明明是
256

种属性,我为什么只认为是
8

种,这里使用了位运算,
1

位代表一种属性。为什么这么用,是基于以下的考虑,比如一个凸起的地图块,有两种属性,人物站在上面不能落下,人物往前或者后走的时候不能通过,如果使用
256

种属性来判断,这里就需要两种,而是用
8

位的标志,只需要置两位的标志,一个是不能落下,一个是不能左右通过的标志。这里直接使用按位与的运算就可以了。速度快,并且方便。如果使用
256

种属性,需要使用
switch

来判断。这样判断效率就低很多。

        


这里很多人说不明白高
8

位的属性是什么,具体需要根据程序来判断,其实可能只用刀了少数几位,其实根据程序比较容易判断,分别是不能左右通过,不能往上走,不能往下落,对于超级玛丽来说,砖块是可以撞碎的,这里就需要增加一个可以撞碎的属性。结合我的说明与程序,应该很容易看明白具体哪一位是干什么的。因为程序里都使用了位操作来判断。

 

抱歉!评论已关闭.