类似头晕的游戏关卡表示(格式)

时间:2010-05-13 15:22:31

标签: c++ oop

你如何存储Dizzy-like冒险游戏的游戏等级?你会如何指定可步行区域和图形?它是基于图块的,基于像素的还是可行走的表面可以用向量来描述吗?

3 个答案:

答案 0 :(得分:4)

非常古老的冒险游戏(比如来自80年代的Sierra的任务)过去实际上维护了整个屏幕的单独位图,表示z深度和材料,以确定角色可以去哪里以及隐藏的位置。他们会使用像素采样来检查他们的小精灵会去哪里。

虽然目前的机器速度更快,但长边滚动水平使得这种方法不切实际,恕我直言。你必须使用更稀疏的表示。

一种选择是将游戏“减少”为隐形牌,这些牌更容易表现。这个问题的主要问题是它可以限制你的设计(例如,难以对角平台),并且它可以使动画非常粗制滥用(例如,你的角色的脚实际上没有触及平台)。这个选项可以用于类似于zelda的冒险游戏的恕我直言,但不适用于动作游戏。

第二种选择是通过一些矢量表示来表示游戏世界并实现一些碰撞检测。我个人会选择第二种解决方案,特别是如果您能够巧妙地了解如何组织数据结构以最大限度地缩短访问时间(例如,可以更快地访问靠近您的角色当前位置的世界元素子集)。

如果有可用的2D游戏引擎提供这种功能,我不会感到惊讶,因为肯定有3D引擎可以做到这一点。实际上,您可能会发现使用现有的3D游戏引擎并使用它来渲染2D更容易。

答案 1 :(得分:3)

Dizzy游戏可能正在使用基于磁贴的系统。游戏世界由在整个关卡中重复的瓷砖调色板组成。每个图块将具有三个元素 - 绘制到屏幕的图像,允许主角走在图像后面的z缓冲区和碰撞图。后两者将实现为单色图像,以便:

colour |      z map         | collision
-------|--------------------|---------------
black  | draw dizzy infront |  collide
white  | draw dizzy behind  |  don't collide

存储这些是单色图像也可以节省很多内存。

您将拥有一个编辑器来构建一个级别,该级别将显示一个可以拖放图块的网格。

答案 2 :(得分:1)

该特定游戏是基于图块的游戏,具有像素完美碰撞。冲突由磁贴的颜色字节中的一个位(亮度)控制,您还可以通过设置颜色的闪烁位来镜像磁贴。

然而,瓷砖只能放在偶数x,y坐标处(我怀疑这样做是为了帮助碰撞系统。)

碰撞系统涉及对英雄的持续检查。规则大致是: - 如果它在英雄下面找到一个非碰撞像素行,它会将英雄掉落1个像素。 - 如果与英雄发生碰撞交叉,则将英雄提升1个像素。 - 向左或向右移动时,它会检查该方向,如果:     - 如果找到一堵墙(碰撞高度超过4个像素),则拒绝该方向的移动;     - 如果它找到一个可爬升的盒子(碰撞高度高达4个像素),允许在该方向上移动。 - 如果有足够的净空允许跳跃,否则,停在最后一个可能的空位。

当结合这些简单的规则时,你获得了一个非常平滑的碰撞协商,甚至可以在没有额外征税的情况下行走任意斜坡。

在创建这样的游戏时,我会使用单独的图块,我会将它们组装在图层上(背景,前景等......)并渲染它们。我会从指示碰撞图块的图块属性中组装一个单独的碰撞图,我会使用该单独的地图来协商英雄的碰撞和移动。

与此演示类似:http://games.catevaclickuri.ro/