フロントエンド開発Blog

オレには鈍器がある

JavaScript , enchant.js , frame

オレには鈍器がある 作成途中のコードです。
前回からの違いは以下の通りです。

実装機能:
・Playerクラスを拡張して敵クラスを作成しました
・敵クラスから敵を生成するようにしました
・与ダメージ、被ダメージ処理を追加しました
・ダメージ計算式を実装しました
・攻撃処理を実装しました
・死亡時の処理を実装しました
※consoleにダメージ計算結果を出力しました

http://jsdo.it/oredon/lCgx

今回はてんこ盛りな内容となっていますが、Player・Enemyそれぞれ攻撃処理について見ていきたいと思います。

まずは何をもって攻撃とするか、という定義から始めます。いくつかパターンがあると思いますが

  • 明示的に攻撃アクションを付ける
  • 相手と重なったときに攻撃とする

だいたいはこの2つのうちのどちらかかと思います。今回ではPlayer側は明示的に攻撃アクションを付け、Enemy側は相手と重なることで攻撃成功とします

まず、Playerの攻撃アクションを見ていきます。

・・・の前に一点。攻撃アクションについて一つ制約を設けたいと思います。一度攻撃するとしばらくは攻撃できないというタイムラグを実装します。攻撃エフェクトにせよ、攻撃アニメーションにせよ、連続して実行出来てしまうと「オレつえええええ!」が出来てしまうため(そういうゲームならいいのですがw)これを封じたい。こういった時間経過系の処理は普段ならsetTimeout()を使うところですがenchant.jsのお作法的にどうなのかなと思ったためcore.frame値を利用することにしました

core.frameは前々回のPlayerフレームアニメーションでも出てきました。ゲーム中は継続的にインクリメントされる数値のため、こういった時間経過系の処理にも流用できそうだ、という判断のもと、core.frame値をタイムラグ実装に使用することにしました。

上記を踏まえてPlayerの攻撃に関する個々の処理を見ていきます。

  • attack
  • checkAttack
  • slashEffect
  • sendDamage

Player.attack()ではアタックボタンが押された時に攻撃エフェクトの表示を実装しています。「攻撃中」というフラグが立って居なければ攻撃用のSpriteをPlayerの前に生成し、そのエフェクトSpriteには当たり判定を設定します。このエフェクトと、敵Spriteが重なった場合は敵にダメージを与えるsendDamage()というメンバ関数へ処理が移行します

また関連する処理として、Player.checkAttack()では攻撃時のPlayerアニメーションを実装しています。Playerの向いている方向に応じて攻撃用のフレームアニメーションを付けます。このアニメーションには冒頭でうんちくを語ったcore.frameによるタイムラグが処理内に書かれています。一定間隔でアニメーションが進み、最後のアニメーション表示直後に「攻撃中」フラグを取り下げることで、次回の攻撃アクションを許可します。

slashEffectではattack関数によってシーンに現れた攻撃エフェクトのライフタイムと取り下げ処理を行っており、一定時間が過ぎるとシーンから削除され、当たり判定も失います。

sendDamageはPlayerと該当Enemyのステータスを比較し、Enemyのライフを減算します。

細かい所は省きましたが以上がPlayer攻撃処理の概要です。要はcore.frameによるタイムラグ(攻撃間隔調整)と攻撃用表示へのダメージ送信機能の2種を実装できてしまえば最低限のことはできる、といったイメージです。

さて、Playerと同じく、Enemyの攻撃方法を実装します。

Enemyの攻撃方法、といいましたがPlayerクラスに実装します。というのもEnemyは明示的な攻撃アクションを持たないため、主体と客体でいえば「Enemyが攻撃する」ではなく「Playerが特定条件下でダメージを受ける」というまとめ方のほうがしっくりくるためPlayerクラスに処理を持たせました。

攻撃を受ける処理は以下の3種で出来ています

  • checkDamage
  • knockback
  • receiveDamage

Playerの攻撃の項でも書きましたが、無尽蔵にダメージが成立するとほぼ確実に即死してしまうため、一端ダメージを受けたら一定時間無敵になるようにフラグ管理をします。

core.frameをここでも使って、1秒相当のframe時間中はダメージを受けないようにcheckDamage内に記述してあります。そしてcheckDamageからPlayerが後ずさりする処理であるknockbackと、ダメージ処理receiveDamageが実行されます。

knockbackは単純にPlayerが向いている方向から一定距離後ずさりするようにしています。ここで注意はmapとの衝突判定を絡めないとPlayerが壁に埋まる可能性があります。かならず衝突判定処理に即した書き方をするようにします。

receiveDamageはPlayerインスタンスが持つ値の減算です。Player.sendDamageの主体と客体が逆になったような処理をしています。

攻撃処理については以上です。ここらへんは結構ややこしいですね。。。

以上の変更をPlayerクラスに対して行い、EnemyクラスはPlayerクラスを拡張してEnemy独自の処理にいくつか差し替えて利用します。Playerクラスとの大きな差異は「enemyWalkDirection」というメンバ関数です。これはPlayerの座標に向かって進む移動用の関数になります。

ページトップへ

関連ページ

ページトップへ