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(); } } }
运行看看效果吧,嘿嘿~
相关推荐
标题中的“Flixel横板游戏制作教程(一)— HelloFlixel”指的是一个针对初学者的游戏开发系列教程,重点介绍了如何使用Flixel框架创建2D横版游戏。Flixel是一款开源的ActionScript库,适用于Flash平台,但现在也...
在"Flixel横板游戏制作教程(二)— AddingPlayer"中,我们将深入学习如何使用Flixel框架创建一个2D横向滚动的游戏。Flixel是一个开源的ActionScript 3库,特别适合开发2D游戏,它提供了丰富的功能,如精灵动画、...
在本教程“Flixel横板游戏制作教程(五)— Enemies”中,我们将深入学习如何在使用Flixel框架创建的2D横版游戏中添加敌人。Flixel是一个流行的开源ActionScript 3库,常用于开发2D游戏,尤其适用于Flash平台。尽管...
文档`Flixel横板游戏制作教程(八)—MovingPlatforms(移动平台).doc`提供了详细的步骤和示例代码,帮助开发者理解移动平台的实现过程。通过阅读这份文档,你可以学习到如何编写`MovingPlatform`类的代码,以及...
最后,`Flixel横板游戏制作教程(十一)—JetPack(飞行背包).doc`文档应该详细解释了整个过程,包括代码示例和步骤指南,帮助开发者理解如何集成飞行背包功能。 通过这个教程,开发者不仅可以学习到Flixel框架的...
Flixel是啥?一个AS3的2D游戏引擎,主要功能为: •同屏显示更多元素 •通过外部文件和图片创建Tilemap ...本教程是根据一个老版本(版本为 1.27)的教程改写而成的,本教程的Flixel版本为 2.43的。
文档`Flixel横板游戏制作教程(九)—SquashingthePlayer(移动平台).doc`详细解释了如何实现挤压效果,特别是针对移动平台的特殊情况。阅读这份文档将有助于理解如何在Flixel中应用挤压效果,以及如何处理移动平台...
总之,本教程通过`Flixel横板游戏制作教程(七)—VictoryState(胜利状态).doc`文档,详细讲解了如何在Flixel环境中创建和管理游戏的不同状态,特别是胜利状态的实现。通过学习这些内容,开发者可以更好地理解和...
### Flixel横版游戏制作教程 #### 一、Flixel 游戏框架简介 Flixel是一款基于Adobe Flash的开源2D游戏开发框架,它由Adam “Atomic” Saltsman创建,广泛应用于Flash游戏的开发。Flixel简化了许多常见的游戏开发...
在本教程中,我们将探索如何在使用Flixel框架创建的横版游戏中实现Pickups(拾取道具)功能。Flixel是一个强大的2D游戏开发库,为ActionScript 3和Haxe开发者提供了丰富的功能,使得游戏开发变得更加简单。在这个...
在本教程中,我们将深入探讨如何在Flixel框架中集成音效与音乐,以创建一个生动有趣的横版游戏。Flixel是一个流行的开源ActionScript 3库,它为开发2D游戏提供了丰富的功能,包括图形渲染、碰撞检测以及音频处理。 ...
尽管现代Web已转向HTML5,但AS3和Flixel仍然是学习游戏开发和经典Flash游戏制作的重要资源。 在压缩包中的文件 "Nutmeg Part 3 - Final Game" 可能是指游戏项目的一个特定阶段或部分,可能是一个系列教程或项目的一...
`Flixel横板游戏制作教程(四)— RandomlyLevels .doc`是一个文档,可能详细介绍了如何创建随机生成的关卡,这是很多游戏增加重玩价值和挑战性的重要手段。学习如何动态生成关卡布局,可以使游戏更具吸引力。 最后...
总的来说,Flixel AS3游戏引擎是ActionScript开发者构建2D游戏的强大工具,它提供了全面的游戏开发功能,同时保持了较低的学习曲线,使得小型团队和个人开发者也能制作出高质量的游戏作品。结合其开源社区的支持,...
Flixel是一个强大的开源游戏开发框架,专门针对Adobe Flash平台设计。它以其高效、轻量级和易用性而受到开发者们的青睐。Flixel以其丰富的功能集,为创建2D游戏提供了全面的支持,包括精灵动画、物理系统、音频处理...
**Flash Flixel游戏引擎详解** Flash Flixel是一款强大的开源游戏引擎,专为创建2D像素艺术风格的游戏而设计,让人联想到经典的Game Boy Advance(GBA)游戏。Flixel以其简单易用和丰富的功能集而受到游戏开发者们...
在本教程中,我们将探讨如何使用Flixel游戏引擎来创建一个简单的自上而下的角色扮演游戏(RPG)。Flixel是一款基于ActionScript 3的2D游戏开发框架,以其简单易用和强大的功能而闻名。对于那些希望使用AS3进行游戏开发...