创建你的第一个游戏

来源:互联网 发布:汉诺塔问题算法分析 编辑:程序博客网 时间:2024/05/18 20:04

Adobe Flash Builder 4 简体中文正式版 Windows版点击下载:http://g.csdn.net/5134151
Adobe Flash Builder 4 简体中文正式版 Mac版点击下载:http://g.csdn.net/5134152
Adobe 在线课堂:http://adobev.csdn.net/zx/index.html
Adobe平台技术峰会课程视频:http://adobev.csdn.net/

 

 

这个标题有些不太准确,因为我们离实际创建人们所了解的游戏尚有一段距离。在本文中,我们将讲解如何创建游戏中的对象– 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(100100);

_spatial.position = new Point(00);

_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(100100);

               _spatial.position = new Point(00);

               _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