ゲームライブラリ構築までの道「インベーダー編」#11 : 敵機の攻撃処理

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

こんにちわ。
 

我が強い人とはあまり話をしたくない、下駄です。
 

ほぼ在宅作業のフリーランスエンジニアのメリットは何と言っても、無駄に他人と関わることがないことでしょう。
 

サラリーマン時代に、コミュニケーションを重要視して、無駄に人との会話をぞんざいにできなくて、感じていた時間の無駄がほぼ無くなるのは、IT関連でテレワークができるようになった人やフリーランスの人にとっては、人生で大きく得をした点でもあるでしょう。
 

そして、人との関わりで、ITが重要視されはじめた今の時代は、こうした働き方ができる業種が伸びてくるし、当たり前になってくるでしょう。
 

何より、IT業界の需要はこれまでにもまして増えてくる反面、エンジニア不足と言われ始めるでしょう。
 

さて、本日は、見た目的にもかなり終盤に近づいているように見えるインベーダーゲームですが、ようやく折り返し地点ぐらいですかね。
 

毎日楽しみながら進行しているので、亀足ですがお付き合いくださいませ。

本日のIT謎掛け

「デジタル・コミュニケーション」と、かけまして、
 

「」と、ときます。
 

そのココロは・・・
 

ソースコード

not canvas

解説

今回は、敵機が攻撃をする処理のミサイル発射(&アニメーション)を追加しました。
bullet関係の関数がほぼそれですが、本家の動画を見ていると、ミサイル自体にもアニメーションがついていたので、2パターンのアニメーションを30ミリ秒で動かすようにしてみました。
 

難しかった点としては、インベーダーの一番下の行だけが攻撃してくるという仕様(ビデオをみて、おそらくそうではないかと・・・)のため、最下段のインベーダーを抽出する処理にハマりポイントがありました。
 

ゲーム開始時は、全く問題ないのですが、敵機を何機かやっつけた際に、インベーダーの中断からミサイルが発射されるのをみつけて、何かしらのバグが存在することに気が付き調べていると、以下のような配列で起きがちな不具合に気が付きました。
 

【問題のある処理】
1. インベーダーは、行と列の2次元配列に格納されている。
2. 格納されているデータには、それぞれ座標を保持している。
3. 行を下から列の箇所を抜き取り、列の配列位置に格納。
4. 同じ列位置のデータ(それより上のインベーダ)は、値があっても、無視する。
 

【発生した問題】
1. インベーダーの最下段以外からのミサイルの発射
 

【原因】
1. インベーダーのデータを格納している配列で、自機でやっつけられたデータは、sliceを使って削除されていた。
2. 同じ列にいるインベーダーだが、配列番号が同じではなかった。
 

【解決方法】
1. 最下段を取得する処理(get_invader_bottoms関数)で、配列の番号ではなく、インベーダーのX座標をキーにして列判定を行う。
2. 連想配列になるので、invader_bullet_add関数での、ランダム取得をする際は、Object.keysで、配列取得した一覧のランダムを取得する方式に切り替え
 

上記のような工程で、バグを解消することができました。
 

バグを見つけるまではストレスですが、解消した時は、大きなパズルを解いた感覚になります。
 

いや〜自分の作ったプログラムでの原因追求って、レベルアップを大きく感じられますね。
 

あっ!敵キャラのミサイルは、まだコリジョン設定をしていないので、当たっても死にませんよ。

Github

ソースは以下にアップしています。(ver:0.10)
 

https://github.com/yugeta/game_invader

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です