如何存储shmup级别?


12

我正在开发2D shmup(即Aero Fighters),我想知道存储关卡的各种方法是什么。假设在自己的xml文件中定义了敌人,那么您将如何定义何时在关卡中产生敌人?

是基于时间吗?更新?距离?

目前,我基于“关卡时间”(关卡运行的时间量-暂停不会更新时间)来执行此操作。这是一个示例(序列化由XNA完成):

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:level="pekalicious.xanor.XanorContentShared.content.level">
  <Asset Type="level:Level">
    <Enemies>
      <Enemy>
        <EnemyType>data/enemies/smallenemy</EnemyType>
        <SpawnTime>PT0S</SpawnTime>
        <NumberOfSpawns>60</NumberOfSpawns>
        <SpawnOffset>PT0.2S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/secondenemy</EnemyType>
        <SpawnTime>PT0S</SpawnTime>
        <NumberOfSpawns>10</NumberOfSpawns>
        <SpawnOffset>PT0.5S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/secondenemy</EnemyType>
        <SpawnTime>PT20S</SpawnTime>
        <NumberOfSpawns>10</NumberOfSpawns>
        <SpawnOffset>PT0.5S</SpawnOffset>
      </Enemy>
      <Enemy>
        <EnemyType>data/enemies/boss1</EnemyType>
        <SpawnTime>PT30S</SpawnTime>
        <NumberOfSpawns>1</NumberOfSpawns>
        <SpawnOffset>PT0S</SpawnOffset>
      </Enemy>
    </Enemies>
  </Asset>
</XnaContent>

每个敌人元素基本上都是特定敌人类型的浪潮。该类型在EnemyType中定义,而SpawnTime是该波形应出现的“级别时间”。NumberOfSpawns和SpawnOffset分别是显示的敌人数和两次刷新之间所花费的时间。

这可能是一个好主意,或者可能还有更好的主意。我不确定。我希望看到一些意见和想法。

我有两个问题:正确产生一个敌人并创建一个关卡编辑器。关卡编辑器的问题是一个完全不同的问题(我可能会在以后的:P中发布)。

至于正确生成,问题在于我的更新时间可变,因此我需要确保不会错过敌人的生成,因为生成偏移量太小,或者更新花费了更多时间。我在很大程度上修复了它,但是在我看来,问题出在我如何存储水平上。

那么,有什么想法吗?注释?

先感谢您。

Answers:


4

一种方法是将产卵基于时间而不是按水平移动距离(假设侧滚​​)。您可以将敌人的波存储在具有触发距离的队列中;当玩家的行进距离大于队列最前面的对象的触发距离时,将其从队列中弹出并生成。

与基于时间的解决方案相比,该解决方案更适合与图形级编辑器集成。当敌人产生时,使沿着滚动背景匹配特定点变得容易得多。


4
作为奖励,如果您全局或部分更改滚动速度,它将使以后的敌人保持在正确的生成位置,因为如果是基于时间的,则敌人会在正确的位置生成。
AttackingHobo

2

我建议您学习PowerManga的代码作为参考。它们有两种级别:侧向滚动(类似“提拉式”)级别,其中事物位于距级别起点特定距离处,并且随机生成其他事物;以及“静止”层次(àgalaga),其中仅解析一波在上一个完成其模式之后。

当然,可以通过连续的贝塞尔曲线来有效地计划波动图(维基百科页面上有一个简洁的动画对此进行解释)。

如果我可以发表最后的评论,我将XML完全放在这里,以支持更具表现力,更易于维护且在游戏编程中更有用的东西,例如LUA脚本。

HTH。


我已经使用贝塞尔曲线存储敌人的动向(也已在xml中序列化)。我主要使用XML,因为.NET和XNA都内置了对序列化/反序列化的支持。LUA脚本听起来不错,但需要更多工作。但是,我一直计划使用它,因此在完成一些基本引擎后,我一定会对其进行研究。Finallt,在前一个之后产生波的想法听起来很有趣。
pek 2011年

2
XML是很好的,只要它是由工具生成的,并且不是手动编辑的即可。尽管脚本语言对于特殊情况(例如老板)可能有用,但这是定义标准攻击模式的一个完全独立的问题,不是吗?
bluescrn 2011年

0

考虑按程序产生敌人。我知道这与您想要的答案有很大不同,并且可以间接地完全解决问题。

如果要执行此操作,我将为每个敌方单位分配一个“点”值,以说明其难易程度,然后为等级分配一定数量的点-100点相当于100个1点敌人,或者1个100点敌人,或两者之间的任何东西。

您可能需要对此加以限制,以使您在第一级上没有得到100点的首领,或者您的敌人数量最少,并且您可能想定期轮询剩下的敌人并拉动敌人。屏幕上的下一个。

您可以通过编排来更进一步:例如,位置和点的集合。一行(行或列)中有七个单点敌人,或者两侧有两个三点的五个点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.