目前正在开发我的第一个完整的Flash游戏,我现在正在实现多个级别,这意味着我必须创建一个级别选择屏幕。我实际上没有遇到任何问题,但我知道如何做到这一点的唯一方法就是每当有人通过一个新级别时,就可以使用不同的级别选择屏幕(即,在通过级别2之后,现在有2个按钮可用,对于1级和2级而不是1级)。
当然,这是非常低效的。我希望能够一次性完成所有级别的操作。我事先已经知道我将有9个级别,所以可以使用3x3网格系统的按钮(可能使用2个for循环,x和y位置?)。
在级别选择和其他页面之间导航是没有问题的,我应该能够做到这一点。我真正的问题是创建实际的级别选择屏幕,以显示不同数量的可点击按钮,具体取决于游戏进展的程度。我的意思是我猜我只是为用户创建了一些布尔值,一旦传递了一个级别,我将这些布尔值更改为true,然后将布尔值链接到创建按钮而不是静态文本字段。那么我只需将每个按钮单独放在水平选择屏幕上吗?如果有人能够解决关于如何完成制作这种级别选择屏幕的一些亮点(并且通过光我意味着代码= p),我将非常感激,特别是关于将按钮添加到舞台与文本字段的部分。
此外,创建9个不同的按钮是否浪费?只需创建1个按钮然后只需更改它们上的文本字段即可显示级别编号。我可以使用动态文本字段完成此操作,只需更改该文本字段中的文本吗?
答案 0 :(得分:1)
基本上是的,你可以做任何你认为合适的事情,只需为这一切做好准备。这主要是架构问题,而不是实际编程问题。关于进度,您可以跟踪最高可用级别,只显示可用的级别,或显示级别进度(比如一级完成1星,另一级2星,你制作星星按钮)等另外,你可能会看看愤怒的小鸟水平选择器,它有15个按钮,为什么你不能制作9?
关于如何向舞台添加自定义按钮 - 首先,如果将整个关卡选择器包装到Sprite中,最好将AS3代码写入具有放置在特定坐标的关卡按钮,关闭按钮(也就是“我不想要”)在选择级别“one”之前查看其他选项,其他数据,如具有级别名称的文本字段等,无论您认为合适。一个例子(只有级别按钮,主要是伪代码):
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
}
}
答案 1 :(得分:1)
听起来你需要将问题分解为更小的步骤。我不确定你是使用Flash时间轴还是外部.as类。我建议使用Classes,因为您可以更灵活地在屏幕上显示的内容。如果您不习惯使用类,以下可能没有多大意义......
在您的主Document.as类中,您可以跟踪播放器已完成的级别(可能在与级别编号对应的布尔值数组中)。当需要LevelSelect页面时,创建一个新的LevelSelect页面并将_levelsCompleted Array作为参数传递。 LevelSelect类实例可以使用传递的数组来确定需要多少个LevelButtons。循环传递的布尔数组,如果索引值为true,则添加LevelButton。每个LevelButton都可以传递它的级别编号(循环计数器),可以在其TextField中使用它来识别它(记住数组索引是零索引的,因此级别'1'实际上可能是'0')。
如果这没有任何意义,请告诉我。