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

演示程序

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

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

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

本教程是接着Flixel横板游戏制作教程(四)— RandomLevels 来做的。
下面我们开始给游戏加入敌人了。
先建立 Enemy 类:

package
{import org.flixel.FlxEmitter;import org.flixel.FlxG;import org.flixel.FlxObject;import org.flixel.FlxSprite;/*** ...* @author zb*/public class Enemy extends FlxSprite {//敌人素材[Embed(source='media/enemy.png')]protected var enemyImg:Class;//敌人死亡时,爆炸碎片的素材。。河蟹[Embed(source = 'media/enemygibs.png')]protected var gibsImg:Class;//敌人的移动速度protected static const ENEMY_SPEED:Number = 20;//敌人的生命值protected static const ENEMY_HEALTH:int = 5;//敌人初始移动的 x 坐标protected var startingX:Number;//敌人移动的水平范围,本次做的敌人会随机出现在某个平台上移动protected var maxHorizontalMovement:Number;//敌人爆炸的发射器//flxEmitter,是个轻量的粒子发射器,//麻雀虽小,五脏俱全,看看API 上的功能吧,很有用哦protected var gibs:FlxEmitter;/*** 创建敌人时的参数* @param        sX 敌人初始 x 坐标* @param        sY 敌人初始 y 坐标* @param        maxHorizontalMovement 这里传入的是为所在平台的宽度*/public function Enemy(sX:Number, sY:Number,maxHorizontalMovement:Number):void {super(sX, sY);loadGraphic(enemyImg, true, false, 13, 13);//将敌人的y坐标 上调 一个敌人高度的 位置//因为 sX 和 sY 是我们传入的 平台的 坐标//所以上调 1个 高度 这样 敌人就不会和所在平台重叠this.y = sY - this.height;//初始位置为 sX,也就是平台的 x 坐标this.startingX = sX;//最大水平移动范围,参数中的是 平台的宽度//平台的宽度 减去 敌人的宽度作为最大水平范围,这样敌人就不会离开平台了this.maxHorizontalMovement = maxHorizontalMovement - this.width;//设置敌人的x 轴 速度this.velocity.x = ENEMY_SPEED;//设置敌人的 生命值this.health = ENEMY_HEALTH;//生成爆炸发射器//参数1:x 坐标//参数2:y 坐标//都填0,刚生成的时候,用不着,//用的时候再根据敌人的位置来设置坐标this.gibs = new FlxEmitter(0, 0);//这里就是具体的创建发射器的内容//参数1:粒子的素材//参数2:粒子的数量//参数3:发射粒子后,每一帧,每个粒子旋转的角度//参数4:注明粒子的素材图片是 单一粒子 还是 多个粒子//如果是多个粒子就会把素材图片切割做成多个粒子//true 为 多个粒子,false为单个粒子//参数5:注明发射的这些粒子是否参与碰撞检测//0表示不参与,1表示参与,设置0的话性能会提高//参数6:注明粒子是否会在碰撞的时候发生反弹//0表示不会,1表示会,此参数只在 参数5设置为1的时候才有效果this.gibs.createSprites(gibsImg, 5, 16, false, 0, 0);//以下是发射器的一些发射效果,更多的参考 API//发射时每个粒子 x轴 的 初始速度范围,会在范围中随机选择this.gibs.setXSpeed( -100, 100);//发射时每个粒子 y轴 的 初始速度范围this.gibs.setYSpeed( -100, -150);//每个粒子所受到的重力加速度this.gibs.gravity = 300;//将粒子加入当前 state 中去//为什么不 add 在 敌人这里?//因为 flxSprite 没有 add 方法。。。。FlxG.state.add(gibs);//添加敌人移动的动画并开始播放this.addAnimation("move", [0, 1], 12);this.play("move");}//重写hitSide方法,让敌人碰到障碍物便反向移动override public function hitSide(Contact:FlxObject,Velocity:Number):void {this.velocity.x = -this.velocity.x;//为什么不加上 super.hitSide 方法?//因为 hitSide 方法本身就是改变 x 速度//这里既然已经改了,也就没必要加上了//当然 这也是根据 游戏本身的规则制定的//当同学们自己做一些小游戏的时候,或许可能需要加上}//重写 kill 方法,让敌人被 kill 的时候,//发射器会发射爆炸粒子override public function kill():void {//直接调用 super的kill,敌人被杀掉super.kill();//将发射器的坐标 设置到 敌人当前的坐标位置gibs.x = this.x;gibs.y = this.y;//发射粒子//参数1:设置为 true,说明粒子以爆炸的形式发射,否则为 顺序发射//爆炸发射,就是说所有粒子同时发射出去//顺序发射,就是粒子一个接一个发射//参数2:延迟的秒数,这个延迟是指 发射粒子后,//经过多少秒后 粒子会被 取消掉,也就是回收粒子,消失掉//要不然发射出去的那些粒子会一直存在gibs.start(true,5);}//重写updateoverride public function update():void {//判断敌人的移动if ((this.x - this.startingX) >= maxHorizontalMovement){//this.x - this.startingX,为敌人 当前相对于 初始位置的 x 坐标//当这个 相对坐标 超过 最大的水平移动范围时,说明敌人在 平台最右端//此时设置敌人的 x 坐标到 最大范围处,这样 敌人就不会超过 平台了this.x = this.startingX + maxHorizontalMovement;//将敌人的速度设置为 向左移动this.velocity.x = -ENEMY_SPEED;}else if (this.x - this.startingX <= 0){//当相对 x 坐标 小于等于 0后,说明敌人在 平台的最左端//这时将敌人 x 坐标 设置为 初始 x 坐标,就不会超过平台了this.x = this.startingX;//将敌人速度设置为 向右移动this.velocity.x = ENEMY_SPEED;}//要加上了哦super.update();}}}

然后在 GameState 类中:

package
{import org.flixel.FlxG;import org.flixel.FlxGroup;import org.flixel.FlxObject;import org.flixel.FlxState;import org.flixel.FlxTileblock;import org.flixel.FlxU;/*** ...* @author zb*/public class GameState extends FlxState {//*********已有的内容************////敌人组private var enemyGroup:FlxGroup;//最大生成敌人数量static public const ENEMY_COUNT:int = 10;override public function create():void {//*********已有的内容************////加入敌人addEnemies();}//*********已有的内容************//private function addEnemies():void{enemyGroup = new FlxGroup();//var enemyCount:int = 0;var enemy:Enemy;//这里判断生成 敌人的 方法 和 生成随机平台的 方法类似//首先一个个遍历平台,然后判断其他平台是否与当前平台的敌人初始位置重叠//重叠的话 就跳到下一个 平台来判断//没有重叠到初始位置的话,就在该平台上添加敌人//具体算法就不解释了。。比较麻烦。。for each (var tile1:FlxTileblock in levels.members) {var enemyStartX:Number = tile1.x;var enemyStartY:Number = tile1.y;var collides:Boolean = false;for each (var tile2:FlxTileblock in levels.members) {var collideX:Number = enemyStartX;var collideX2:Number = collideX + TILE_BLOCK_WIDTH;var collideY:Number = enemyStartY - TILE_BLOCK_WIDTH;var collideY2:Number = enemyStartY;if (tile1 != tile2 && (tile2.overlapsPoint(collideX, collideY) ||tile2.overlapsPoint(collideX, collideY2) ||tile2.overlapsPoint(collideX2, collideY) ||tile2.overlapsPoint(collideX2, collideY2) )){collides = true;break;}}if (!collides) {//生成一个敌人,并加入 敌人组enemy = new Enemy(enemyStartX, enemyStartY, tile1.width);enemyGroup.add(enemy);enemyCount++;}if (enemyCount == ENEMY_COUNT) {break;}}//将敌人组加入 state中add(enemyGroup);}override public function update():void {//*********已有的内容************////检测敌人与 平台的碰撞FlxU.collide(enemyGroup, levels);//检测子弹与敌人的重叠/** 注意 **///不用collide 是因为 2个运动的object 碰撞时 会被反弹//overlaap方法,检测重叠,参数1 和 参数2 均为检测对象,顺序随意//参数3:这个是检测到重叠时,执行的方法//一般最好加上,因为如果 执行的方法 为null 时,//被检测的2个object 就会 被将 exist 设置为 false。。//我们这里检测重叠时需要看到 子弹的爆炸动画。。FlxU.overlap(bullets, enemyGroup, hitEnemy);//还是要提醒下,别忘了加上。。。super.update();}//注意参数//obj1 对应 overlap中的第一个参数里面的对象,//obj2 对应 overlap中的第二个参数里面的对象//如果是组,就会判断到组的具体对象//因此这里的 obj1 会是 bullet,obj2 就是 enemyprivate function hitEnemy(obj1:FlxObject,obj2:FlxObject):void{//判断 obj1(即 bullet)是否死亡//死亡则返回不做操作//这么做是因为 子弹 死亡了,还在播放爆炸动画//爆炸的时候就不需要 执行 敌人被 hurt 的方法//当然 除非你需要 制作 持续伤害的 子弹//根据 需要来设置吧if (obj1.dead) {return;}//这里子弹执行 被 hurt 的方法,发生爆炸obj1.hurt(0);//敌人被 hurt 1点伤害obj2.hurt(1);}}}

好了,看看运行效果吧~

Flixel横板游戏制作教程(五)— Enemies相关推荐

  1. 经典游戏制作教程[小糊涂的灵感]

    经典游戏制作教程 peng 1.游戏制作的主要流程 -------------------------------------------------------------------------- ...

  2. 简单的RPG游戏制作教程

    □企划部份 ◎第一步:决定资料格式 在进入游戏制作的初期,由于有许多和程式有关的资料需要编整,因此担任企划的人员常会忙得乱七八糟.在这个阶段,企划人员必需要和程式商量游戏中资料的格式.举个例子来说,在 ...

  3. 零基础 · 传说之下同人游戏制作教程

    1.0 废话 可略过 最好看一下 传说之下在很久以前便出现了"AU"这个说法,也正是从那时开始,无数游戏爱好者开始制作属于自己的传说之下同人游戏,随着时间的发展,无数AU游戏的&q ...

  4. 塔防游戏制作教程(四)

    嗨!大家好,我是小蚂蚁.今天我们继续分享制作一个塔防小游戏的第四节,如何实现炮塔的升级和出售功能. 如何实现炮塔的升级 在炮塔升级时,我们简单地做一些属性的提升以及外表的变化,例如当炮塔升级后,攻击速 ...

  5. 《从零开始的 RPG 游戏制作教程》第九期:信息反馈(上)

    目录 1. 前言 2. 第一期:制作基础场景 3. 第二期:让勇者和怪物登场 4. 第三期:基础的数值设计 5.第四期:从理论的角度简单聊聊关卡 6.第五期:制作物品和技能 7.第六期:设置怪物掉落物 ...

  6. 计算机与游戏制作,计算机动漫与游戏制作教程

    项目1动画造型设计 学习目标 项目描述 相关知识 项目任务 任务1动画造型认知 任务2动画造型设计 应用实践 教学指导 知识链接 项目2构成设计 学习目标 项目描述 项目任务 任务1点的体验与感受 项 ...

  7. U3D-亡命时速游戏制作(五)

    亡命时速游戏制作5 1.在亡命时速游戏制作4的基础上,这次我们要来添加敌人. 首先,在Settings下的Vehicles,选择veh_car1,将其拖到GameScene中,并在Scene场景中将其 ...

  8. Easyx小游戏制作教程

    来源:微信公众号「编程学习基地」 文章目录 1.推箱子 2. 益智小游戏拼图制作 3.经典小游戏Easyx制作酷炫贪吃蛇 4. 回味童年经典项目----扫雷实现 5.C++面向对象编程之 flappy ...

  9. 《从零开始的 RPG 游戏制作教程》第十期:信息反馈(下)

    目录 1. 前言 2. 第一期:制作基础场景 3. 第二期:让勇者和怪物登场 4. 第三期:基础的数值设计 5.第四期:从理论的角度简单聊聊关卡 6.第五期:制作物品和技能 7.第六期:设置怪物掉落物 ...

  10. 《从零开始的 RPG 游戏制作教程》第六期:设置怪物掉落物并部署关卡怪物

    目录 1. 前言 2. 第一期:制作基础场景 3. 第二期:让勇者和怪物登场 4. 第三期:基础的数值设计 5.第四期:从理论的角度简单聊聊关卡 6.第五期:制作物品和技能 第六期:设置怪物掉落物并部 ...

最新文章

  1. 关于Sqlserver中 BCP命令,实现数据导出功能。
  2. python如何并发上千个get_用greenlet实现Python中的并发
  3. Scala集合体系:可变集合和不可变集合
  4. 软件设计模式—控制反转
  5. python selenium 点击开始按钮_使用Selenium和Python单击一个按钮
  6. function 多个函数用一个_程序员如何用一个脚本每天定时给多个女友发微信暖心话...
  7. Linux-LNMP(pool,php-fpm慢执行日志,进程管理,open_basedir)
  8. 管理感悟:先做难度大的工作
  9. 测试回归结果分析软件,“3414”试验数据分析软件设计原理
  10. RTOS中的任务句柄到底是什么意思?
  11. python初步学习笔记(上)
  12. Ubuntu 各版本代号简介
  13. 转:马明哲:拥有执行力才能让你强大
  14. [经验教程]在拼多多上发起拼单和参与拼单有什么区别?
  15. 计算机专业相关的组名和口号,好的小组队名和口号(精选40个)
  16. cast 和convert和concat详解以及mysql和sqlserver兼容问题
  17. Linux性能分析工具perf基础使用介绍
  18. Ubuntu中shell命令-(4)-echo/tar/which/whereis/ps/kill/top/df/du
  19. 【双11背后的技术】AliCloudDB——双11商家后台数据库的基石
  20. 《微信小程序案例5》仿小米Lite小程序分类板块-两个纵向滚动区域独立互不影响

热门文章

  1. Angular学习笔记第三章——创建组件
  2. 注释//TODO的作用
  3. php访问80端口强制跳转443,nginx 80端口重定向到443端口
  4. 针对ewebeditor编辑器漏洞一次实战经验
  5. ewebeditor漏洞利用总结
  6. 【Week7 作业B】TT的旅行日记
  7. 【LeetCode】马三来刷题之Valid Anagram
  8. 关于区块链及其数据溯源的学习笔记
  9. 工字型钢弹性截面模量计算公式_截面模量计算方法
  10. JS调起支付宝进行银行卡转账