创建博客 登录  
 加关注
   显示下一条  |  关闭

 
 
 

日志

 
 

pushbutton的入门篇翻译  

2009-12-14 08:55:16|  分类: Flex |  标签: |字号 订阅

记录一些pushbutton的翻译 - wodesign -
由于要开发一款flashGame《2012玛雅预言》,又选择了pushbutton做为引擎,所以就要开始了解和学习pushbutton了O(∩_∩)O,现在想想06年的时候为一家策划公司做了近一年的那些小单机版的flash游戏真是幼稚的了,感慨一下。所以,也顺便把英文的一些资料翻译了下,整理放着,大家分享。
------------------------------------------| 不断更新中…… |------------------------------------------
开头还是那句给你安全感的话:在Flash Builder里使用PBEngine是很简单的。
在Flash Builder里创建一个项目的过程就不要翻译了,说,把PBEngine.swc放到工程里的lib/文件夹里,刷新下,就可以了。如果你不满足于此,还要一探PBEngine的代码,那就这样:选中项目-属性(properties)-路径( Flex Build Path)-源文件路径标签(Source Path),点击"添加文件夹(Add Folder)",选择PBEngine文件夹下的src。Ok,现在记住,好奇害死猫。
其实这都是基本的使用操作,翻译一下吧也,热热身先。
对了,这里顺便说个小窍门,我是把src直接复制到libs目录下的,这样整个工程的内容就在一起了,当和伙伴分享工程的时候,他不会再来找你麻烦。
那么接下来,万宗不变的HelloWorld:
1.创建一个ActionScript项目,比如叫“HelloWorld”,
package {
 import com.pblabs.engine.core.Global;
 import com.pblabs.engine.debug.Logger;
 
 import flash.display.Sprite;

 public class helloWorld extends Sprite
 {
  public function helloWorld()
  {
   Global.startup(this);
   Logger.print(this,"Hello World!");
  }
 }
}
很明显,PBEngine还是很含蓄的,它不会自己随着程序的启动的而自动启动,我们需要手动的来startup(),是的,我喜欢,这满足了我的控制欲。
--------------------------------------------|  插广告,《2012玛雅预言》一个关于未来的游戏 |--------------------------------------------
那么接下来,很符合常规思路:创建场景和主角:
public function helloWorld()
{
 Global.startup(this);
 Logger.print(this,"Hello World!");
 createScene();
 createHero():
}
完全可以想象的出来,createScene的目的是:创建一个空间,这样就可以掌控所有的场景里的元素,是的,我们需要控制。createHero则创建了一个角色,我们的英雄。其实,程序不过是现实逻辑的抽象和实现,就算要我来写这个引擎,我也会这样做,这是比较符合我们的对现实世界的认识的方法。
那么,看看两个方法的具体实现:
  private function createScene():void
  {
   var scene:IEntity = allocateEntity();
   scene.initialize("scene");
   var spatial:BasicSpatialManager2D = new BasicSpatialManager2D();
   scene.addComponent(spatial,"spatial");
   
   var renderer:Scene2DComponent = new Scene2DComponent();
   
   renderer.spatialDatabase = spatial;
   
   var view:SceneView = new SceneView();
   view.width = 800;
   view.height = 600;
   renderer.sceneView = view;
   
   renderer.position = new Point(0,0);
   renderer.renderMask = new ObjectType("Renderable");
   
   scene.addComponent(renderer,"renderer");
  }
  
  private function createHero():void
  {
   var hero:IEntity = allocateEntity();
   hero.initialize("hero");
   var spatial:SimpleSpatialComponent = new SimpleSpatialComponent();
   spatial.spatialManager = NameManager.instance.lookupComponentByName("scene","spatial") as ISpatialManager2D;
   
   spatial.objectMask = new ObjectType("Renderable");
   spatial.position = new Point(0,0);
   spatial.size = new Point(50,50);
   
   hero.addComponent(spatial,"spatial");
   
   var render:SimpleShapeRenderComponent = new SimpleShapeRenderComponent();
   render.showCircle = true;
   render.radius = 25;
   render.positionReference = new PropertyReference("@spatial.position");
   render.rotationReference = new PropertyReference("@spatial.position");
   hero.addComponent( render,"render");
  }
如果你没有复制这些代码,而是像我一样自己打出来的,那你会有一点失落,因为运行后,你只是看到了一个蓝色的圆,还很丑。
不过庆幸的是,实际就是这样的。那么我们总结一下,看看这两段代码本质上在说什么:
创建一个独立体,或者一个元元素(类似container),那么就这样来实现:
var newEntity:IEntity = allocateEntity();
newEntity.intialize("entityName");
注意的是,所有的独立体,必须使用intialize()方法注册一个名字。这样看来引擎结构上似乎是使用了"发布/订阅模式"。
创建一个组件,或者说是一个元素,则是:
var newComponent:IEntitycomponent = new WhateverComponent();
newComponet.field = value;
newEntity.addComponent(newComponent,"TheComponentName");
--------------------------------------------|  插广告,《2012玛雅预言》一个关于未来的游戏 |--------------------------------------------
作为PBEngine来说的一个长处就是给游戏里的组件灵活的添加一些功能,比如说,让我们的英雄动起来。
首先回顾下上一个广告上面的内容,我们的hero有了两个组成部分:render和spatial,render使hero可视,spatial则给了hero生存空间,或者说是躯体。那么,现在我们要给hero新的功能,就是控制(名词)。这是英雄的大脑,可以控制英雄运动。我们当然不会自己去创造这个大脑,因为PBEngine已经为我们提供了一个基本大脑模型了,它的名字叫TickedComponent,这个类里有一个方法onTick(),这个方法会每秒被执行30次,运动逻辑可以写在这里。当然,我们得去实现这个大脑,最好是抽象出一个类,名字就叫"HeroCerebra",这的确是一个相当形象的名字。至于运动逻辑就不用多说了,看代码就是:
package wodesign
{
 import com.pblabs.engine.components.TickedComponent;
 import com.pblabs.engine.entity.PropertyReference;
 
 import flash.geom.Point;

 public class HeroCerebra extends TickedComponent
 {
  public function HeroCerebra()
  {
   super();
  }
  
  public var positionReference:PropertyReference;
  private var direction:int = 1;
  
  public override function onTick(tickRate:Number):void
  {
   var position:Point = owner.getProperty(positionReference);
   
   if(position!=null){
    if(position.x<-375){
     direction = 1;
    }else if(position.x>375){
     direction = -1;
    }
    position.x += direction * 5;
    owner.setProperty(positionReference,position);
   }
  }
 }
}
实在是太精彩了,得益于PB,我们只需要关心我们的运动逻辑就可以了,其余的,让PB来做好了。生活就应该是这样的,为什么很多程序员总是要加班很多而不能陪伴自己的亲人或朋友呢,因为我们太高估自己了,总是认为所有的事情都应该自己动手做,当然,以前我也是这样,我现在很懊悔,如果上苍再给我一次重来的机会……
或许你会发现这个变量owner,我想,你猜也知道它是谁的索引。
好了,赶紧给我们的英雄装上大脑吧:
var heroCerebra:HeroCerebra = new HeroCerebra();
heroCerebra.positionReference = new PropertyReference("@spatial.position");
hero.addComponent(heroCerebra,"heroCerebra");
稍微解释一下这一段的意思,当然要先new出来,然后@spatial.position的意思真的可以从字面上都能理解出来,也就是“躯体的位置”,将这个躯体的位置告诉大脑,大脑才会给躯体新的命令。呵呵,一点都不抽象,可不是吗?

--------------------------------------------|  插广告,《2012玛雅预言》一个关于未来的游戏 |--------------------------------------------

好了,Hero真的活了,但对于他总是来回度步的简单而无聊的行为,我们一会表示不满,这不怨他其实,因为他的大脑就那么点逻辑,还要他怎样呢?好吧,让我们来控制Hero吧。为了简单起见,就来实现左右键(键盘)控制英雄的移动吧,实现起来易如反掌:
    if(InputManager.isKeyDown(InputKey.RIGHT)){
     position.x += 15;
    }
    if(InputManager.isKeyDown(InputKey.LEFT)){
     position.x -= 15;
    }
不用我告诉你将这些代码写在哪里吧。PB已经逐步的向我们展示出其给我们带来可以清闲的喝茶的时间有多么的长,即使你自己煮茶都可以,因为PB真的为我们省下了很多时间和脑细胞。可以想象的出,PB肯定也提供了关于鼠标控制的实现,偷偷乐着先。
接着,我们的英雄有了智慧之后嫌自己太丑了,好吧,我们试着给他一个英俊的形象。自己找一张PNG格式的图片,然后这样:
   var render:SpriteRenderComponent = new SpriteRenderComponent();
   render.loadFromImage = "assets/hero.png";
   render.layerIndex = 10;
   
   render.positionReference = new PropertyReference("@spatial.position");
   render.sizeReference = new PropertyReference("@spatial.size");
   hero.addComponent( render,"render");
好了,这样就可以了。
英雄说,是不是也给他一个好一点的背景环境。我们答应他,因为他是英雄,这样来实现:
  private function createBackground():void
  {
   var bg:IEntity=allocateEntity();
   bg.initialize("bg");
   var spatial:SimpleSpatialComponent=new SimpleSpatialComponent();
   spatial.spatialManager=NameManager.instance.lookupComponentByName("scene", "spatial") as ISpatialManager2D;

   spatial.objectMask=new ObjectType("Renderable");
   spatial.position=new Point(0, 0);
   spatial.size=new Point(800, 600);

   bg.addComponent(spatial, "spatial");

   var render:SpriteRenderComponent=new SpriteRenderComponent();
   render.loadFromImage="assets/bg.png";
   render.layerIndex=1;

   render.positionReference=new PropertyReference("@spatial.position");
   render.sizeReference=new PropertyReference("@spatial.size");
   bg.addComponent(render, "render");
  }
是的,毫无疑问,加一个背景和加一个英雄是没有什么不同的,所以我们现在可以理解上帝的那句话了“世界万物都是平等的”。

--------------------------------------------|  插广告,《2012玛雅预言》一个关于未来的游戏 |--------------------------------------------

按照官方自带的文档来说,基础已经结束了,官方分了五个小课堂,我一下子全部倒腾出来了,除了中间添加了广告之外,应该更显顺畅。
有的同学会说啦,就这么简单的一个效果,还要什么引擎,牛刀杀鸡了吧。
是的,这里只是演示一下PB的刀法走路,如果真的只是做这么简单的一个东东的确不需要PB出马,但如果真的要杀牛了,手里却只有把鸡刀,那将是是件很郁闷很危险的事情了。
可以看下DEMO,或者下载源文件(工程文件)。

  评论这张
转发至微博
转发至微博
0   分享到:        
阅读(216)| 评论(1)| 引用 (0) |举报

历史上的今天

相关文章

最近读者

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--相关文章--> <#--历史上的今天--> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012