李振鹏
版权所有,转载请注明出处.
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
位的属性是什么,具体需要根据程序来判断,其实可能只用刀了少数几位,其实根据程序比较容易判断,分别是不能左右通过,不能往上走,不能往下落,对于超级玛丽来说,砖块是可以撞碎的,这里就需要增加一个可以撞碎的属性。结合我的说明与程序,应该很容易看明白具体哪一位是干什么的。因为程序里都使用了位操作来判断。