スーベニあいわな製作所

スーベニあいわな製作所

アイワナ作ってます

Amebaでブログを始めよう!

壁際のスイッチやセーブを撃ったとき,稀にバレットの判定が消えることがあるじゃないですか.

あれの対策法を紹介します.

たぶん初心者向けの記事です.

 

↓弾のオブジェクト(bullet)のstepイベントをこれに書き換えてください.flagは別の変数名でも大丈夫です.

if(flag == 1)instance_destroy();

if(!place_free(x+hspeed,y+vspeed)){
    flag = 1;
    move_contact_solid(direction,speed);
    speed = 0;
}

 

 

↓yuuutuエンジンの場合はbulletのstepイベントをこれに書き換えてください.

if(flag == 1)instance_destroy();

if(place_meeting(x+hspeed,y,block)){
    a=instance_place(x+hspeed,y,block)
    if(a.object_index==block){
        flag = 1;
        move_contact_solid(direction,abs(hspeed));
        speed = 0;
    }
    else if(a.visible){
        flag = 1;
        move_contact_solid(direction,abs(hspeed));
        speed = 0;
    }
}

 

以上です.

 

 

【解説】

なぜバレットが壁に当たったとき判定が消えるのか,なぜ上記のコードで対策できるかを解説します.

 

判定が消える理由

これを解説するには,移動と速度に関するgamemakerの仕様を理解する必要があります.

 

例えば,座標 x= 0 にあるオブジェクトが1フレーム(ゲーム内の時間単位)毎に右に20移動するとき,どのように移動するでしょうか?

普通に距離=速度×時間の関係から,1フレーム後には x = 20,2フレーム後には x = 40,3フレーム後には x = 60 と移動していきます.

 

では,図のように座標 x=45 から x=55 の範囲に壁がある場合,移動するオブジェクトは壁に衝突するでしょうか?

感覚的にはぶつかりそうな気がしますが,実際はぶつかりません.

 

 

その原因はgamemaker(というかゲーム全般)の仕様にあります.

これが現実の物体なら,x=0,1,2,3,4,5...と時間経過で連続的に座標が変化していきます.

しかし,ゲームの世界では x=0,20,40,60,80...と1フレーム毎に瞬間移動しながら離散的に座標が変化していきます.

このような瞬間移動を1秒間に数十回(アイワナの場合50回)繰り返すことで滑らかに動いてる見せているわけです.

パラパラ漫画みたいなのを想像してもらえると分かりやすいと思います.

 

そして,さっきの例では座標が40から60に瞬間移動してしまうので,その間にある壁を飛び越えてしまいます.

つまり,オブジェクトの移動速度が大きすぎると判定をすり抜けてしまう現象が発生します.

そして速度の大きいバレットにも同様の現象が発生し,スイッチの判定が小さい場合は稀にすり抜けてしまいます

これが判定が消える理由のひとつです.

血がブロックの角を通り抜けたり,高速で動く弾がプレイヤーをすり抜けるのも同じ理由です.なので,速度が大きい上に判定が小さく,すり抜けられたら困るオブジェクトはcollision_lineなどの関数を使って判定を補強してあげましょう.

 

この記事で紹介したコードではmove_contact_solidという関数を使ってすり抜けの対策をしています.

この関数は「壁にぶつかる直前の位置まで移動する」という効果があるので,壁にくっついているスイッチをすり抜けずに当てられるわけですね.

 

ちなみに,壁に張り付いてショットを撃ったときにバレットの当たり判定が消える不具合(壁にくっついたセーブを撃つとたまに反応しないことあるじゃないですか?)は処理の順序が原因なのですり抜けとはまた別ですが,このコードでついでに対策できます.やったぜ.

 

なんとなく語りたくなったので当時の思い出とか反省点とか語ります.

ただの痛い自分語りなので話半分に聞いといてください.

Fancyも気が向いたら振り返ります.(そうでもないけど)

当たり前ですがネタバレがあるので非プレイの人は気を付けてくださいね.

 

【製作の経緯】

2016年9月 Fancy公開

       11月 短編を作ったものの微妙な出来で没にする

2017年4月 長編を製作しようとするが1ステージ目で飽きて没にする

     5月 Hibikusuku製作開始

     9月 1面道中完成

       11月 1面ボス完成

2018年3月 2面道中完成

     8月 完成

 

なんやかんやで完成に1年以上かかってますが,作ってはサボっての繰り返しだったので真面目に作っていたのは3,4か月程度だと思います.いま作っている長編もサボりまくってるのでそろそろ真面目に頑張ります.

あと正直言って2面道中の後半辺りから183現象で作るのが苦痛になってきました.本当は3面まで作る予定でしたが断念して若干投げやりですが無理やり完成させました.もしも3面が作れていたら,BGMはmozellさんの「夏休みの思い出」を流して異空間っぽい雰囲気にする予定でした.

 

 

【コンセプト】

見ての通り夜がコンセプトです.

暗い夜を月や街頭が照らしている風景って超カッコイイじゃないですか.あれを表現するために雰囲気づくりを頑張りました.

1面では針を光らせたり背景に流れ星が流れたりするようにし,2面では綺麗に光っている月と暗めな壁の2つのレイヤーを用意して背景にコントラストをつけたりしました.思ったより明るい感じになりましたがポップな雰囲気が出たのでこれはこれでアリだと思います.

ただ,2面は装飾が少なくて若干寂しかったかなと反省してます.

 

 

【タイトルの由来】

私の好きなバンドの「ヒビスクス」という曲名から取りました.戦争や命の価値といった重いテーマの込められた曲ですが,私のアイワナにはそんなものは込められていません.なんとなく語呂が良かったので拝借しただけです.悲しいなあ.

ちなみにHibikusukuの読み方は「ヒビクスク」です.とある配信のコメント欄で「ハイビスカス」と読んでいる方がいましたが,曲名の由来がハイビスカス(hibiscus→ヒビスクス)なのでそれはそれでいいと思います.むしろよくハイビスカスって分かったね.

 

 

【道中】

全体的にアクションが面白くなるようにかなり気を遣いました.個人的にテンポよく次々と進めていくゲームが好きなので,リセットする度に無駄な何もない空間を歩かせるとか,リフトの周期が合わず無駄に待たせるとか,テンポが悪くなるようなことはしないようにしました.かと言ってあまり忙しすぎてもキツいので適度に休憩できる場所を設けてテンポに緩急をつけています.

 

あとは,ギミックの特性を活かしてプレイヤーに色々な動きをさせたり,理不尽をできるだけ取り除くことで気持ちのいいアクションができるよう意識して作りました.

特に,理不尽の排除は地味ですが重要だったと思います.難しいゲームって何度も試行錯誤することでプレイを上達させて難所を乗り越えるのが面白いわけじゃないですか.なので,極端な運要素,操作性の悪さ,画面の見づらさみたいなプレイスキルとは関係のない部分で苦しめられるのは(例外もありますが)理不尽なだけで面白くないです.その辺の理不尽を取り除くためそれなりに気を遣いました.

 

あと初見殺しも理不尽の一種なので,状況次第ではプレイヤーを不快にさせてしまいます.初見殺しで笑えるのは面白さが不快さを上回っているときだと思うので,針を飛ばすだけとかブロックが消えるだけみたいな単純で面白味の少ない罠は出来るだけ置かないようにしました.置くとしても他のギミックと組み合わせて意表をついたり,区間の前半に置くことでやり直しのストレスを減らしたりしました.

作者的には1面の偽セーブが今作で一番攻めた罠だったと思います.油断しきった最悪のタイミングをついてくる上に直前の仕掛けと合わさって相当プレイヤーをおちょくる罠なので,救済措置が無かったら大変なことになってましたね.

 

 

【1面ボス】

青いボールみたいなヤツ.

ユニークで派手な動きをする,見ているだけで楽しいボスになるよう一つ一つの動きを考えて作りました.

 

攻撃は決められた幾つかのパターンがランダムで選ばれる方式になっています.

各パターンには予備動作があり,動きやタイミングは固定されているので,予備動作を見極めてそれに対応する避け方を素早く選択すれば絶対に避けられるようになっています.操作の精度よりも判断力と反射神経が重要な感じです.テンポよく攻撃が飛んでくるスリリングな戦闘にできたと思います.

反省点は,避け方が分かりづらかった点です.攻撃パターンが多い上にどれも避け方が微妙にひねっており,覚えるのに手間取っている方が多かったようです.配信を見ている限り,避け方さえわかればあっさり倒せるくらいの強さのはずですが,実態以上に強く感じられてしまいました.

 

 

【2面ボス】

かわいい.

段差を利用してあちこち動き回りながら戦う感じのボスです.プレイヤーに自然に動き回ってもらうため,ボスが一度攻撃する度にランダムで移動する仕様にしました.ボスを攻撃するためには真横にいないといけないので,上側に移動したら追いかけて上段へ,下側に移動したら下段へといったように,自然と足場を動き回りながら戦うはずです.このとき,ボスを追いかけたせいで不利にならないようにしました.

前にやったアイワナにも複数の足場がある部屋の中を動き回るボスがいたのですが,プレイヤーとボスの位置関係によっては回避不可能な攻撃をしてくることがありました.そうするとプレイヤーが安全に避けられる場所が限られてきて,最善策を考えた結果「ボスが都合の良い位置に来ることを祈りながら中央で待ち続ける」というもどかしい戦い方を強いられてしまいました.そうなると折角の足場が活かしきれずに勿体ないです.

こういったことが起きないために,ボスと同じ段にいるときは詰みが発生しないよう調整しました.(選ばれる攻撃は完全ランダムに見えますが実は少し調整が入っています.)むしろ一部の攻撃では安全な位置に誘導し避け方を把握してもらうのに役立ちました.Fancyのボスは一部の攻撃が意地悪で避け方わかりづらいと批判されたのでその反省を活かせたと思います.

ただし,緑とオレンジの弾がグルグルする攻撃に限っては例外で,ボスの近くにいると即死する可能性があります.なので,予備動作としてこの攻撃専用のアニメーション(両手を上げる)を用意し,特別に警戒させることで素早く安全地帯に避難できるように誘導しました.

 

あと,1面ボスと同じですが全ての攻撃に予備動作があり,それを見極めて正しい行動をすれば確実に避けられるようにしました.乱数弾幕でもある程度決められたルールに従っていたり,十分な猶予があったりするので詰むことは無いはずです.(あったらごめんなさい)

 

反省点としては紫の波形弾幕が簡単すぎたことでしょうか.攻撃ごとにある程度の難易度差があったほうが緊張感が出るかと思い,あえて簡単な攻撃を用意したのですが流石に簡単すぎてつまらないです.波の幅を大きくするとか複数の波を同時に出すとかすればもっと面白かったかもしれません.

それと弾幕の見た目が微妙に地味なのでもっとカッコよくしたかったです.

 

 

そろそろ書くのが面倒くさくなったので終わります.○○をすると良くなる的なことを書いてありますが,私が勝手にそう思っているだけなので参考にしてもしなくてもいいです.というか私自身も上手く出来てないかもしれませんし.

今思うと色々満足のできていない部分があるので次回作の長編はもっと良いアイワナにしたいです.