
落とし穴 画面振動の落とし穴
前回の落とし穴
前回は通常攻撃しながら移動できるようにした。
今回は、画面を振動させようと思って苦労した話。
今日のクライマックス

落とし穴の想い出 10円玉を弾いてゴールを目指すゲーム
10円玉をはじいてゴールまで運ぶと景品がもらえる。
途中落とし穴に10円を落として何度も涙した。。。
小遣いは1日50円。なけなしの金だもの。糸引きアメ買ってうまい棒買ったらおしまい。
おやつを買って河原へ行き、ヘビやカエルを捕まえたり石切りしたり秘密基地を作ったり楽しかったな。。。
画面シェイク
簡単だろうと思って手を出して痛い目に合うシリーズ。
ぜんぜんうまくいかない。
AIに相談:画面シェイクしたい
GameMakerで画面をシェイクさせるには、カメラやビューの位置をランダムに変化させることで実現できます。以下に具体的な手順を示します。
①ビューを有効にする
GameMakerで画面シェイクを実現するには、ビューを有効にしてカメラの位置を操作する必要があります。
ビューを有効化
オブジェクトのRoom設定で、ビューを有効にします。
Enable ViewportsとVisibleのチェックをオンにします。
カメラのターゲット
対象となるオブジェクトを設定します(通常はプレイヤーキャラクター)。
ルームのインスペクターにチェックを入れるだけなので簡単

② シェイクのコードを記述
以下のコード例では、画面をランダムに揺らします。
obj_cameraのステップイベント
// シェイクの強さ(ピクセル単位)
if (shake_timer > 0) {
shake_timer--;
// ランダムなオフセット
var shake_x = irandom_range(-shake_strength, shake_strength);
var shake_y = irandom_range(-shake_strength, shake_strength);
// ビューの位置を設定
camera_set_view_pos(view_camera[0], original_x + shake_x, original_y + shake_y);
} else {
// シェイクが終了したら元の位置に戻す
camera_set_view_pos(view_camera[0], original_x, original_y);
}
obj_cameraのCreateイベント
// カメラの初期位置を取得
original_x = camera_get_view_x(view_camera[0]);
original_y = camera_get_view_y(view_camera[0]);
// シェイク用のタイマーと強さ
shake_timer = 0;
shake_strength = 0;
global.shake = false;
global.score = 0;
③シェイクをトリガー
画面シェイクを発生させたいタイミング(例えば敵が攻撃を受けたとき)で以下のように記述します:
今回は、落とし穴にプレイヤーか敵が落ちたらトリガーして画面シェイク。
if (obj_player.into_hole or instance_exists(obj_get)) {
// シェイクの強さと時間を設定
shake_strength = 7; // シェイクの強さ(ピクセル単位)
shake_timer = 5; // シェイクの継続フレーム数
}
仕組みは単純。
ルームに設定したカメラのviewport0のポジションを変える関数camera_set_view_posでカメラのオフセットをランダムに動かすだけ。
本来ならAIに聞く必要さえない。
なのに、まったく動かない。
キーボードの左右キーを押した時に画面が動くか確認してください。
// キーボードでカメラを手動操作
if (keyboard_check(vk_left)) {
camera_set_view_pos(view_camera[0], original_x - 10, original_y);
}
if (keyboard_check(vk_right)) {
camera_set_view_pos(view_camera[0], original_x + 10, original_y);
}
まったく動かない。
原因をさぐるため、新しいプロジェクトを作り、カメラのプログラムだけを走らすと動いた!

しかし、プレイヤーを入れると動かない。

ChatGPTの無料も終わり、そこから1時間後、ようやく原因が分かる。
カメラの設定の問題:水平速度と垂直速度が-1はあかん!
水平速度と垂直速度が-1だとカメラを即座にワープされ、シェイクが無効化されるんやと。なんちゅーこったい。わからんわ。

水平速度と垂直速度をプレイヤーの速度より少し遅い2にして対応。
皆で落ちれば怖くない!レッツ画面シェイク!
スライムを落としても、自分が落ちても画面シェイクするようになった。

同じ罠に落ちないように気を付けてね!
誰かの参考になればさいわいです。

使用ツール
ゲームツールは「GameMaker」
ドット絵ツールは「EDGE」
AIは「ChatGPT」