GameMaker 日本語掲示板

view_xport+=1で動かしたとき背景がおかしくなってしまいます

9 コメント
views
17 フォロー

playerというオブジェクトが所定のx座標に到達したら、操作を無効化し、playerを追従していたview[0]をview_xport+=1を所定の位置まで実行したのですが、背景にしていたスプライトが引き延ばされ手描写されてしまいます......。

xzy
作成: 2024/01/11 (木) 17:50:42
通報 ...
1

スクショを貼れますか?

引き伸ばされた状態が不明ですが、
スクロールによって背景がない部分に残像が残りそのように見えることがあります。
その場合はClear Display BufferとClear Viewport Backgroundをオンにして毎フレーム描画をクリアすると解消されます

2

こんな感じです!一番左がview_xport-=1を実行しなかった場合で、真ん中(左)⇒真ん中(右)が実行した場合です!!
Clear Display BufferはすでにオンにしてあったのでClear Viewport Backgroundもオンにしてみたのですが、次は一番右のように背景が切れてしまいました......。画像1
画像2
画像3
画像4

3

その他のルーム設定及び、オブジェクトのプログラムはこんな感じです!!
画像1
画像2
画像3
画像4
画像5

4
asa 2024/01/14 (日) 14:30:47 修正

1枚目 伸びてない背景
2枚目 伸びてる
3枚目 伸びてる
4枚目 伸びないがroom外が映ってる
ということで、2~3枚目はおそらく、Clear Viewport Backgroundがオフになっていたから背景の残像がクリアされず、スクロールすると背景が伸びたように見えている状態だと思います。

4枚目の背景が切れているのはそこがroomの境界ではないですか?
room全体の作りが不明なので、その仮定で書きますが、
カメラを際限なくずっと動かしていったらroomの外が映り、4枚目のようになるはずです。
(スクロールを止めなかったら最終的に画面は真っ黒になります)
room外を映さないためには、roomの境界までスクロールしたらスクロールを止めるように処理する必要があります。

5

何度もすみません!!背景は実際こんな感じで続いてます!!画像1

6

roomの全体が分かりました。すいません。
view_portを-1で動かしているので、画面に描画する範囲を左に動かしています。
その結果右に余白が出ているのだと思います

view_portを動かしているのはどういう動きをさせるためですか?

7

リンク
操作しているキャラクターが所定の位置に行ったら、プレイヤーの追従&操作を止めて、view_portを動かす.....的な動きをさせたいです!分かりにくかったら、貼らせていただいたアンダーテールというゲームの動画の0:07~0:13の動きが正にやりたかった動きです!!何回もすみません!!

8
asa 2024/01/15 (月) 15:00:29 修正

画面をスクロールさせる(カメラを動かす)には、
view_portではなくcamera viewの位置を動かします。

// Stepイベント
viewx += 1;
camera_set_view_pos(view_camera[0], viewx, viewy);

こんな感じです。

playerが所定の位置まで行ったら操作受付を止めて自動スクロールするには例えば下記のようになります
ロジックは一例ですのでご自分のやり方で書いてください
(roomのカメラのObject Followingがセットされているとカメラを自前で制御できないので"No Object"にしてください)
playerオブジェクト

// Createイベント
view_x = 0;
view_y = 0;
state = "walk";
view_w = camera_get_view_width(view_camera[0]);

// Stepイベント
if (state == "walk")
{
	if (keyboard_check(vk_right)) x += 5;
	if (keyboard_check(vk_left)) x -= 5;
	
	camera_set_view_pos(view_camera[0], x-view_w/2, 0);
	
	if (x >= 500)
	{
		view_x = camera_get_view_x(view_camera[0]);
		state = "auto_scroll";
	}
}
else if (state == "auto_scroll")
{
	if (view_x < 400)
	{
		view_x++;
		camera_set_view_pos(view_camera[0], view_x, view_y);
	}
}
9

何度も説明不足ですみませんでした!!!!めっちゃ助かりました!!!!!!!!!!!!!!!!!!