Adobe Flash Builder 4 简体中文正式版 Windows版点击下载:http://g.youkuaiyun.com/5134151
Adobe Flash Builder 4 简体中文正式版 Mac版点击下载 :http://g.youkuaiyun.com/5134152
Adobe 在线课堂:http://adobev.youkuaiyun.com/zx/index.html
Adobe平台技术峰会课程视频:http://adobev.youkuaiyun.com/
这个标题有些不太准确,因为我们离实际创建人们所了解的游戏尚有一段距离。在本文中,我们将讲解如何创建游戏中的对象 – 用 Pushbutton引擎 的用语,它们被称为 实体( Entities ) 。
性能,性能,还是性能 与其他形式的开发不同,性能和速度是游戏开发的基石。如果一个游戏执行地不好,或运行迟缓,则不管一款游戏理念有多伟大,多数人还是会转而寻求更好的选择。游戏实体一般是组合对象, 其继承链很浅。
这会带来大量的好处。通过保持较浅的继承链 ( 从 基类 中移除一次或两次 ) ,你创建的对象就不会充斥那些永远不可能用到的代码。如果你需要为两个或更多不相关但需要相同功能的继承链添加不相关的功能,它还可避免繁重的重构作业。这就要涉及组合。通过组合对象,你可轻松地添加或移除每个实体类型需要的功能。较之具有膨胀的潜在风险的继承链,这种继承链更为稳定有效。
我会在将来的文章中详述这一点,但我只想对通过 Pushbutton引擎 创建和管理游戏项目的方法背后的理论进行简要的解释。让我们介绍如果通过创建一个简单实体来开始使用 PBE 。
启动 PBE
第一件事就是根据我在前面的 “Setting Up Your IDE” (创建你的IDE )一文中的说明 ( 如果你想要使用 MXML ,我将另做一文进行介绍)创建一个 ActionScript 基本文件。和很多库一样, Pushbutton引擎 可为你提供的东西可多可少,取决于你对它堆肥熟练程度;当你对其更加熟悉后,将可以进一步探索其中,以便使其用起来更加得心应手。但是现在,我们只是介绍一些用于创建简单地互动演示的基本的构筑元素。
首先我们要创建两个项目 – 一个场景和一个游戏玩家 ( 后面再介绍敌人)。把场景看做一个容器,你可以在其中放入所有的游戏对象。场景可不止一个,如果你愿意,可以创建无穷个场景。创建一个 sceneView (场景)实例并不费事。首先,你需要创建一个 SceneView 类,并设置其宽度和高度 – 非常简单。你还可给场景命名,就绪后,将其传至 PBE 主类进行初始化 ( 如下编码所示)
|
| 1 2 3 4 5 6 7 8 9 | protected function initializeScene () : void { _sceneView = new SceneView () ; _sceneView. name = "mainView" ; _sceneView. width = 800 ; _sceneView. height = 480 ;
PBE. initializeScene ( _sceneView ) ; } |
你可能会问 PBE 是什么。它就是 Pushbutton引擎 的主类,对整个游戏进行管理。如你所见,场景被传至 PBE 类的 initializeScene() 方法中。如程序说明书中所述:
“ 这一类做出有些关于展示什么元素和模块的假设。如果你要做一些奇怪的东西,你可能需要直接访问这一类为你制作的东西 。但是,如果你的工作刚刚开始,这可能是一个非常有用的工具包。”
补充遗漏的最后几项
在对新添加的场景进行测试前,你需要为你的 基类 添加一些东西。首先你需要定义你要创建的 SWF 的实际尺寸。要进行这一工作,可将你的 文档类 顶部的 SWF 元数据标签设置如下:
1 | [ SWF ( width = "800" , height = "480" , frameRate= "60" )] |
注意,场景所用尺寸和实际 SWF 尺寸一般是相同的,因此有些值是重叠的。最后一步是告诉 PBE 你想要启动 引擎 。只需调用 PBE.startup() 并将其传至你的游戏的主类,如下所示:
1 | PBE. startup ( this ) ; |
需要注意的一点是, 主类需要从 Sprite (精灵)处继承 – 和大多数事物一样,这不应存在问题,因为你不仅仅需要通过该关键词将其传至你的应用软件的主 文档类 。你还需要确保 PBE.startup() 被首先调用(一般在构造函数中)。如果你不首先调用它,则可能导致过多的空引用错误 – 因为没有创建出任何一个内置帮助文件。 虽然我本人清楚这点,但还是值得一提。
当前的代码如下:
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 | package { import com. pblabs . engine . PBE ; import com. pblabs . engine . entity . IEntity ; import com. pblabs . engine . entity . allocateEntity ; import com. pblabs . rendering2D . ui . SceneView ;
import flash. display . Sprite ;
[ SWF ( width = "800" , height = "600" , frameRate= "60" )] public class Main extends Sprite {
public function Main () { PBE. startup ( this ) ; initializeScene () ; }
protected function initializeScene () : void { var _sceneView:SceneView = new SceneView () ; _sceneView. name = "MainView" ; _sceneView. width = 800 ; _sceneView. height = 600 ;
PBE. initializeScene ( _sceneView ) ; } } } |
然后进行测试。很令人吃惊是不是?我知道你只是看到一个黑屏。这是因为我们还没有在屏幕上添加任何东西。接下来让我们添加一个简单地精灵来代表游戏玩家。
添加实体
如前所述, Pushbutton引擎 中的所有对象都称为实体。不仅如此,不久你还会了解到某些实体是怎么称呼 / 指代的。例如,游戏玩家被称为主角。另外,当我们开始介绍实体的组合时,你会发现这中通用命名惯例也适用其中。如果你不喜欢,也不要觉得必须按照这个规矩做。你也可以对你的变量进行自由命名。需要注意的是,范例代码遵循的是这种通用命名法。
现在来看如何将一个实体拖动并添加至场景中。首先,你需要配置实体。这项工作可通过调用 allocateEntity() 来完成,而不是使用新的关键词。其原因有两个。首先,创建对象是一项“昂贵”的过程 ( 记不记得我曾经提到过速度和性能),采用 allocateEntity ,可访问隐藏的实体类,并调用一个实例。第二,它能通过对象池进行灵活的再利用。如果你要在屏幕上创建大量的敌人,这就非常有用。 当它们被摧毁后,不用创建新的敌人,只需从对象池中再利用“已死”的敌人就可以了。
配置了实体后,你需要对其进行初始化,方可进行使用。只需调用实体的 initialize() method 。从下列代码中可以看出主角实体是如何配置和初始化的。
1 2 3 4 5 6 | protected function initializePlayer () : void { var _hero:IEntity = allocateEntity () ;
_hero. initialize ( "Hero" ) ; } |
这样看上去不错,但是这还只是一个敌人实体,因此我们需要进行组合,赋予其一些属性。首先,让我们通过一种空间( Spatial )元素来为其提供形态中 – 在这里,该空间元素是一种简单空间元素( SimpleSpatialComponent )。空间元素背后的原理是,它们主要负责将实体放在环境中 – 如果愿意,你可以为其提供其自身的空间。
1 2 3 4 5 6 7 8 9 10 11 12 13 | protected function initializePlayer () : void { var _hero:IEntity = allocateEntity () ;
var _spatial:SimpleSpatialComponent = new SimpleSpatialComponent () ; _spatial. size = new Point ( 100 , 100 ) ; _spatial. position = new Point ( 0 , 0 ) ; _spatial. spatialManager = PBE. spatialManager ;
_hero. addComponent ( _spatial, "Spatial" ) ;
_hero. initialize ( "Hero" ) ; } |
观察已经添加的空间代码,你会发现为实体添加元素的基本步骤:
· 创建一个元素实例;
· 设置所需的元素参数;
· 将元素添加至实体;
· 重复以上步骤。
对于空间代码,我想要强调其与一般 ActionScript 应用软件的区别,这与位置有关。 Pushbutton引擎 中的位置是不同的,因为注册点 0,0 实际上是可见区的一个死点,而不是传统基于 Flash 的内容中的左上点。因此,当设置一个实体的初始位置时,如果需要将其置于左上,记得要使用负值。
既然我们的实体存在于实际场景中,我们就需要赋予其一定的形态,因为它没有任何图形表示,所以目前还是“看不见的”。只需为其添加另一个元素即可。在这里,该元素是一个渲染器元素。渲染器元素有多种外观,但我们现在看到的这种是简单形状渲染器( SimpleShapeRenderer )。顾名思义,它可便于你为实体添加形状。比如,要创建一个正方形的步骤如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var _renderer:SimpleShapeRenderer = new SimpleShapeRenderer () ; _renderer. fillColor = 0x000000; _renderer. fillAlpha = 1 ; _renderer. lineAlpha = 0 ; _renderer. isSquare = true ; _renderer. isCircle = false ; _renderer. scene = PBE. scene ;
_renderer. sizeProperty = new PropertyReference ( "@Spatial.size" ) ; _renderer. positionProperty = new PropertyReference ( "@Spatial.position" ) ; _renderer. rotationProperty = new PropertyReference ( "@Spatial.rotation" ) ;
_hero. addComponent ( _renderer, "Renderer" ) ; |
这样你的渲染器元素可对空间元素的改变做出反应 – 这里,这种改变指其大小、位置或旋转的变化。你也可以在你自己的元素中创建用于控制它们(及其他属性)的方法,这样使得实际元素及其所含引用可易于从你的实体中“热插拔”。同时,它还可提高再利用率,并避免实体与其元素之间形成不牢固的关系。
完成
现在已经有了场景和“主角”,你可以再次运行你的游戏。一旦运行了代码,你会在屏幕正中看到一个漂亮的黑色正方形。这虽然不是什么惊人的成就,但是一个很好的开始,你得先学会走,才能学跑,不是吗?
我将完整的代码表和实际 Flash Builder项目 列在下方:
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 50 51 52 53 54 55 56 57 58 59 60 61 62 | package { import com. pblabs . engine . PBE ; import com. pblabs . engine . entity . IEntity ; import com. pblabs . engine . entity . PropertyReference ; import com. pblabs . engine . entity . allocateEntity ; import com. pblabs . rendering2D . SimpleShapeRenderer ; import com. pblabs . rendering2D . SimpleSpatialComponent ; import com. pblabs . rendering2D . ui . SceneView ;
import flash. display . Sprite ; import flash. geom . Point ;
[ SWF ( width = "800" , height = "600" , frameRate= "60" )] public class Main extends Sprite { public function Main () { PBE. startup ( this ) ;
initializeScene () ; initializePlayer () ; }
protected function initializeScene () : void { var _sceneView:SceneView = new SceneView () ; _sceneView. name = "MainView" ; _sceneView. width = 800 ; _sceneView. height = 600 ;
PBE. initializeScene ( _sceneView ) ; }
protected function initializePlayer () : void { var _hero:IEntity = allocateEntity () ;
var _spatial:SimpleSpatialComponent = new SimpleSpatialComponent () ; _spatial. size = new Point ( 100 , 100 ) ; _spatial. position = new Point ( 0 , 0 ) ; _spatial. spatialManager = PBE. spatialManager ;
_hero. addComponent ( _spatial, "Spatial" ) ;
var _renderer:SimpleShapeRenderer = new SimpleShapeRenderer () ; _renderer. fillColor = 0x000000; _renderer. fillAlpha = 1 ; _renderer. lineAlpha = 0 ; _renderer. isSquare = true ; _renderer. isCircle = false ; _renderer. scene = PBE. scene ;
_renderer. positionProperty = new PropertyReference ( "@Spatial.position" ) ; _renderer. rotationProperty = new PropertyReference ( "@Spatial.rotation" ) ;
_hero. addComponent ( _renderer, "Renderer" ) ;
_hero. initialize ( "Hero" ) ; } } } |
我列出了 ActionScript 项目 如下 ( 这是在 Flash Builder Burrito 中创建的,尽管本应在 Flash Builder 4 中工作)。如果你使用的是 Flash Professional ,只需将 ActionScript 主类从 zip 文件中抓出即可 – 或使用以上代码。
相关文件
PBE001_GettingStarted.zip