`

Flixel横板游戏制作教程(三)— AddingWeapons

 
阅读更多

from: http://bbs.9ria.com/thread-77302-1-1.html

 

演示程序

http://www.adamatomic.com/canabalt/

http://www.flixel.org/mode/

 

Flixel横板游戏制作教程(三)— AddingWeapons

现在我们给 player 加入 weapon 武器。
首先是 子弹 Bullet 类:

 

 

package 
{
        import org.flixel.FlxObject;
        import org.flixel.FlxSprite;
        
        /**
         * ...
         * @author zb
         */
        public class Bullet extends FlxSprite 
        {
                [Embed(source = 'media/bullet.png')]
                protected var bulImg:Class;
                public function Bullet():void 
                {
                        //记得每个FlxSprite的子类构造方法这里 都顺手写一个这个哦
                        super(0, 0);
                        
                        //加载子弹的素材
                        loadGraphic(bulImg, true, false, 8, 8);
                        
                        //设置子弹的动画
                        //向上发射
                        addAnimation('shootUp', [0]);
                        //向下
                        addAnimation('shootDown', [1]);
                        //向左
                        addAnimation('shootLeft', [2]);
                        //向右
                        addAnimation('shootRight', [3]);
                        //爆炸动画,最后一个参数设置false,表示动画播不会循环播放
                        addAnimation('BulBoom', [4, 5, 6, 7], 50, false);
                        
                        //exists,是所有flxObject的一个属性,表示该object是否存在
                        //false,说明改物体不存在,flixel不会对他进行任何操作(碰撞检测等)
                        //true,则说明改物体存在
                        //当子弹没有发射出去的时候,自然不需要检测碰撞,所以设置 false
                        exists = false;
                }
                
                /**
                 * 这个是子弹的发射方法
                 * @param        sPosX 子弹发射时的初始 x 坐标
                 * @param        sPosY 子弹发射时的初始 y 坐标
                 * @param        velX 设置子弹发射的 x轴 速度
                 * @param        velY 设置子弹发射的 y轴 速度
                 */
                public function shoot(sPosX:Number,sPosY:Number,velX:Number,velY:Number):void 
                {
                        //reset方法,是将该object的一些属性重置
                        //重置 exist 为 true ,dead(是否死亡)为 false
                        //参数1:要将该object 重置到的 x坐标
                        //参数2:要将该object 重置到的 y坐标
                        reset(sPosX, sPosY);
                        
                        //将参数中的速度赋值给 子弹
                        velocity.x = velX;
                        velocity.y = velY;
                        
                        //根据速度判断子弹需要 播放哪个方向的动画
                        if (velY < 0) 
                        {
                                //y速度小于 0,向上发射
                                play('shootUp');
                        }else if (velY > 0) 
                        {
                                //y速度大于 0,向下发射
                                play('shootDown');
                        }else if (velX < 0) 
                        {
                                //x速度小于0,向左发射
                                play('shootLeft');
                        }else if (velX > 0) 
                        {
                                //x速度大于0,向右发射
                                play('shootRight');
                        }
                }
                
                //当发射出去的子弹碰到障碍物之后,就会爆炸
                //所以重写碰撞方位的方法,加上hurt 方法,
                //这样碰到障碍物后,子弹会触发hurt方法,hurt是指本object受到伤害。
                /**
                 * 重写的 碰撞 物体 左边 和 右边 的方法
                 * @param        Contact 碰撞的对象,也就是 与 谁 发生了碰撞
                 * @param        Velocity 发生碰撞后,本 objcet 获得的一个 速度
                */
                override public function hitSide(Contact:FlxObject, Velocity:Number):void 
                {
                        //参数:该object 受到的伤害值,注意是本objcet,从 health值上减少
                        //受到0点伤害,因为默认的health(生命值) 是1,所以填 0 子弹就不会受到伤害,
                        //因为 health <= 0 的时候,就会触发 kill 方法,
                        //而kill方法会设置 exist 会设置为 false,那么子弹就会马上消失
                        //这不是我们想看到的,因为 子弹 爆炸的动画还没播放呢。。
                        hurt(0); 
                        
                        //别忘了 重写以后 要 加上。。。
                        super.hitSide(Contact,Velocity);
                }
                
                //这个是重写 碰到本object 上方时的方法
                override public function hitTop(Contact:FlxObject, Velocity:Number):void 
                {
                        hurt(0);
                        super.hitTop(Contact,Velocity);
                }
                
                //重写 碰到本object底部时的方法
                override public function hitBottom(Contact:FlxObject, Velocity:Number):void 
                {
                        hurt(0);
                        super.hitBottom(Contact, Velocity);
                }
                
                //重写一下 hurt 方法,因为需要在 碰到障碍物的时候要设置些东东
                //比如 子弹速度 以及 播放爆炸的动画
                //参数:本objcet 所受到的 伤害值
                override public function hurt(Damage:Number):void 
                {
                        //如果子弹已经dead了,那么就不在做 hurt 的操作
                        //为什么不是 判断 exist ,因为 exist为 false 已经消失,不会受到任何渲染
                        //而 dead 为 true时,虽然是死亡了,但是 仍然 被渲染,
                        //我们需要的是,子弹 虽然 已经 死亡,但 仍然 可以看到 爆炸动画
                        if (dead) 
                        {
                                return;
                        }
                        
                        //子弹被碰一次直接设置dead为true,否则会不停调用该方法
                        //同时也是为了在GameState中检测子弹与敌人触碰(不是碰撞检测,而是叠加检测)不发生连续伤害
                        dead = true;
                        
                        //速度设置为0,因为碰撞后子弹爆炸是在 原地的
                        //所以不需要移动了,当然如果你喜欢继续移动的爆炸的话。。。
                        velocity.x = 0;
                        velocity.y = 0;
                        
                        //播放爆炸动画了
                        play('BulBoom');
                        
                        //至于为什么 不用 使用 super的 hurt 方法
                        //因为本教程的子弹 碰撞后 是受到 0 伤害的
                        //只要 完成 上面的几个语句就足够了
                        //当然 加上也无妨,同学们可以看看 super 的hurt 方法的内容
                        //就知道为什么这里可以不加了
                        //super.hurt(Damage);
                }
                
                override public function update():void 
                {
                        //使用 dead 是判断子弹是否碰到障碍物而'死掉',
                        //使用 finish 是为了判断子弹的爆炸动画是否完成,
                        //2个一起 就说明子弹完成动画并且'死掉',这样子弹就消失了
                        //至于为什么 super的update 只放在 else 里面
                        //因为 子弹消失后 没必要再 update 了,还能省点CPU资源....
                        //还是那句话,要也无妨。。。
                        if (dead && finished) 
                        {
                                exists = false;
                        }else 
                        {
                                super.update();
                        }
                }
        }
        
}

 下面是 Player 类中需要加入的:

 

package 
{
        import org.flixel.FlxG;
        import org.flixel.FlxGroup;
        import org.flixel.FlxSprite;
        
        /**
         * ...
         * @author zb
         */
        public class Player extends FlxSprite 
        {
                /*********  教程(二)中所声明的 ***********/
                //....我省略掉了,参考源文件即可
                //看新加入部分即可
                
                //子弹组
                //flxGroup 就是一种 组,有数组的储存,用于flixel的各种控制检测
                //用flxGroup 将多个 object 添加进 组,方便管理
                public var bullets:FlxGroup;
                //当前可以发射的子弹索引
                private var currentBul:uint = 0;
                
                public function Player(startX:Number=100,startY:Number=50):void 
                {
                        //********* 教程(二)中在构造方法里已经写的内容 ********/
                }
                
                public override function update():void
                {
                        //********* 教程(二)中在update里已经写的内容 ********/
                        
                        //子弹发射设置
                        //为了让教程的顺序比较好写,这里加了个判断
                        //这样 子弹 就不需要在Player构造的时候必须存在了
                        if (bullets!=null) 
                        {
                                //按 C 键 发射子弹吧
                                if (FlxG.keys.justPressed('C')) 
                                {
                                        //按 上 的时候 向上 发射子弹
                                        if (FlxG.keys.UP) 
                                        {
                                                //member 是 Array 类型,
                                                //存放在 bullets中的元素都可以通过 members 找到
                                                //shoot 的时候 将 player 的 x y 坐标作为初始点来调整
                                                bullets.members[currentBul].shoot(x, y-4, 0, -250);
                                        }else if (FlxG.keys.DOWN) 
                                        {
                                                //按下的时候向下 发射子弹
                                                bullets.members[currentBul].shoot(x, y+4, 0, 250);
                                        }else if (facing==LEFT) 
                                        {
                                                //人物面向左的时候 向左发射子弹
                                                //为什么不用 按下 左的时候呢
                                                //因为 不按按钮的时候 仍然需要可以发射子弹呢。。。
                                                bullets.members[currentBul].shoot(x-4, y, -250, 0);
                                        }else if(facing==RIGHT)
                                        {
                                                //人物面向右的时候 向右发射子弹
                                                bullets.members[currentBul].shoot(x+4, y, 250, 0);
                                        }
                                        //子弹已经发射,索引变成下一个的
                                        currentBul++;
                                        //求余数的运算,这样 索引就会 循环了
                                        currentBul %= bullets.members.length;
                                        
                                        /**  注意  **/
                                        //目前对 子弹 是否可以 发射,没有设置相应的属性 来进行判断
                                        //因此 当 按键够快,同时 子弹移动的速度 比较慢时
                                        //就可以明显的看到 发射出去的子弹 还没有消失
                                        //就被 马上 拉回来 重新发射出去
                                        //请同学们 自行 加入相应的判断,给个提示
                                        //比如给Bullet 加入一个 isShooting 的boolean 属性
                                }
                        }
                        
                        /*** 切记 ***/
                        //这个语句一定要加上去,只要重写了update,就一定要调用 super的update
                        //否则不会刷新动画。。也不会响应你在这里所设置的控制
                        super.update();
                }
        }
        
}

 运行看看效果吧,嘿嘿~

 

 

 

  • 大小: 8.6 KB
分享到:
评论

相关推荐

    Flixel 横板游戏制作教程(一)— HelloFlixel ...

    标题中的“Flixel横板游戏制作教程(一)— HelloFlixel”指的是一个针对初学者的游戏开发系列教程,重点介绍了如何使用Flixel框架创建2D横版游戏。Flixel是一款开源的ActionScript库,适用于Flash平台,但现在也...

    Flixel横板游戏制作教程(二)— AddingPlayer

    在"Flixel横板游戏制作教程(二)— AddingPlayer"中,我们将深入学习如何使用Flixel框架创建一个2D横向滚动的游戏。Flixel是一个开源的ActionScript 3库,特别适合开发2D游戏,它提供了丰富的功能,如精灵动画、...

    Flixel横板游戏制作教程(五)— Enemies

    在本教程“Flixel横板游戏制作教程(五)— Enemies”中,我们将深入学习如何在使用Flixel框架创建的2D横版游戏中添加敌人。Flixel是一个流行的开源ActionScript 3库,常用于开发2D游戏,尤其适用于Flash平台。尽管...

    Flixel横板游戏制作教程(八)—MovingPlatforms(移动平台)

    文档`Flixel横板游戏制作教程(八)—MovingPlatforms(移动平台).doc`提供了详细的步骤和示例代码,帮助开发者理解移动平台的实现过程。通过阅读这份文档,你可以学习到如何编写`MovingPlatform`类的代码,以及...

    Flixel横板游戏制作教程(十一)—JetPack(飞行背包)

    最后,`Flixel横板游戏制作教程(十一)—JetPack(飞行背包).doc`文档应该详细解释了整个过程,包括代码示例和步骤指南,帮助开发者理解如何集成飞行背包功能。 通过这个教程,开发者不仅可以学习到Flixel框架的...

    Flixel 横板游戏制作教程(完结)

    Flixel是啥?一个AS3的2D游戏引擎,主要功能为: •同屏显示更多元素 •通过外部文件和图片创建Tilemap ...本教程是根据一个老版本(版本为 1.27)的教程改写而成的,本教程的Flixel版本为 2.43的。

    Flixel横板游戏制作教程(九)—SquashingthePlayer(挤压Player)

    文档`Flixel横板游戏制作教程(九)—SquashingthePlayer(移动平台).doc`详细解释了如何实现挤压效果,特别是针对移动平台的特殊情况。阅读这份文档将有助于理解如何在Flixel中应用挤压效果,以及如何处理移动平台...

    Flixel横板游戏制作教程(七)—VictoryState(胜利状态)

    总之,本教程通过`Flixel横板游戏制作教程(七)—VictoryState(胜利状态).doc`文档,详细讲解了如何在Flixel环境中创建和管理游戏的不同状态,特别是胜利状态的实现。通过学习这些内容,开发者可以更好地理解和...

    Flixel 横板游戏制作教

    ### Flixel横版游戏制作教程 #### 一、Flixel 游戏框架简介 Flixel是一款基于Adobe Flash的开源2D游戏开发框架,它由Adam “Atomic” Saltsman创建,广泛应用于Flash游戏的开发。Flixel简化了许多常见的游戏开发...

    Flixel横板游戏制作教程(十)—Pickups(拾取道具)

    在本教程中,我们将探索如何在使用Flixel框架创建的横版游戏中实现Pickups(拾取道具)功能。Flixel是一个强大的2D游戏开发库,为ActionScript 3和Haxe开发者提供了丰富的功能,使得游戏开发变得更加简单。在这个...

    Flixel横板游戏制作教程(六)—SoundsandMusic(音效与音乐)

    在本教程中,我们将深入探讨如何在Flixel框架中集成音效与音乐,以创建一个生动有趣的横版游戏。Flixel是一个流行的开源ActionScript 3库,它为开发2D游戏提供了丰富的功能,包括图形渲染、碰撞检测以及音频处理。 ...

    flixel platform game example

    尽管现代Web已转向HTML5,但AS3和Flixel仍然是学习游戏开发和经典Flash游戏制作的重要资源。 在压缩包中的文件 "Nutmeg Part 3 - Final Game" 可能是指游戏项目的一个特定阶段或部分,可能是一个系列教程或项目的一...

    flixel 游戏源代码

    `Flixel横板游戏制作教程(四)— RandomlyLevels .doc`是一个文档,可能详细介绍了如何创建随机生成的关卡,这是很多游戏增加重玩价值和挑战性的重要手段。学习如何动态生成关卡布局,可以使游戏更具吸引力。 最后...

    Flixel AS3游戏引擎

    总的来说,Flixel AS3游戏引擎是ActionScript开发者构建2D游戏的强大工具,它提供了全面的游戏开发功能,同时保持了较低的学习曲线,使得小型团队和个人开发者也能制作出高质量的游戏作品。结合其开源社区的支持,...

    Flixel-flash开源游戏引擎

    Flixel是一个强大的开源游戏开发框架,专门针对Adobe Flash平台设计。它以其高效、轻量级和易用性而受到开发者们的青睐。Flixel以其丰富的功能集,为创建2D游戏提供了全面的支持,包括精灵动画、物理系统、音频处理...

    flash flixel游戏引擎

    **Flash Flixel游戏引擎详解** Flash Flixel是一款强大的开源游戏引擎,专为创建2D像素艺术风格的游戏而设计,让人联想到经典的Game Boy Advance(GBA)游戏。Flixel以其简单易用和丰富的功能集而受到游戏开发者们...

    Flixel创建一个自上而下RPG游戏

    在本教程中,我们将探讨如何使用Flixel游戏引擎来创建一个简单的自上而下的角色扮演游戏(RPG)。Flixel是一款基于ActionScript 3的2D游戏开发框架,以其简单易用和强大的功能而闻名。对于那些希望使用AS3进行游戏开发...

Global site tag (gtag.js) - Google Analytics