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

上一期我们说到了PushButton游戏引擎的helloworld,我们在一张幕布上成功画出了一个圆,这一节,我们要做的就是让这个圆动起来。

这对我来说是激动人心的(因为我原本只是写写简单的交互JS),上一节我们讲到PushButton最大的特点就是以组件为中心,一个实体好比一个空箱子,放在里边好多各种功能的石头,这个箱子就具有了各种各样的功能,这些有魔力的石头,也就是我们所说的组件。

所以当我们要做这样一个应用时,你可能会自然的想到,要被鼠标控制,这样的一个功能,是不是一个组件的?you're right ,my friend。
复制内容到剪贴板
代码:
package
{
    import com.pblabs.engine.components.*;
    import com.pblabs.engine.entity.*;
    import com.pblabs.engine.core.*;
    
    import flash.geom.Point;
    
    public class KeyboardController extends TickedComponent
    {
        public var PositionReference:PropertyReference = null;
        public var Speed:Number = 0;
        protected var xMovement:Number = 0;
        protected var yMovement:Number = 0;
    
        public override function onTick(tickRate:Number):void
        {
            var position:Point = owner.getProperty(PositionReference);
    
            if (InputManager.isKeyDown(InputKey.RIGHT))
            {
                xMovement += Speed * tickRate;
                while (xMovement >= 1)
                {
                    position.x += 1;
                    xMovement -= 1;
                } 
            }
            else if (InputManager.isKeyDown(InputKey.LEFT))
            {
                xMovement -= Speed * tickRate;
                while (xMovement <= -1)
                {
                    position.x -= 1;
                    xMovement += 1;
                } 
            }
            
            if (InputManager.isKeyDown(InputKey.DOWN))
            {
                yMovement += Speed * tickRate;
                while (yMovement >= 1)
                {
                    position.y += 1;
                    yMovement -= 1;
                } 
            }
            else if (InputManager.isKeyDown(InputKey.UP))
            {
                yMovement -= Speed * tickRate;
                while (yMovement <= -1)
                {
                    position.y -= 1;
                    yMovement += 1;
                } 
            }
        }
    }
}
看了上面的代码,我们的目光会锁定在这个类继承的这个叫 TickComponent,这是一个比较关键的组件,在我看来,既然FLEX没有时间轴的概念,那么Tick这个概念就很重要了,这对于你在每一个tickRate时间点上都可对相应的实体进行检测和控制,此篇就是对键盘的简单控制。
键盘控制的细节就不做多讲解,xMovement/yMovement在我理解就是一个缓冲,让你的每一次键盘操作更流畅而不僵硬。
这里我们第一次在组件中看到owner的身影,他代表对该实体的引用(也就是说每个石头上有这么个标记要owner,指明放石头的盒子),通过owner可以访问很多实体的属性,比如现在我们说的这个position,还有未来要接触比较关键的线速度(linearVelocity)。
我们写完这个组件后需要把它加入到我们原本编辑好的圈圈实体内,像添加其他组件一样
复制内容到剪贴板
代码:
var Input:KeyboardController = new KeyboardController();
            Input.PositionReference = new PropertyReference("@Spatial.position");
            Input.Speed = 50;
            entity.addComponent(Input, "Input");
组件实体的结构化很彻底,有没有又让你想起什么?XML?
运行实例,你会发现,小圈圈已经可以跟上你的大脑畅游了

DEMO页面:http://www.brighthub.com/hubfolio/matthew-casperson/media/p/61005.aspx

DEMO下载页面:http://www.brighthub.com/hubfolio/matthew-casperson/media/p/61006.aspx

英文原版教程页面:http://www.bukisa.com/articles/225993_pushbutton-tutorial-series-keyboard-input(注:该国外教程服务器不稳定,偶尔睡觉)

下一期我们将尝试让我们的角色变得更有趣一些,把圆圈变成会动的小人?

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

posted on 2010-02-26 09:35  华电混球  阅读(399)  评论(0编辑  收藏  举报

导航

我的应用