|
|
大家好,我是一个初学者,最近想利用夏天制作一个Mario,但是一开始就遇到很多问题,百思不得其解。实在无奈,求助于大家,想听听大家的意见。
首先是关于 地图 和 精灵 的划分的问题。一开始的时候,我认为只要是 方块 就应该当作 地图 来处理。但是:
问号砖头被顶了以后,它会向上移动一点点,然后再落下来,而且被顶了以后,它的图像也不是问号了,而是换了种样子。
还有一种普通的砖头,被大Mario顶了以后,就碎掉了。
也就是说,这些可以被顶的砖头都有好几种状态。
所以我认为不适合当作 地图,所以我把 它们 当作精灵。并且给它们赋有状态(如:被顶前、被顶后)
其次是关于碰撞判断的问题。
我的第一次尝试是把Mario当作一个正方形来处理的(如 16*16 像素 )。但是要判断它 在 地图上的上下左右是否有障碍物 却变得非常复杂。
见图片1。假设 地图的每个格子大小是 16*16, 小Mario也是 16*16。在如图的情况下,不得不 发射8条射线 来观察是否有障碍物(当然,这个射线可以有长度,比如长度是 2*16 )。 这就导致了判断非常复杂。而且,当Mario变大后,射线的起点位置也要重新计算。
我的第二次尝试是使用关键点。
见图片2。图片2显示的是小Mario的关键点。定义了这些关键点以后,就把问题转换成 点与矩形是否相交 的问题了(如,下面2个点,如果其中某个点与 地图上的障碍物 相交,那么, 小Mario 就是站在地面上的 )。但是这个很快也发生了问题。
问题就是,如果 Mario变大,那么5个关键点不够用了,要变成7个才够(见图3)。而且,因为我把 可以被顶的砖块 定位为 精灵,所以它们也应该有关键点,但是他们并不会自己走,也就不存在所谓的“前面有障碍物,下面可以站”之类的状况。
再其次是关于状态的问题。拿 Mario 为例。 一开始Mario是小的,吃了蘑菇后变大,再吃了花以后就会放子弹了,而且他的不同时期所要绘制的图片也是不一样的。
所以我这样定义State: LittleMarioWalkLeft,LittleMarioWalkRight,LittleMarioStandLeft,LittleMarioStandRight......
BigMarioWalkLeft,BigMarioWalkRight,BigMarioStandLeft,BigMarioStandRight.....
BulletMarioWalkLeft,BulletMarioWalkRight,BulletMarioStandLeft,BulletMarioStandRight...
这样导致了很多状态,要处理状态之间的关系也变得非常复杂。而且,如果 Mario 吃了星星变成无敌,那么又分 LittleSuperMario 和 BigSuperMario 的各种状态。总之,感觉状态过多无法接受了。。。
最后是精灵的继承体系的问题。在 Game::Update()中,要把当前的所有精灵和其它精灵进行碰撞检测。我的所有精灵(Mario、可以被顶的普通砖头、问号砖头、红色蘑菇敌人、乌龟) 都继承自 CObject。那么我可以用一个链表来保存CObject指针(如 list<CObject*> listPtr )。然后用for循环,对它们进行两两比较。这个时候问题出现了。在两两比较的过程中,因为保存的是基类指针,所以他们并不彼此知道对方到底是什么(他们只知道对方是CObject)。当然,也可以给每个 派生类 增加一个 type,但是这样同样存在问题,那就是 类型的排列组合大量膨胀(如 Mario与敌人蘑菇,Mario与鸭子,等等等等),当每增加一个新的类型的时候,就必须给每个现有的类型增加 它与新增的类型 之间的比较函数。而且,既然使用了继承,却又要用成员type来辨别,总觉得不对劲。
以上就是我最近被困扰的问题,希望大家能够给一些建议,先在这里谢谢大家了。 [em4] [em4] [em4] |
-
|