闪无忧
 
首 页 业界新闻 业界杂谈 Flash教程 Flash源码 Flash图书 Flash酷站 Flex & AIR 供求信息
   本栏目通告:   有意向写收费精品教程的朋友,请联系本站合作
当前位置 :首页>flash教程>Flash应用开发>列表

关于游戏引擎PushButton的教程和演示(一)

[来源:蓝色理想 | 作者:wifeyang | 时间:2010-02-26 | 点击:  | 收藏本文  【 】]
5uflash文章摘要:首先,谈不上教程,我也只是把我喜欢的写给大家而已,我对Flex技术并没有什么深入的理解,只是喜欢。 我对Flash并没有比大家更多的认识(我的朋友都知道,我不过只是做些ASP.NET动态网站和进行些浏览器编程,如ExtJs,jQuery),一个偶然的想法,我打开了FlexBuilder
首先,谈不上教程,我也只是把我喜欢的写给大家而已,我对Flex技术并没有什么深入的理解,只是喜欢。

我对Flash并没有比大家更多的认识(我的朋友都知道,我不过只是做些ASP.NET动态网站和进行些浏览器编程,如ExtJs,jQuery),一个偶然的想法,我打开了FlexBuilder,辗转多个网页,感谢chrome,让我找到了PushButton,以下教程的大部分内容都来自于Matthew Casperson的博客,如果你也像我一样,对PushButton或者游戏开发忽然很感兴趣,请跟着Matthew Casperson一起开始游戏之旅。

如果你需要了解PushButton,你只需要在Google上搜索flex pushbutton就能获得一个关于 PushButton的概括性介绍,比较关键的介绍是,这是一个模块化的以组件为核心的游戏引擎(在以后的开发中,您将有深刻的体会),对于网络中的些许介绍,我想声明一点的是,当前的版本为r470,我并没有发现一些博客中所提到的ProjectManager.air(这困扰了我很久),不过很快你将发现这并不影响什么。

http://pushbuttonengine.com/,官方论坛,在这里你能找到你想要的大部分,包括下载链接以及http://pushbuttonengine.com/forum/index.php,PushButton的官方论坛,社区里人们很友善,这里包括技术交流也有组件买卖。



Get Started

开始PushButton,首先你需要下载当前的最新版本(http://pushbuttonengine.googlecode.com/files/PushButtonEngine-r470.zip),这是当前的稳定版本,能够解决足够的问题。下载完毕后,您要保证的是您的开发工具完备,我对Flash并不熟悉,我只是一个半路出家的和尚,所以我选择Flex(基于 Eclipse,让我觉得舒服)。

解压后我们找到PushButton的类库所在,在Bin文件夹中我找到了PBEngine.swc(这花了我一阵时间来研究swc在flash中的职责),也就是我们需要引用的类库文件。我在上面提到过,并没有发现有些帖子博客中提到的Manager.air,在这里我们直接在Flex中新建一个Flex项目,在建立时在lib文件夹中引入PBEngine.swc,到这里我们的准备工作就基本结束了。

为了证明我们的操作成功与否,我们需要做一些测试证明一下。我们在
复制内容到剪贴板
代码:
<mx:Application
  xmlns:mx="http://www.adobe.com/2006/mxml"
  layout="absolute"
  applicationComplete="appComplete()"
  width="480"
  height="384" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#A53EE1, #C8C8C8]">
标签中设置了应用程序结束时调用的 appComplete方法,在这个方法中我们需要调用
复制内容到剪贴板
代码:
protected function appComplete():void
{
Global.startup(this);
用Matthew Casperson
的话就是,当我们要用PushButton做什么事情之前,首先一定要调用Global.startup(this);这是一切的基础

然后让我们做一个简单的动画(一个屏幕上的圆,来完成我们第一期的练习)。



首先,在PushButton中,所有的东西都称之为”Entity“ 翻译成实体也好,所以,要显示一个圆,

我们需要两个实体,首先我们需要一个类似于舞台类似于场景的东西我们称之为 ”Scene“(这在以后的例子中仍然会用到),然后需要一个圆,放到这个"Scene"中去。

在PushButton中,组件构成了实体,实体就像一个空的盒子一样,每放入一个组件,盒子将拥有一个新的功能和特点。PushButton并没有采用传统的继承的设计模式,并没有在创建一个实体的时候创建一个类,而是实现了一个接口Entity的一个对象,并包含了实现其他功能接口的组件,由实体包裹着组件(模块化的思想渐渐付出水面,但是精彩的还在后面,这种模块化让你想到了什么?XML?)。

我们创造了一个工厂类来产生我们需要的实体,以供在应用程序入口Main.mxml中调用
复制内容到剪贴板
代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
  xmlns:mx="http://www.adobe.com/2006/mxml"
  layout="absolute"
  applicationComplete="appComplete()"
  width="480"
  height="384">
  
    <mx:Script>
        <![CDATA[
            
            import com.pblabs.engine.core.*;
                        
            protected function appComplete():void
            {
                Global.startup(this);
                
                EntityFactory.createScene("scene");
                EntityFactory.createPlayer("player", "scene");
            }
            
        ]]>
    </mx:Script>
    
</mx:Application>
在 EntityFactory中,我们先创建Scene。
复制内容到剪贴板
代码:
package
{
    import mx.core.*;
    
    import com.pblabs.engine.core.*;
    import com.pblabs.engine.entity.*;
    import com.pblabs.rendering2D.*;
    import com.pblabs.rendering2D.ui.*;
    
    import flash.geom.Point;
    
    public class EntityFactory
    {
        static protected const SCENE_SPATIAL_COMPONENT:String = "Spatial";
        static protected const SCENE_RENDERER_COMPONENT:String = "Renderer";
        
        static public function createScene(name:String):IEntity
        {
            var Scene:IEntity = allocateEntity();                                
            Scene.initialize(name);  
                                                     
            var Spatial:BasicSpatialManager2D = new BasicSpatialManager2D();     
            Scene.addComponent( Spatial, SCENE_SPATIAL_COMPONENT );                           
            
            var Renderer:Scene2DComponent = new Scene2DComponent();                            
            Renderer.spatialDatabase = Spatial;                                 
              
            var View:SceneView = new SceneView();                                
            View.width = Application.application.width;                                                   
            View.height = Application.application.height;                                                  
            Renderer.sceneView = View;                                          
              
            Renderer.position = new Point(0,0);                                            
            Renderer.renderMask = new ObjectType("Renderable");                 
              
            Scene.addComponent( Renderer, SCENE_RENDERER_COMPONENT );     
            
            return Scene;
        }
在类的数据成员我们发现了两类组件的标记常量,一个叫"Spatial",一个叫"Renderer",由于我并没有从事过动画创作和任何游戏开发,我只能在开发中逐渐理解他们的含义,最简单的理解就是Spatial组件负责空间上的事务,如位置(position),大小(size)等等,而 Renderer组件则负责处理渲染事务,关于什么叫渲染我并没有专业开发人员更理解,不过它决定了物体的形状,外貌等等。

在创建Scene时,需要特殊注意的是,实体Scene的组件Render同样需要一个View来将Scene渲染上去,这个时候我们需要创建一个SceneView如上代码所示。

然后我们需要创建Player,也就是那个球。
复制内容到剪贴板
代码:
static public function createPlayer(name:String, scene:String):IEntity
        {
            var entity:IEntity = allocateEntity();                                 
            entity.initialize(name);                                             
            
            var Spatial:SimpleSpatialComponent = new SimpleSpatialComponent();   
            
            Spatial.spatialManager = NameManager.instance.lookupComponentByName(scene, SCENE_SPATIAL_COMPONENT) as ISpatialManager2D;                           
            
            Spatial.objectMask = new ObjectType("Renderable");                  
            Spatial.position = new Point(0,0);                                   
            Spatial.size = new Point(50,50);                                    
            
            entity.addComponent( Spatial, "Spatial" );                             
                        
            var Render:SimpleShapeRenderComponent = new SimpleShapeRenderComponent();
            
            Render.showCircle = true;                                            
            Render.radius = 25;                                                  
            Render.positionReference = new PropertyReference("@Spatial.position");   
            
            entity.addComponent( Render, "Render" );
            
            return entity;
        }
    }
}

读者会发现和Scene的创建非常的类似,在Spatial决定了大小和位置后,Render中指定了这是显示一个圆,并描述这个圆的半径是25,在这里我们需要注意的是在Render的定义中,我们需要与Spatial的属性进行关联, 比如这里我们需要这个物体的空间位置,所以出现了 Render.positionReference = new PropertyReference("@Spatial.position");

在后面我们还会遇到和大小相关联等等。

运行在FlexBuilder中运行我们的项目,您会得到一个圆,这时候,恭喜你,您已经迈出了第一步。

我很喜欢PushButton,希望您也可以继续。

以上部分内容,来自 Matthew Casperson的博客http://www.bukisa.com/articles/225827_pushbutton-tutorial-series-getting-started

Demo代码下载页面http://www.brighthub.com/hubfolio/matthew-casperson/media/p/61000.aspx



下一期我们将尝试让这个球随着我们的键盘动起来。

下一期地址

http://www.5uflash.com/flashjiaocheng/Flashyingyongkaifa/5551.html?1267200586

感谢 Matthew Casperson,感谢无私的分享。


文章如果有错误或者缺少文件,请发邮件提交给我们
上一篇:Flash Player的“跑道/切片模型”
下一篇:关于游戏引擎PushButton的教程和演示(二)
>>> 最新评论:(共有 0 位网友发表了评论)      查看所有评论
  发表评论
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
  教程分类
  基础操作   动画特效
  应用开发   组件学习
  As程序   动画教程
  Flash cs3   AS 3.0
  FCS/FMS教程   Loading教程
  Flash与Web   Flash教程连载
  Flash 3d
  相关文章
·制作rpg风格的文本系统flash造
·使用共享对象实现静音/取消静音
·rpg风格的文本系统游戏制作
·Flash导入MP3时读取文件出现的问
·Flash游戏人工智能-峰会PPT
·Flash CS5开发AIR2与C语言通信的
·用As侦测鼠标的方位
·制作横向滑动的flash导航菜单制
·Flash游戏开发经验提纲分享
·Flash平台处理zip文件Working wi
  热门文章
·Flash进度条的制作详细讲解(组图)
·Flex 3 AdvancedDataGrid的使用(第二
·全Flash动画网站实现的基础教学
·FLASH+XML相册(附源码)
·FLV播放器汇总
·flash幻灯片网页效果
·超酷flash光晕移动效果
·Flash打造简单的飘雪动画视觉特效
·flash水影效果字
·flash春雷闪电效果
·Flash制作大雪纷飞效果动画
关于我们 - 免责声明 - 网站地图 - 商务服务 - 联系我们 - RSS地图
©CopyRight 2006-2008, 5UFlash.COM, Inc. All Rights Reserved
鲁ICP备06034971号