as3 版 flash 游戏的结构设计(一)
最近关注 flash 游戏设计,发现了这个系列的文章,觉得还可以,适合新手学习和参考。
所以把它翻译过来(不是原原本本,根据意思做了很大变化),希望入门有帮助,我也在入门,呵呵
欢迎转载,请注明出处(包括译者和作者)
原文:Designing the structure of a Flash game - AS3 version
作者层级写过: Designing the structure of a Flash game ,这篇文章是针对在 flash 里的动作里直接写到,现在这个 as3 版本,者采用了 class(类)的形式。更有面向对象的感觉,原来就感觉是面向过程的。
刚开始使用类来代替,如果你不熟悉面向对象,就感觉很不直观;但是如果你熟悉后,你完全将这个用作你以后开发游戏的模板。
在这个游戏中,我们使用了 4 个屏幕切换(后面简称:切屏):splash (开始屏),info(如何玩),game itself(游戏本身)和 game over(游戏结束)…… 并且你还可以根据需求非常简单的添加其他屏。
首先给游戏做一个规划:
在图片中你能看到游戏的 4 屏,并且指出了每个按钮的屏幕切换方向。如,在 splash(开始)屏你可以跳转到 info(介绍)屏,但是你不能直接跳转到 game over(游戏结束)屏。
主函数 the_game (因此文件命名为 the_game.as),把其他对象和类被列在库中,根据红色的顺序进行引用。
查看链接列(元件的链接属性,常识,不多作解释),非常清楚的显示出其他需要的四个 as 文件:game_over.as,how_to_play.as,splash.as 和 the_game_itself.as。
让我们看看详细的实现(blog 主题原因,代码呈现有点问题):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package { import flash.display.Sprite; public class the_game extends Sprite { public var splash_screen:splash; public var play_screen:the_game_itself; public var game_over_screen:game_over; public var how_to_play_screen:how_to_play; public function the_game() { show_splash(); } public function show_splash() { splash_screen = new splash(this); if (how_to_play_screen) { removeChild(how_to_play_screen); how_to_play_screen = null; } addChild(splash_screen); } public function show_how_to_play() { how_to_play_screen = new how_to_play(this); removeChild(splash_screen); splash_screen = null; addChild(how_to_play_screen); } public function show_game_over() { game_over_screen = new game_over(this); removeChild(play_screen); play_screen = null; addChild(game_over_screen); |
}
public function play_the_game() {
play_screen = new the_game_itself(this);
if (splash_screen) {
removeChild(splash_screen);
splash_screen = null;
}
if (how_to_play_screen) {
removeChild(how_to_play_screen);
how_to_play_screen = null;
}
if (game_over_screen) {
removeChild(game_over_screen);
game_over_screen = null;
}
addChild(play_screen);
}
}
}
详细步骤说明:
行 4-7: 使用相应的类声明游戏切屏的对象。
行 8-10: 这是主要函数,simply 调用一个显示 splash 屏的函数。
行 11: 这样一个函数: show_splash。
行 12: 函数的核心:我将为第 4 行声明的 splash_screen 变量 new 一个对象。注意这里的参数:我要求它记住是哪个类调用了它,在这里 this 其实就是 the_game 类。
行 13: 检查场景上是否已经有 how_to_play_screen 屏。这里有可能是从 info 屏切换到 splash 屏的。
行 14: 如果是,我需要在场景上移除这一屏……
行 15: 设置变量为 null,这个非常重要因为 removeChild 只是在场景上移除 sprite,而内存中依然存在的。
行 17: 最后,我将 splash 屏放置到场景上。
其他剩下的也都是相同的操作,分配变量、添加并移除相应的 sprite,直到结束为止。
现在让我们看看 splash.as 中 splash 类的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package { import flash.display.Sprite; import flash.display.SimpleButton; import flash.events.MouseEvent; public class splash extends Sprite { public var main_class:the_game; public function splash(passed_class:the_game) { main_class = passed_class; play_button.addEventListener(MouseEvent.CLICK, on_play_button_clicked); how_to_button.addEventListener(MouseEvent.CLICK, on_how_to_button_clicked); } public function on_play_button_clicked(event:MouseEvent) { main_class.play_the_game(); } public function on_how_to_button_clicked(event:MouseEvent) { main_class.show_how_to_play(); } } } |
行 7: 主要函数,查看 the_game 类型的参数 passed_class: 这函数的传递可以在 the_game.as 的第 12 行可以找到
行 8: 记住调用的此类的原始类
行 8-9:附加两个按钮的监听,当玩家按 "play" 或 "how to play" 按钮时触发。
行 12: 当玩家点击 play 按钮时,函数被执行
行 13: 这个文件的核心:我在主类中调用 play_the_game () 函数。我们能知道主类哪里来,就需要感谢 main_class 变量了。
这里的函数执行就和前面 show_splash 的解释一样,添加和移除相应的 sprite 并调用其他的类。
其他类也和这个是类似的,所以不做过多注释。
how_to_play.as
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package { import flash.display.Sprite; import flash.display.SimpleButton; import flash.events.MouseEvent; public class how_to_play extends Sprite { public var main_class:the_game; public function how_to_play(passed_class:the_game) { main_class = passed_class; play_button.addEventListener(MouseEvent.CLICK, on_play_button_clicked); back_button.addEventListener(MouseEvent.CLICK, on_back_button_clicked); } public function on_play_button_clicked(event:MouseEvent) { main_class.play_the_game(); } public function on_back_button_clicked(event:MouseEvent) { main_class.show_splash(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package { import flash.display.Sprite; import flash.display.SimpleButton; import flash.events.MouseEvent; public class the_game_itself extends Sprite { public var main_class:the_game; public function the_game_itself(passed_class:the_game) { main_class = passed_class; die_button.addEventListener(MouseEvent.CLICK, on_die_button_clicked); } public function on_die_button_clicked(event:MouseEvent) { main_class.show_game_over(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package { import flash.display.Sprite; import flash.display.SimpleButton; import flash.events.MouseEvent; public class the_game_itself extends Sprite { public var main_class:the_game; public function the_game_itself(passed_class:the_game) { main_class = passed_class; die_button.addEventListener(MouseEvent.CLICK, on_die_button_clicked); } public function on_die_button_clicked(event:MouseEvent) { main_class.show_game_over(); } } } |
下载源代码 .
这是第一篇,有空继续第 2 篇。