Actionscript 3 创建一个精心编码的级别选择屏幕

Actionscript 3 创建一个精心编码的级别选择屏幕,actionscript-3,Actionscript 3,目前正在开发我的第一个全速闪现游戏,我现在正在实现多个关卡,这意味着我必须制作一个关卡选择屏幕。我在实际完成这一点上没有问题,但我知道如何做到这一点的唯一方法是,每次有人通过一个新的级别时,都可以使用一个不同的级别选择屏幕(即,在通过级别2后,现在有两个按钮可用,用于级别1和级别2,而不仅仅是级别1) 当然,这是非常低效的。我希望能够一次完成我所有级别的任务。我已经提前知道,我将有9个级别,所以一个3x3的按钮网格系统是可能的(可能使用2个用于循环,用于x和y位置?) 在level select

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

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

在level select和其他页面之间导航没有问题,我应该能够做到这一点。我真正的问题是创建实际的关卡选择屏幕来显示不同数量的可点击按钮,这取决于游戏的进展程度。我的意思是,我猜我只是为用户创建了一些布尔值,一旦传递了一个级别,我就将这些布尔值更改为true,然后将布尔值链接到创建按钮而不是静态文本字段。那么我是否可以在水平选择屏幕上单独定位每个按钮?如果有人能对如何制作这种级别选择屏幕有所启发(我指的是code=p),我们将不胜感激,特别是关于在舞台上添加按钮与文本字段的部分


另外,创建9个不同的按钮是浪费吗?最好只创建一个按钮,然后更改其上的文本字段以显示级别编号。我能用一个动态文本字段来完成这项工作吗?

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

关于如何在stage中添加自定义按钮-首先,最好将整个级别选择器包装成一个精灵,为其编写AS3代码,在特定坐标处放置级别按钮、关闭按钮(也称为“no I want to review other options from selection level”one)、其他数据,如带有级别名称的文本字段等,只要你觉得合适。例如(仅具有级别按钮,大部分为伪代码):

public类LevelSelector扩展了Sprite{
私有静态常量thumbnailClasses:Array=[Level01Bitmap,Level02Bitmap,…];
//嵌入这些
私有变量gridXOffset:Number=60;
私有变量gridYOffset:Number=60;
private var gridXDimension:int=3;//行中有多少个按钮
私有变量gridXBase:Number=30;
私有变量gridYBase:Number=10;
//其他初始化数据
私有变量按钮:向量。//buttons存储在此处
公共函数LevelSelector(){
按钮=新向量。();
//其他初始化

对于(var i:int=0;i听起来您需要将问题分解为更小的步骤。我不确定您是使用Flash时间线还是外部。作为类。我建议使用类,因为您可以更灵活地在屏幕上显示内容。如果您不习惯使用类,以下内容可能没有多大意义

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


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

是的,我正在使用类,啊,这是有意义的!我喜欢关于使用数组索引值来确定文本字段编号的建议。下面是一些问题。对于ThumbnailClass,我是否必须为每一个类创建一个类?它们是实际的级别预览,对吗?对于按钮存储部分,你是否建议创建一个按钮数组/向量,并为每个级别创建一个按钮?最后…我不太了解查询级别可用性部分…你的for循环太棒了我喜欢它HeHeHe对于ThumbnailClass,是的,它们是预生成的级别预览。也就是说,你开始一个级别,看屏幕ot、裁剪、调整大小、将其嵌入SWF并命名为
Level01Bitmap
。某些游戏的级别缩略图与此完全相同。查询级别可用性-您可以为此调用静态方法,也可以指定一个回调函数,如果提供int,该回调函数将返回布尔值,并且
LevelButton
实例将接受this作为其
启用的
属性,例如,不会对鼠标单击作出反应-这取决于其实现。关于为级别创建按钮,是的,如果您希望通过单击可以选择级别,我建议这样做。如果有几十个级别,则最好为按钮指定不同的图片(然后将这些图片而不是类名存储在该数组中
thumbnailClasses
),并有几个按钮可以选择一组中的一个,以及一组众多的级别(愤怒的小鸟每次显示15组,您可以通过按一选择一个级别)
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
    }
}