首先,我们先来了解一下Weapon对象:Weapon对象也可以称为Weapon插件,它提供了快速创建和管理子弹池的能力。

武器(Weapons)射击出子弹(Phaser.Bullet对象),这些子弹实际上是有一些额外属性的sprite对象,并且这些子弹还支持Arcade物理引擎,不过暂时不支持P2引擎。

所有的子弹都被创建在一个叫Weapon.bullets的组(group)中,所以组对象支持的属性和方法,子弹组也都支持。

子弹还可以有自己的纹理和动画,你也可以控制它的射击频率、移动速度、射击角度等等属性,甚至你还可以给它们添加重力。

上面的内容几乎都是官网的翻译,下面我们先来看下面的代码,如果快速地创建一个会射击的小飞机:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });function preload() {//加载素材:子弹和飞机game.load.image('bullet', 'assets/sprites/bullet.png');game.load.image('ship', 'assets/sprites/shmup-ship.png');
}var sprite;
var weapon;
var cursors;
var fireButton;
function create() {// 创建一颗子弹,使用bullet皮肤weapon = game.add.weapon(1, 'bullet');//当子弹超出窗口时自动销毁weapon.bulletKillType = Phaser.Weapon.KILL_WORLD_BOUNDS;//因为子弹的图片是横着的,所以要旋转一下角度weapon.bulletAngleOffset = 90;//子弹的速度/每秒钟位移的像素值weapon.bulletSpeed = 400;sprite = this.add.sprite(320, 500, 'ship');game.physics.arcade.enable(sprite);//告诉Weapon子弹的轨迹:横向14px(小飞机宽28px),纵向0pxweapon.trackSprite(sprite, 14, 0);//启用方向键cursors = this.input.keyboard.createCursorKeys();//定义空格键为射击按键fireButton = this.input.keyboard.addKey(Phaser.KeyCode.SPACEBAR);
}function update() {//初始化速度为0sprite.body.velocity.x = 0;//按下左方向键时速度为-200(左移),按下右方向键时速度为200(右移)if (cursors.left.isDown){sprite.body.velocity.x = -200;}else if (cursors.right.isDown){sprite.body.velocity.x = 200;}//按下空格键时,开火if (fireButton.isDown){weapon.fire();}
}function render() {weapon.debug();
}

这个例子中,我们创建了一个会射击的小飞机,它只能左右移动,并且它每次只能发射一颗子弹,如果你担心它的子弹数量太少,那么修改下weapon = game.add.weapon(1, 'bullet');的数量即可,这个数量其实是子弹池的数量,同时也意味着同一时间屏幕上最多有这个数量的子弹数。

上面的例子中,窗口中只有一颗子弹未免太单调了,不仅如此,子弹的颜色也太单一了,下面我们就再来看一个例子来熟悉weapon的各种属性:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });function preload() {game.load.image('ship', 'assets/sprites/thrust_ship.png');//这张图片长宽为320*4px,截取为4x4px一共有80个画面game.load.spritesheet('bullet', 'assets/sprites/rgblaser.png', 4, 4);
}var sprite;
var weapon;
var cursors;
var fireButton;
function create() {//创建40颗子弹weapon = game.add.weapon(40, 'bullet');//加载时已经说过,截取图片中4x4像素为一个画面//第三个参数true告诉weapon类每次优先使用下一个画面,如果是false只会使用第一个画面//子弹发射时,80个画面全面使用完后从0开始weapon.setBulletFrames(0, 80, true);//下面这个参数相当于setBulletFrames函数的第三个参数//weapon.bulletFrameCycle = true;//子弹销毁方式weapon.bulletKillType = Phaser.Weapon.KILL_WORLD_BOUNDS;//weapon.bulletKillType = Phaser.Weapon.KILL_NEVER;//子弹速度weapon.bulletSpeed = 400;//射击频率(多少毫秒射击一次)weapon.fireRate = 50;//子弹超出边界时,会从边界的另一侧出现//weapon.bulletWorldWrap = true;sprite = this.add.sprite(400, 300, 'ship');sprite.anchor.set(0.5);game.physics.arcade.enable(sprite);//最大速度和减速设定sprite.body.drag.set(70);sprite.body.maxVelocity.set(200);//设置子弹轨迹,因为sprite.anchor已经设置为0.5,所以x方向不用位移了weapon.trackSprite(sprite, 0, 0, true);cursors = this.input.keyboard.createCursorKeys();fireButton = this.input.keyboard.addKey(Phaser.KeyCode.SPACEBAR);//自动射击
//  weapon.autofire = true;
}function update() {if (cursors.up.isDown){//旋转加速度(先这么翻译吧,有点复杂)game.physics.arcade.accelerationFromRotation(sprite.rotation, 300, sprite.body.acceleration);}else{//加速度设置为0sprite.body.acceleration.set(0);}if (cursors.left.isDown){//角速度=-300(旋转速度)sprite.body.angularVelocity = -300;}else if (cursors.right.isDown){sprite.body.angularVelocity = 300;}else{sprite.body.angularVelocity = 0;}if (fireButton.isDown){weapon.fire();}//是否换向显示game.world.wrap(sprite, 16);
}function render() {weapon.debug();
}

看过了两个例子,我们大概就知道了其中几个属性的含义了,不过还是要强调一下:

bulletSpeed:子弹初速度(移动速度)。

fireRate:射击频率(子弹出现的频率,单位毫秒,即多少毫秒出现一颗子弹)。

trackSprite:上面已经说过,子弹的偏移量。

autofire:这个简单,是否自动发射子弹。

sprite.body.drag.set(70):API的翻译太过绕口,你直接理解成刹车速度就行,也就是停止时的速度减小量(每秒),这是一个{Phaser.Point}对象(和scale、anchor等一样),方法接收两个参数,比如这里只写了一个,其实也等于sprite.body.drag.set(70,70),之前没有讲到这个,这里补充下。

sprite.body.maxVelocity.set(200):(小飞机)最大速度设定。

angularVelocity:角速度,每秒旋转的角度。

上面的代码只是发射一颗子弹,如果你想一次发射多颗子弹,也是可以的,只不过这些子弹还是直线弹道,虽然单个子弹可以设置便宜角度,但是没有办法像散弹枪一样,发射扇形的子弹(我研究了两个小时,在不修改源码的情况下没有办法实现,希望以后有这个功能吧),发射多颗子弹的代码也很简单,看下面的代码:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create, update: update, render: render });
function preload() {game.load.image('bullet', 'assets/bullets/bullet198.png');game.load.image('ship', 'assets/sprites/shmup-ship.png');
}var sprite;
var weapon;
var cursors;
var fireButton;
var bulletPositions;
function create() {//定义48颗子弹weapon = game.add.weapon(6*8, 'bullet');weapon.bulletKillType = Phaser.Weapon.KILL_LIFESPAN;//子弹寿命,和上一条设定的Phaser.Weapon.KILL_LIFESPAN配合使用weapon.bulletLifespan = 2000;//子弹速度及角度(因为子弹会被横着绘制,所以需要设置角度便宜)weapon.bulletAngleOffset = 90;weapon.bulletSpeed = 400;//子弹随机角度// weapon.bulletAngleVariance = 20;sprite = this.add.sprite(320, 500, 'ship');game.physics.arcade.enable(sprite);//偏移量设置weapon.trackSprite(sprite, 14, 0);weapon.fireRate = 250;//开启多发weapon.multiFire = true;cursors = this.input.keyboard.createCursorKeys();fireButton = this.input.keyboard.addKey(Phaser.KeyCode.SPACEBAR);bulletPositions = [{ x: 0, y: -32 },{ x: -16, y: -16 },{ x: 16, y: -16 },{ x: -32, y: 0 },{ x: 0, y: 0 },{ x: 32, y: 0 }];
}function update() {sprite.body.velocity.x = 0;if (cursors.left.isDown){sprite.body.velocity.x = -200;}else if (cursors.right.isDown){sprite.body.velocity.x = 200;}if (fireButton.isDown){//每次射击发射6颗子弹weapon.fireMany(bulletPositions);}
}function render() {weapon.debug();
}

步骤其实很简单,创建多颗子弹,开启多发,设定各个子弹的偏移量,然后就OK了,是不是很简单?

还有一个属性需要了解下,就是weapon的bulletAngleVariance属性,我在上面的代码中也注释过了,它给所有的子弹提供了一个随机的发射角度,而且每次刷新都是相对于当前的位置随机的,所以会出现一条随机的弹道,只是很遗憾,我还是没有找到在不修改源代码的情况下发射扇形子弹的方法。

好吧,这一节就这样了,教程阅读到这里,游戏页面的制作流程和方法大家也都熟悉了,那么下一节让我们进入实战吧,也是这个教程系列的最后一节,模拟经典游戏:雷电。

Phaserjs基础教程第八节:Weapon对象相关推荐

  1. javascript基础教程_JavaScript基础教程(九)对象、类的定义与使用

    对象.类的定义与使用 对象与类是面向对象程序设计语言教学过程中不可避免需要讲解的内容之一.很多人将两者混为一谈,简单认为对象就是类,类就是对象.实际上深入分析的话,对象与类的区别还是较为明显的.本文主 ...

  2. python基础教程:对可变对象和不可变对象的详解

    数据类型分为可变.不可变.可变对象表示可以原处修改该数据对象,不可变对象表示必须创建新对象来保存修改后的数据. 在基础数据类型中: 数值.字符串.元组.frozenset是不可变对象 列表.set.d ...

  3. python基础教程: __del__() 清空对象

    python垃圾回收机制:当一个对象的引用被完全清空之后,就会调用__del__()方法来清空这个对象 当对象的引用没有被完全清空时,代码如下: class C():def __init__(self ...

  4. python基础教程:类和对象

    Python的类(class)是抽象的概念,是指一类实例对象的集合,该实例具有相同的属性和方法,而对象(object)是类的具体的实例. 类的定义语法如下所示,最重要的两个部分是属性和方法: clas ...

  5. Android基础教程之五大布局对象------FrameLayout,LinearLayout,AbsoluteLayout,RelativeLayout,TableLayout...

    2019独角兽企业重金招聘Python工程师标准>>> 大家好,我们这一节讲一下Android对用五大布局对象,它们分别是FrameLayout(框架布局:不知道是不是这么翻译的), ...

  6. 【融职培训】Web前端学习 第3章 JavaScript基础教程9 内置对象

    一.内置对象概述 javascript为我们提供了很多内置对象,这些内置对象为我们提供了很多语言的基本功能.我们之前学过的数组就是JavaScript的内置对象,除了数组我们还应该了解的内置对象有:M ...

  7. JAVA基础教程基本语法、对象和类

    对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. 方法:方法就是行为,一个类可以 ...

  8. Scala基础教程--06--类与对象的详解

    Scala基础教程–06–类与对象的详解 章节目标 掌握类和对象的定义 掌握访问修饰符和构造器的用法 掌握main方法的实现形式 掌握伴生对象的使用 掌握定义工具类的案例 1. 类和对象 Scala是 ...

  9. 《ActionScript 3.0基础教程》——第2章 往舞台动态地添加对象2.1 创建库资源,并为它命名...

    本节书摘来自异步社区<ActionScript 3.0基础教程>一书中的第2章,第2.1节,作者: [美]Doug Winnie 更多章节内容可以访问云栖社区"异步社区" ...

  10. 《ActionScript 3.0基础教程》——1.4 对象参数

    本节书摘来自异步社区<ActionScript 3.0基础教程>一书中的第1章,第1.4节,作者: [美]Doug Winnie 更多章节内容可以访问云栖社区"异步社区" ...

最新文章

  1. VScode 无法创建文件或者无法保存文件
  2. [转载]AIX 上 Lotus Domino 的内存使用
  3. BZOJ 3781: 小B的询问 [莫队]
  4. java 泛型集合应用_Java泛型集合的应用和方法
  5. Spring系列(七):@FactoryBean注解用法介绍
  6. 51 Python - 装饰器 参数化装饰器——装饰器更通用
  7. 有哪些适合大学生浏览的网站?
  8. PHP如何判断提交表单中多个复选框是否选中?
  9. 安装Python-2.5.2,并修改默认python版本
  10. 推荐三十款最好的免费项目管理软件
  11. 软测工具Testbed的使用以及动态测试实例
  12. 西门子Smart 200 PLC 封装运动控制向导生成指令(脉冲)
  13. 基于ANSYS-APDL的简单静力学分析示例(悬臂梁)
  14. 货拉拉2021岗位招聘内推计划开始啦
  15. 计算机音频接口,一台计算机的两个音频输出
  16. ICP算法概述以及使用SVD进行算法推导
  17. 防止XSS漏洞攻击常用解决方案
  18. 使用Prometheus监控web站点及证书过期
  19. 计算机工程师花了三年建模女朋友,网易工作十年游戏建模师,还没有女朋友,是怎样的一种体验?...
  20. Win10 SQL Server 2012 企业版 安装教程

热门文章

  1. 【VBA】用excel玩游戏,俄罗斯方块
  2. params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors 解决方法
  3. Acer E1-471G DMI信息修改案例(硬刷)
  4. ArcCatalog不能预览地图服务
  5. ADAMS并联机器人动力学仿真【附源文件】
  6. matlab的取整函数
  7. H5 前端JS添加水印
  8. cad卸载_解决CAD小白入门的第一个难题,三招任你选
  9. i7 9750h和i7 8750h参数对比差多少
  10. bmd硬盘测试_硬盘测速工具:Blackmagic Disk Speed Test Mac