【问题标题】:What is the best way to manage game levels in flash games?在 Flash 游戏中管理游戏关卡的最佳方法是什么?
【发布时间】:2011-10-20 04:04:49
【问题描述】:

我还在学习,我正在尝试为我的第一个游戏(平台游戏)设计游戏关卡。

我有一些直截了当的问题,因为我觉得我走错了路。

每个级别都应该有自己的班级吗?

我想要做的事情是,当一个人完成第一级时,我将与该类有关的变量设置为空,注销所有事件并从舞台上删除所有子级,调用第二级构造函数,而不声明任何变量,新级别2();并将静态变量设置为 true 以“保存”该进度,以防有人想再次玩该关卡。

但是我发现代码变得杂乱无章,我遇到了问题,而且内存管理问题非常多。

我在互联网上搜索了它,但我找不到任何详细解释它的教程,所以我尝试了很多方法来实现我想要的,但现在我真的需要一些建议它不会迷路。

提前致谢。

【问题讨论】:

  • 您可能会在 gamedev.stackexchange.com 获得更专业的答案 - 您还需要更具体地了解您的游戏架构和游戏风格,因为存储关卡的方法可能会有所不同。跨度>
  • Level_1 应该扩展 Level,Level_2 应该扩展 Level..... 就像想的那样:)
  • 我喜欢 The_asMan 的方法。创建一个包含通用属性的超类,并使用子类专门化每个级别。
  • 如果你的所有关卡都遵循相同的格式,那么就有一个从 XML 文件获取参数的关卡类。它的额外好处是能够快速更改任何级别并使您的编码生活变得如此轻松

标签: flash actionscript-3


【解决方案1】:

我一直喜欢使用 2D 数组和编写 2 个函数:

  1. 将数组存储为字符串的函数
  2. 将字符串转换回二维数组的函数

这些函数将是 LevelManager 类的一部分,该类也将具有如下一些函数:

  • load(levelData:String):void - 根据关卡数据字符串加载关卡
  • unload():void - 卸载当前关卡
  • swap(levelData:String):void - 卸载当前关卡,然后加载一个新关卡 - 一个很好的功能,可以放入间歇动画。
  • save():String - 保存当前关卡(循环当前存在的敌人并创建新的关卡数据,这些数据将被返回
  • objectFromSnip(snip:String):void - 从 sn-p 生成一个对象(即由字符串表示的单个对象 - 见下文)。我通常在$ 处将以下内容分开,然后循环遍历生成的属性集并在它们上调用此函数。

关卡数据可能如下所示:

object#x#y$object2#x#y

其中$ 表示对象的分离,# 表示该对象的属性分离。

它的数组表示是:

[
    [object, x, y],
    [object2, x, y]
]

至于对象的创建,基本上你要做的是:

  • 使用getDefinitionByName() 创建您的对象。基本上这里发生的事情是您将上面的objectobject2 替换为您的类名。即:game.terrain.Grass#20#450
  • xy 和任何其他自定义属性应用于您在上面创建的对象。
  • 将对象添加到游戏中

希望这会有所帮助。如果没有,请尝试使用 XML 创建类似于上述的对象。

另外,您可以通过looking at my game here 看到这种方法的实践。

如果您使用关卡编辑器,您将能够在关闭屏幕上看到您的关卡数据,可能类似于以下内容:

2#36#20#o$t#12#12#w$t#12#16#w$t#12#24#w$t#12#28#w$t#12#20#w$g#20#11#o$1#24#21#o#200#110

关于每个对象的第一个属性的注释,这实际上表示一个更大的字符串以保持级别数据紧凑,即:

var shorthand:Object = {
    2: "game.objects.WoodenWall",
    g: "game.objects.Gate",
    t: "game.objects.Turret"
};

【讨论】:

    【解决方案2】:

    关卡数据通常存储在二维数组中,例如:

    level1=[[0,0,0,0,0],
            [0,0,1,0,0],
            [0,0,1,0,0],
            [1,1,1,1,1]]
    

    其中 1 代表地面,0 代表什么都没有,因为可能是屏幕中间有一座小山的平台游戏,或者是南面有墙的等距 RPG。如果实例之间可能存在重叠,您可以为每个级别保留单独的数组,例如,一个用于背景图形,一个用于舞台,一个用于敌人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多