游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1951|回复: 6

求助,想制作Mario_Clone,但是有些问题想不明白,希望各位

[复制链接]

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2008-7-27 21:03:00 | 显示全部楼层 |阅读模式
   大家好,我是一个初学者,最近想利用夏天制作一个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]
sf_20087272135.jpg

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-7-27 21:04:00 | 显示全部楼层

Re: 求助,想制作Mario_Clone,但是有些问题想不明白,希望各

图片2
sf_200872721333.jpg

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-7-27 21:04:00 | 显示全部楼层

Re: 求助,想制作Mario_Clone,但是有些问题想不明白,希望各

图片3
sf_200872721357.jpg

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2008-7-28 08:33:00 | 显示全部楼层

Re:求助,想制作Mario_Clone,但是有些问题想不明白,希望各

没做过,不晓得啊。

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2008-7-28 15:50:00 | 显示全部楼层

Re:求助,想制作Mario_Clone,但是有些问题想不明白,希望各

宫本茂看到楼主这帖肯定要扑街
总感觉楼主学到了太多复杂且专业的东西
把所有的事情都想复杂了
其实解决碰撞很简单
用一个碰撞检测图片
没有障碍的地方用一种颜色表示
有障碍的地方用另一种颜色表示
每次移动前判断本次移动后
关键点所在位置在碰撞检测图片对应的位置上是哪一种颜色即可
当然并不一定是图片
二维数组也是一样
楼主一定要记住不要用开发3D游戏的思路来思考平面游戏

整个游戏
角色只有7种状态
1 不可控制(死亡或者关卡结束)

2 小M
3 无敌小M

4 大M
5 无敌大M
6 可发射子弹的大M
7 无敌可发射子弹的大M

1先不管
2和3实际上没有区别,区别在于碰撞到敌人时触发什么事件
4567也没有太大差别,也只不过是属性不同而已,至于发射子弹,这应该与角色分开处理
差别最大的应该是小M与大M
各用一个类就可以了
用不着每个都用一个类
这样问题就复杂了

角色与敌人类之间的互相关系
实际上只有2种关系
M与蘑菇敌人和乌龟、炮弹
M与会扔锤子的乌龟、库巴、会扔带刺乌龟的云
这两种的区别就是是否会根据M的位置来改变自己的行动,也就是是否存在ai

用不着过于细分敌人类
顺便一提
N社开发马里奥的时候这个世界上还没有C++
或者说N社的程序员还没有面向对象的概念

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-7-28 15:54:00 | 显示全部楼层

Re:求助,想制作Mario_Clone,但是有些问题想不明白,希望各

建议你先看看游戏的基础理论,自己在这些问题上重新发明一遍时间上不值。

2D传统卷轴游戏的结构基本被游戏机的硬件功能限定。硬件上支持多个图层,最基础的包括固定位置的背景层、前景层,和可以任意定位的精灵层。图元都是由Tile组成的。mario里的砖块应该是精灵层的。后来的游戏机可以支持多个背景层,以时限远近景效果。

碰撞检测多用精灵的包围盒矩形,有时候为了更精确,会指定一个比包围盒略小的矩形。

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2008-7-28 17:17:00 | 显示全部楼层

Re:求助,想制作Mario_Clone,但是有些问题想不明白,希望各

谢谢楼上各位的解答。感觉自己稍微有了些思路了,呵呵,看来要先找点资料看看先了。再次感谢各位。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 20:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表