チュートリアルもそろそろ終盤に差し掛かってきました。今回はSpawn creepsということでクリープを生産する方法のチュートリアルです。クリープって動詞で「這う」とか「忍び寄る」とかいう意味なんですよね。名詞形だと「這う者」「忍び寄る者」といったところでしょうか。
各チュートリアルは別途記事にしてありますので、他のチュートリアルは下記を参考にしてください。
- Loop and import(ループとインポート)
- Simple move(単純な移動)
- First attack(初めての攻撃)
- Creeps bodies(クリープの各パーツ)
- Store and transfer(エネルギーのストアと転送)
- Terrain(地形)
- Spawn creeps(クリープを生成)
- Harvest energy(エネルギーの採取)
- Construction(工事・建築)
- Final test(最終試験)
Spawn creeps(クリープオブジェクトの生成)
Spawn
(スポーン)構造のアリーナ(著者注:起動画面の真ん中の緑のモードが、「Spawn and Swamp」で、このモードではスポーンの生成や、エネルギーの採取などの機能が開放されています)でプレイする場合、spawnCreep()
メソッドを使用して新しいクリープを作成できます。新しく生成するクリープのボディを、そのボディパーツを持つ配列として定義する必要があります。より大きなクリープを生成をしたい場合は、スポーンのストアからより多くのエネルギーを消費します。
コストは以下です:
MOVE
……50 energy(エネルギー)WORK
…… 100 energyCARRY
…… 50 energyATTACK
…… 80 energyRANGED_ATTACK
…… 150 energyHEAL
…… 250 energyTOUGH
…… 10 energy
spainCreep()
メソッドは、後で保存して使用できるCreep
インスタンスを返します。
var creep = mySpawn.spawnCreep([MOVE, ATTACK]).object;
また、loop()
関数の外部でも変数を定義して、ティック間で(著者注:ティックというのは1ループ1動作の単位ですね)使用できます(*1)。
var creep; // ←(*1のことです。loop()の外に出してます)
export function loop() {
if(!creep) {
creep = mySpawn.spawnCreep([MOVE, ATTACK]).object;
}
}
このcreep
(クリープ)オブジェクトには任意のプロパティを割り当てることができることに注意してください。 いくつかのターゲット、ロール、またはその他のデータをクリープに割り当てたい場合に役立つことがあります。
creep.target = flag;
このチュートリアルではSpawn(スポーン)とFlag(旗)が2つあります。
目的:2つのクリープを生成して、2つある旗にそれぞれのクリープをたどりつかせましょう
サンプルコード
import { getObjectsByPrototype } from '/game/utils';
import { Creep, Flag, StructureSpawn } from '/game/prototypes';
import { MOVE } from '/game/constants';
var creep1, creep2;
export function loop() {
var mySpawn = getObjectsByPrototype(StructureSpawn)[0];
var flags = getObjectsByPrototype(Flag);
if(!creep1) {
creep1 = mySpawn.spawnCreep([MOVE]).object;
} else {
creep1.moveTo(flags[0]);
if(!creep2) {
creep2 = mySpawn.spawnCreep([MOVE]).object;
} else {
creep2.moveTo(flags[1]);
}
}
}
まとめ
サンプルコードを読んで重要そうなところを挙げておきます。
var creep1, creep2;
のようにloop()関数の前で変数を宣言しても問題ない(ちなみにvar
ではなくlet
でも動きますね)- spawnは
StructureSpawn
のプロトタイプをgetObjectsByPrototype
で呼び出して配列化しているようです。[0]は配列の先頭という意味ですね - loop外で宣言したcreep1とcreep2は宣言時は空ですので、
if(!creep1){
で空かどうかを判定して、無ければスポーンからクリープを生成する流れみたいです .object
の部分は地味にわすれそうなので注意ですねmoveTo()
については2章でやったSimple moveになるので大丈夫ですね