開発日記

20140109.jpg 20140109_2.jpg

プレイヤーの属性ごとの攻撃方法を考えていました。通常攻撃は、近距離・中距離、遠距離・特殊(範囲攻撃)。で、スキルは攻撃補助や通常攻撃を補助するような攻撃方法がいいのかなと。 でも何かしっくりこないのですよね。なんでかなぁ、と考えていたのですが理由は2つあるような気がしました。

1つは「シチュエーションの想定」が足りていないこと。どんな敵が攻撃してきて、どうやってそれらをなぎ倒すか、という想定ですね。敵が大量に突進してきた時にプレイヤーはどういう行動を取るのか。敵が弾を大量に撃ってきた時にプレイヤーはどうするのか。敵がプレイヤーに気づかず待機中で待ち構えているとき、プレイヤー側はどう仕掛けるか。…たぶんこの手のゲームを作り慣れている人なら、なんとなくイメージが出来てて、脳内シミュレーションで完結するのでしょうけど、今回初めて作るジャンルなので、そこまで論理が飛躍しないのですよね。

もう1つは、そのシチュエーションに対して、「有利不利の特徴」をもたせられているかどうかの判断。簡単に言えばジャンケンですね。グーはチョキに強い。チョキはパーに強い。パーはグーに強い。せっかく複数の攻撃方法を用意するからには、攻撃方法に特徴を持たせたいところです。でもある攻撃方法が他に比べて絶対優位な戦略となると、攻撃方法が切り替えられる意味が無いですよね。…最近、メトロイド・フュージョンをクリアしたのですが、そのゲームではブロックを壊すための絶対優位な攻撃方法がなく、使い分けを要求されていてとてもうまい作りだなと思いました。

という思考実験をした結果、もう少し考えをまとめてから実装をしようかと思いました。まあ最終的には動かしてみないと分からないので、あまり頭でっかちになるのは良くないですけどね

2014/1/8

20140108.png

敵を倒したらコインを出すようにしました。半径48pxに近づくと自動で吸い込むようになっています

20140108_2.png

プレイヤーのドット絵を差し替えました。そして画面上の「P」を取ると属性チェンジして色が変わります。しかし各属性にどんな攻撃を割り当てるかはまだ考えておりません…

2014/1/7

20140107.png

スプライトフォントが実装できたことで、ダメージ数値の表示を実装しました

2014/1/6

スプライトフォントを実装していました。 時間がかかるかと思ったのですが、font_add_sprite_ext ()関数を使うことで簡単に実装できました。GameMakerすごい!

2014/1/5

今日も敵の状態遷移を実装していました。

20140105.png

そしてようやく弾を打つ敵を作れました。

2014/1/4

今日は敵の状態遷移を実装していました

  1. switch(self.state)
  2. {
  3. case ENM_ST_IDLE: { event_perform(ev_other, ev_user0); break; } // 待機モード
  4. case ENM_ST_CHASE: { event_perform(ev_other, ev_user1); break; } // 追跡モード
  5. case ENM_ST_ATTACK: { event_perform(ev_other, ev_user2); break; } // 攻撃モード
  6. case ENM_ST_ESCAPE: { event_perform(ev_other, ev_user3); break; } // 逃走モード
  7. case ENM_ST_INTERCEPT:{ event_perform(ev_other, ev_user4); break; } // 迎撃モード
  8. case ENM_ST_AROUND: { event_perform(ev_other, ev_user5); break; } // 取り囲むモード
  9. }
AIではお馴染みのステートマシンによる実装で、状態変数"state"に対応するユーザ定義イベントを呼び出しています。 継承先では各イベントを上書きして実装する予定です。

2014/1/3

20140103.png

エフェクト周りを色々入れてました。まだ地味なので何とかしたいけど、今のところはこのくらいで。

20140103_2.png

あと、敵が弾を撃つようにしました。当たり判定はやや小さめで。

20140103_3.png

それと、敵動作仕様を作っていました。(→敵仕様) この通り作るかはわからないけれども、AI作成の方針として頭のなかの整理のために作りました。

2014/1/2

昨日は23:00に就寝して、今日は朝6:00に起きました。早寝早起きして気分がいい状態で開発していました。

今日はコリジョンを実装。

20140102.png

これで壁を使って待ち伏せするという攻略ができるようになりました。

あと、デバッグ機能で敵のパラメータを見れるようにしました。

20140102_2.png

マウスカーソルを合わせるか、敵に攻撃すると見えるようになります。これで少しは開発が捗るはず

2014/1/1

正月も開発しています。HPゲージ・MPゲージを実装しました。

20140101.png

静止画ではわからないのですが、ゲージの柄がUVスクロールしています。ちょっと悩んだのがテクスチャのリピートを使う場合は、

としないとうまく描画されないようです。

あと、敵が重ならないようにしました。

20140101_2.png

これで敵に囲まれた感が出るように…!! まあこんな状態になったら即死ですけどね。 実装方法は、

  1. // 他の敵と重なっていたら少しずれる
  2. var _id = instance_place(x, y, obj_enemy);
  3. if(_id != noone)
  4. {
  5. // 他の敵と重なっている
  6. // 逆方向に1ドットずらす
  7. var dir = point_direction(x, y, _id.x, _id.y) + 180;
  8. var dx = lengthdir_x(1, dir);
  9. var dy = lengthdir_y(1, dir);
  10. x += dx;
  11. y += dy;
  12. }
という記述で対応しました。この方法だと壁に埋まる可能性があるのですが、問題が出たら対処する方向で進めようかなと。ザコが壁に埋まっても問題ないでしょうし…。

2013/12/31

ルームのリソース構成を考える。GameMakerだとルームを名前指定でインデックス番号を取得することはできないよう。仕方ないので「room[ステージ数(3桁)]_[フロア数(3桁)]」という命名規則でリソースツリーにソートして配置することにしました

Hammerwatchを再びプレイ。やはりこのゲーム面白い。理由は、

  • 探索要素
  • コンボによるフィーバー状態

の2つだと思いました。敵やコインをちまちま集める感覚がぷちぷちをつぶす感覚と似ていて、止め時を失います。あとコンボ→フィーバーによる無双状態が楽しいです。通常の火力が低く、HP回復のリソースが有限なので、ついついコンボを狙いたくなります。(そして敵のまっただ中に突っ込んで死ぬというリスクが発生)

以下、GameMaker-SNSの日記に書いた内容をそのまま引用。


次回作の参考にHammerwatchというゲームをやっていました。これがなかなか良くできたゲームで、ご飯も食べずに6時間ぶっ続けでプレイしてしまいました。ちなみにどんなゲームなのかはここの紹介記事を見るといいかも。

ジャンル的にはハック&スラッシュ系、といったところでしょうか。あまり日本では人気のなさそうなジャンルなので、簡単に説明すると、

  • 上から見下ろしタイプの2Dゲーム(2Dゼルダみたいなもの)
  • 謎解き要素はほとんどなく、大量に発生する敵をひたすら倒す
  • 基本操作は攻撃ボタンと特殊攻撃ボタンのみ
  • マップ上にあるアイテムを使ってパワーアップする

これだけのシンプルなゲームです。基本、敵をボタン連打で倒すゲームです。

なのですが、自機の火力が低く、敵が容赦なく大量に出るので無謀に敵に突っ込むと死ぬ、というゲームバランスが絶妙です。体力の自動回復はなく、回復アイテムの配置も限られているため、常に死のリスクを感じさせる作りとなっていて、とてもスリリングです。

なぜこのゲームをぶっ続けでプレイしたのか、理由を考えていたのですが、2つほど特徴的な理由を思いつきました。

1つは探索要素です。このゲームは鍵やスイッチを使って、扉を開けたり、壁を壊したりします。そのためにはマップを隅々までくまなく調べる必要があります。またマップ上には破壊オブジェクトが大量に配置されていて、そこからパワーアップに必要なコインが出現します。それらのアイテムを探して見つけ出すのがとても面白く感じて、「そういえばあそこは調べていないな。もうちょっと調べてみよう」というように止め時を失っていたように思います。(ミニマップで未探索の場所が確認しやすいようになっています) 例えると、プチプチシートのつぶれていない部分を調べる感覚に似ていて、止められない止まらない状態になります。

もう1つはコンボの存在です。一定時間内に10の敵を倒すとコンボボーナスで一定時間プレイヤーがパワーアップします。パチンコなどで言うフィーバー状態となります。この状態になると全方位に弾を撃てたり、体力やマナ(特殊攻撃を使うためのMP)が少しずつ回復します。体力リソースは有限なので、この回復はとても魅力的ですし、通常の火力は低いので、フィーバー状態はとても有利です。ただ、そのためには敵のまっただ中に飛び込んだり、敵をうまくコントロールして一箇所に固まるように移動させまとめて倒す、という工夫が必要です。これは失敗すると死ぬこともあり、コンボを狙うのはリスクが高いです。でもリターンも高いです。またコンボ中は火力がアップするので、さらにコンボからコンボにつなげる、というかなりリスキーなプレイスタイルも許容しています。 つまり、通常の能力が控えめになっていて、フィーバー状態だと強い、という極端な対比が、感情のアップ・ダウンを繰り返させ、このゲームを面白くさせていると思いました。

2013/12/29

敵が出現する穴を実装。

20131229.png

出現のルールをちゃんと決めたいところ。一定時間で出現させると無限に湧き続けるので何らかの出現しない条件が必要?

2013/12/28

敵の旋回移動を実装。接触でダメージとなるので敵の機動力は低めにした方がいいと思い、旋回するようにしました。

20131228.png

GameMakerのTile機能を使ってみました。どうやらテクスチャはBackgroundとして読み込んで「Use as tile set」にチェックを入れることで、Tileとして扱うことができるようです。あとShiftを押しながら左ドラッグで複数配置のようです(GameMaker上のヘルプになかったので一瞬戸惑いました)。

2013/12/27

Hammerwatchのステージ1をようやくクリアしました。ボスが結構強かったです。あとコンボ開始時にHP/MPが回復するスキルを手に入れたのですが、これが結構強力ですね。MPが回復するのでコンボからコンボにつなげやすくなり無双できます。

20131227.png

開発の方はひとまずキャラが動かせて、弾を撃てる状態にしました。まだまだこれからという気がします。気がついたのが、Hammerwatchでは、たいていの敵に接触してもダメージとならず、攻撃モーションをした後に攻撃します。あと8方向のどちらを向いているかが絵から分かります。この作りにするには画像リソースの作成が大変なので、今回は敵に攻撃モーションを持たせず、敵に接触でダメージ・ノックバック、というシステムにしようとかと考えています。

2013/12/26

Hammerwatchのシステム分析。敵編

敵そのものに攻撃判定はなく、攻撃モーション後、攻撃判定が発生します。おそらく近接攻撃のキャラクターでも戦いやすくするため、また敵に囲まれても完全にハマり状態にはならないため、の仕様であると考えました。

  • コウモリ:耐久力低め。移動速度は中くらい。攻撃モーション後、攻撃判定が発生。耐久力が低いので大量に出るとコンボを稼ぎやすい
  • 昆虫:耐久力は中くらい。移動速度は中くらい。攻撃力は若干高め。攻撃モーション後、攻撃判定が発生。レベルが上がると耐久力が上昇、周囲の昆虫をパワーアップ巨大な昆虫も出てくる
  • イモ虫:耐久力は高め。移動速度は遅い。攻撃モーション後、中~遠距離まで届く弾を撃つ。レベルが上がると耐久力が上昇、当たると毒状態になる弾を撃つ
  • 地中針:一定間隔でプレイヤー位置にトゲを発生させる。移動はしない。離れると攻撃してこなくなる。耐久力は中程度。攻撃力は高め

イモ虫の毒弾ですが、一定時間ダメージを喰らい続けるので、トータルのダメージ量が大きめです。地中針はプレイヤーの位置を確実に狙って攻撃するため、移動しながら戦う必要があります。そのためパラディンやウォーロックだと戦いづらいです。

また敵を発生させる敵もいます。彼ら自身は特に移動も攻撃もしません

  • 巨大イモ虫:イモ虫を発生させる。耐久力中程度。移動も攻撃もしない
  • 地面のひび割れ:昆虫を発生させる。耐久力中程度。移動も攻撃もしない
  • 岩:コウモリを発生させる。
分類名称移動速度耐久力攻撃方法備考
通常敵コウモリ1中程度低い攻撃モーション後、前方に攻撃判定発生
通常敵コウモリ2若干速い低い攻撃モーション後、前方に攻撃判定発生
通常敵昆虫1中程度低い攻撃モーション後、前方に攻撃判定発生
通常敵昆虫2中程度少し低い攻撃モーション後、前方に攻撃判定発生
通常敵昆虫3中程度中程度攻撃モーション後、前方に攻撃判定発生
通常敵昆虫4中程度高い攻撃モーション後、前方に攻撃判定発生周囲の昆虫の攻撃力を上昇させる
通常敵イモ虫1遅い少し低い攻撃モーション後、プレイヤーめがけて弾を撃つ
通常敵イモ虫2遅い中程度攻撃モーション後、プレイヤーめがけて弾を撃つ当たると毒状態になる
通常敵イモ虫3遅い中程度攻撃モーション後、プレイヤーめがけて2way弾を撃つ当たると毒状態になる
通常敵イモ虫4遅い高い攻撃モーション後、プレイヤーめがけて3way弾を撃つ当たると毒状態になる
通常敵地中針-中程度一定間隔でプレイヤーの位置にダメージ針を出現させる離れると攻撃してこなくなる
母体巨大イモ虫-中程度一定間隔でイモ虫を発生させる
母体地面のひび割れ-中程度一定間隔で昆虫を発生させる
母体-中程度一定間隔でコウモリを発生させる

2013/12/25

Hammerwatchのシステム分析。アイテム編。

  • 回復アイテム
    • りんご:HP+10。敵や箱からドロップすることもある
    • オレンジ:HP+25
    • ステーキ:HP+75
    • マナのかけら:MP+15
    • マナの宝珠:MP全回復
  • ポーション
    • オレンジポーション:使用すると攻撃力アップ
    • 黄ポーション:使用するとHP・MP全回復
    • 紫ポーション:使用すると一定時間無敵
  • お金(Vendorコイン)
  • 1UPアイテム

アイテムは最初から配置されていたり、箱やツボ、宝箱から出現します。敵からもまれにドロップします。

箱を壊すと、たまに爆弾が出現することがあります。結構ダメージが大きく、ウィザードの初期状態では即死します。

2013/12/24

Hammerwatchのシステム分析。ギミック編。

基本わらわら湧いてくる敵を倒してアイテム回収するだけなのですが、探索要素もあります。パズル要素も若干あります。

探索要素としては、キーによる扉のアンロック、スイッチによる壁や即死ギミックの解除、壁すり抜けと破壊可能な壁、というところでしょうか。

  • キー(鍵):金・銀・銅の3種類。銅の鍵は手に入りやすくお金や回復アイテムの入手に使い、銀はやや特殊なアイテムの獲得、金は次のエリアに進むためのもの、というようにカテゴライズされています。
  • スイッチ:押すと、壁が壊れたり扉が開いたりします。即死するトゲギミックを解除することができます。
  • 壁:一見通れないように見えて、すり抜け可能な壁も存在します。またヒビが入っている壁は壊れることがあり、それを見つけないとゲームが進まないこともあります。
  • トゲ:接触すると即死。スイッチにより解除可能
分類ギミック名説明
キーキー(銅)銅の扉のアンロック
キーキー(銀)銀の扉のアンロック
キーキー(金)金の扉のアンロック
スイッチスイッチ扉や壁の開放。即死ギミックの解除。複数のスイッチを押すことで扉が開放されることもあります
すり抜け壁見た目は当たるけど実は通れる壁
破壊可能壁見た目に少しヒビが入っていて、攻撃することで破壊可能
トゲトゲ接触すると即死。スイッチにより解除可能

複数のスイッチを押して、トゲをうまく解除するパズルもありました。なおトゲは即死します。Hammerwatchは残機制なので死にすぎるとゲームオーバーとなります。

2013/12/23

Hammerwatchのシステム分析。キャラクター編。

キャラクターは4種類の職業から選択できます。

  • パラディン:肉弾戦タイプ。通常攻撃は近接攻撃のみ。特殊スキルはダッシュ攻撃。体力が高めで、敵の弾を正面からであれば防ぐことができる。
  • ウィザード:中距離攻撃タイプ。通常攻撃は魔法による中距離攻撃。当たると炸裂して近接しているダメージがありとても強力。特殊スキルは広い範囲に中距離攻撃。体力がとても低く、敵の攻撃を受けるとすぐ瀕死状態に。ときには即死することも…
  • レンジャー:長距離攻撃タイプ。弓矢で遠くからでも攻撃できて敵の攻撃を受けにくい。特殊スキルは爆弾で配置後一定時間爆発し範囲攻撃となる。体力は若干低め
  • ウォーロック:近距離+遠距離:通常攻撃は近接ですが当たると範囲攻撃が発動。特殊スキルは長距離攻撃できて当たると範囲攻撃となる。体力はパラディンほどではないものの、若干高め。
    職業タイプ通常攻撃特殊スキル耐久力備考
    パラディン近接攻撃専用近接攻撃ダッシュ攻撃高め正面であれば敵の弾を防ぐことができる
    ウィザード中距離攻撃中距離+範囲前方±45度方向への中距離攻撃とても低い
    レンジャー長距離攻撃長距離設置すると一定時間で爆発して範囲攻撃若干低め
    ウォーロック近接+長距離攻撃近距離攻撃。当たると範囲攻撃長距離の弾。当たると範囲攻撃若干高め

ショップでコンボスキルを購入すると、10コンボ達成時にスピードアップ+全方位攻撃のボーナスがつきます。

パラディンは多少攻撃を受けても大丈夫なのですが、基本的に近接攻撃のみなので敵の攻撃を受けやすいです。 ウィザードはうまくいくと敵をガンガン倒せますが、耐久力が低いため死にやすく結構シビアです。 レンジャーは通常攻撃が長距離なので、手数を稼げてとても有利に進められます。爆弾でコンボを稼いで無双することもできます。 ウォーロックはちょっと特殊能力タイプ。範囲攻撃があるのでコンボが稼げそうです。

どれも能力にメリハリがあり、キャラクタごとにゲームプレイに変化が顕著に現れます。ただどれを選んでも、迂闊に敵の巣に突っ込むと即死するのは変わりません。全体的に、わらわら出てくる数に対して火力が低めです。基本はちまちま倒しつつ、ときにはコンボを駆使して敵を一掃する、というプレイスタイルが良さそうです。

個人的な印象としてはレンジャーが圧倒的に強い印象を受けました。ただボスまで進めていないので、ボスのような耐久力の高い敵には苦戦するかもしれません。

2013/12/22

ようやく「ヤルハラのおもち」の開発が終わったので、次回作に着手しています。次は見下ろし型のアクション・シューティングを作ろうと思っています。

参考にしているゲームは「Hammerwatch」( http://www.gamespark.jp/article/2013/09/18/43509.html )です。

この手のゲームで馴染みのあるのは「ゼルダの伝説」ですが、こちらは何も考えずひたすらボタン連打して敵を倒し、アイテムを回収するタイプのゲームです。探索して新しいアイテムやスキルを入手してパズルを解いていくタイプのゲームとは若干趣きが異なります。例としてはスマッシュTV( http://www.youtube.com/watch?v=4AapB7dW3HA )が近いです。わらわら湧いてくる敵を直感で倒して爽快感を得るゲームです。

実際にプレイしてみたのですが、小さい敵がわらわら湧いてくる感がとてもよく出ています。うっかり敵の巣に突っ込みすぎたり、敵を倒し損なうと、一瞬で囲まれ、あっという間にゲームオーバーです。この辺のシビアな難易度は海外ゲーならではですね。でも難しいぶん、ピンチを切り抜けた後の爽快感が半端ないです。

攻略法としては、敵は近づいたり攻撃すると動き出すので、少しずつ倒しながら進めていくというのが基本的な戦略となります。ただその方法だと攻略に時間がかかってしまうので、ときには敵の巣に突っ込み、特殊スキルを駆使してまとめて敵を倒して効率的にプレイします。さらに10コンボすると一定時間プレイヤーの能力がアップするので、うまくいくとごっそり敵を倒せます。なおスキルやステータスアップは回収したお金アイテムで購入することができます。なお特殊スキルはゲージを消費し、一定時間で回復します。

結構難しくてまだボスまで進めていないのですが、プレイを進めてくことでだいぶイメージが掴めてきたので、そろそろ基本システムの設計を始めようかなと思います。

2013/12/16

作業タスクをチケットに洗い出ししました。

今回、ダンジョンエクスプローラーやスマッシュTVを参考に作ろうと思うのですが、東方ではすでに「東方スマッシュ」や「東方エクスプローラー」といったゲームが存在しているのですね…