再來會稍微複雜一點,我們要創造一個會移動的敵人
先建立一個空的敵人類別
var Enemy = new Phaser.Class({
Extends: Phaser.GameObjects.Image,
initialize:
function Enemy (scene)
{
Phaser.GameObjects.Image.call(this, scene, 0, 0, 'sprites', 'enemy');
},
update: function (time, delta)
{
}
});
我們的類別都是繼承於 Phaser.Class 下的其他類別,這個就是繼承 Phaser.GameObjects.Image ,並且我們會初始化此類別
再來在初始化的地方加入
function Enemy(scene){
// ...
this.follower = { t: 0, vec: new Phaser.Math.Vector2() };
}
t 爲相對於路線 0~1 的數字 、 vec 則是各個時間點的座標
再來加入我們的方法
startOnPath: function ()
{
this.follower.t = 0;
path.getPoint(this.follower.t, this.follower.vec);
this.setPosition(this.follower.vec.x, this.follower.vec.y);
}
先預設敵人一開始的位置
update: function (time, delta)
{
this.follower.t += ENEMY_SPEED * delta;
path.getPoint(this.follower.t, this.follower.vec);
this.setPosition(this.follower.vec.x, this.follower.vec.y);
if (this.follower.t >= 1)
{
this.setActive(false);
this.setVisible(false);
}
}
並在更新時每次畫上下一次敵人要在的位置
並且在全域宣告敵人的速度 ( ENEMY_SPEED ),這邊說是敵人速度是因爲,他是數字越大數字越快,這邊的算法是相對於路線(整段是 0~1 ),他每次渲染就會加一次 ENEMY_SPEED ,當 follower.t >= 1 就會消失(因爲已經離開路線了)
var ENEMY_SPEED = 1/10000;
初始化完敵人類別,要將創造出來的實例加入我們的地圖裡
function create(){
// ...
enemies = this.add.group({ classType: Enemy, runChildUpdate: true });
this.nextEnemy = 0;
}
並且在每次創造出一個敵人時,多久後要出現下一個敵人
function update(time, delta) {
if (time > this.nextEnemy)
{
var enemy = enemies.get();
if (enemy)
{
enemy.setActive(true);
enemy.setVisible(true);
enemy.startOnPath();
this.nextEnemy = time + 2000;
}
}
}
這樣就可以有敵人慢慢跑出來了,並且可以嘗試去修改路線、敵人速度、敵人間距,就可以比較知道一些參數的設定,這個在之後的模組化會比較快上手