0

目前正在开发我的第一个完整的 Flash 游戏,我现在正在实现多个关卡,这意味着我必须制作一个关卡选择屏幕。我实际上完成这一点没有问题,但我知道如何做到这一点的唯一方法是每次有人通过新关卡时都可以使用不同的关卡选择屏幕(即,通过关卡 2 后,现在有 2 个按钮可用, 用于 1 级和 2 级,而不仅仅是 1 级)。

当然,这是非常低效的。我希望能够一次完成所有级别的操作。我已经提前知道我将拥有 9 个级别,因此可以使用 3x3 的按钮网格系统(也许使用 2 个 for 循环,用于 x 和 y 位置?)。

在关卡选择和其他页面之间导航没问题,我应该可以做到。我真正的问题是创建实际的关卡选择屏幕来显示不同数量的可点击按钮,具体取决于游戏的进度。我的意思是我猜我只是为用户创建了一些布尔值,一旦通过一个级别,我将这些布尔值更改为 true,然后将布尔值链接到创建按钮而不是静态文本字段。那么我会在关卡选择屏幕上单独放置每个按钮吗?如果有人能阐明一些关于如何完成制作这种类型的关卡选择屏幕的信息(我的意思是代码 =p),将不胜感激,特别是关于将按钮添加到舞台与文本字段的部分。

另外,创建 9 个不同的按钮是不是很浪费?最好只创建 1 个按钮,然后更改它们上的文本字段以显示级别编号。我可以使用动态文本字段并仅更改该文本字段中的文本来完成此操作吗?

4

2 回答 2

1

基本上是的,你可以做任何你认为合适的事情,只要为这一切做好准备。这主要是架构问题,而不是实际的编程问题。关于进度,您可以跟踪可用的最高级别并仅显示可用的级别,或显示级别进度(例如,一个级别完成了 1 星,另一个有 2 星,然后您制作带有星星的按钮)等. 另外,你可以看看愤怒的小鸟关卡选择器,它有 15 个按钮,你为什么不能做出 9 个?

关于如何向舞台添加自定义按钮 - 首先,最好将整个关卡选择器包装到 Sprite 中,为其编写 AS3 代码,将关卡按钮放置在特定坐标处,一个关闭按钮(又名“不,我想查看其他选择级别之前的选项“一),其他数据(例如具有级别名称的文本字段等),无论您认为合适。一个例子(只有级别按钮,主要是伪代码):

public class LevelSelector extends Sprite {
    private static const thumbnailClasses:Array=[Level01Bitmap,Level02Bitmap,...];
    // embed these
    private var gridXOffset:Number=60;
    private var gridYOffset:Number=60;
    private var gridXDimension:int=3; // how many buttons in row
    private var gridXBase:Number=30;
    private var gridYBase:Number=10;
    // other initialized data
    private var buttons:Vector.<LevelButton>; // buttons stored here
    public function LevelSelector() {
        buttons=new Vector.<LevelButton>();
        // other initialization
        for (var i:int=0;i<thumbnailClasses.length;i++) {
            var b:LevelButton=new LevelButton();
            b.x=(i%gridXDimension)*gridXOffset+gridXBase;
            b.y=Math.floor(i/gridXDimension)*gridYOffset+gridYBase;
            b.picture=(new thumbnailClasses[i]()).bitmapData;
            // assuming thumbnails are embedded bitmap class names
            addChild(b);
            b.enabled=levelIsAvailable(i); // query level availability
            b.stars=getLevelPerformance(i); // query how many stars to draw
            b.addEventListener(MouseEvent.CLICK,buttonPressed); // listen for mouse
            buttons.push(b);
        }
    }
    private function buttonPressed(e:MouseEvent):void {
        var level:int=buttons.indexOf(e.target);
        var b:LevelButton=e.target; // if need to do something with the button
        // query correctness and navigate to level screen
    }
}
于 2013-07-30T08:33:22.520 回答
1

听起来您需要将问题分解为更小的步骤。我不确定您使用的是 Flash 时间线还是外部 .as 类。我建议使用类,因为您可以更灵活地在屏幕上显示什么。如果您不习惯使用类,那么以下内容可能没有多大意义......

在您的主 Document.as 类中,您可以跟踪玩家已完成的关卡(可能在与关卡编号相对应的布尔值数组中)。当需要 LevelSelect 页面时,创建一个新的 LevelSelect 页面并将 _levelsCompleted 数组作为参数传递。LevelSelect 类实例可以使用传递的数组来确定需要多少个 LevelButton。循环遍历传递的布尔数组,如果索引值为真,则添加一个 LevelButton。每个 LevelButton 都可以传递其级别编号(循环计数器),该编号可在其 TextField 中用于识别它(请记住,数组索引为零索引,因此级别“1”实际上可能是“0”)。

如果这没有任何意义,请告诉我。

于 2013-07-30T08:34:16.573 回答