カメラオブジェクトについて
カメラオブジェクトとは?
カメラオブジェクトとは、playerの座標からviewの座標を算出し、設定するオブジェクトです。
カメラオブジェクトの設定
stepイベント
view_yview = floor(player.y/608)*608;//viewのY座標の計算
view_yview = floor(player2.y/608)*608;//viewのY座標の計算
room startイベント
view_yview = floor(player.y/608)*608;//viewのY座標の計算
if(instance_exists(player2) == true){//player2がいたら
view_yview = floor(player2.y/608)*608;//viewのY座標の計算
計算方法
先にfloor関数について解説します。
floor関数を使うと小数点の切り捨てを行う事ができます。
負の値はマイナス方向に切り上げます。
例1)floor(0.8)→0
___-1______0______1___
色の付いた範囲は0になります。
例2)floor(-0.3)→-1
___-2_____-1______0___
色の付いた範囲は-1になります。
これを踏まえた上で
カメラオブジェクトの計算は
X座標の場合
view_xview=floor(player.x/800)*800;
player.xが400の場合
view_xview=floor(400/800)*800;
↓
view_xview=floor(0.5)*800;
↓
view_xview=0*800;
↓
view_xview=0;
という結果になります。
この計算法ではplayer.xが0~799の間は0になります。
player.xが0の場合
view_xview=floor(0/800)*800;
↓
view_xview=floor(0)*800;
↓
view_xview=0*800;
↓
view_xview=0;
player.xが799の場合
view_xview=floor(799/800)*800;
↓
view_xview=floor(0.99875)*800;
↓
view_xview=0*800;
↓
view_xview=0;
そして800以上になると
player.xが800の場合
view_xview=floor(800/800)*800;
↓
view_xview=floor(1)*800;
↓
view_xview=1*800;
↓
view_xview=800;
となり、viewが右のマップへ移動します。
Y座標の場合も同じです。
view_yview=floor(player.y/608)*608;
player.yが304の場合
view_yview=floor(304/608)*608;
↓
view_yview=floor(0.5)*608;
↓
view_yview=0*608;
↓
view_yview=0;
という結果になります。
この計算法ではplayer.yが0~607の間は0になります。
player.yが0の場合
view_yview=floor(0/608)*608;
↓
view_yview=floor(0)*608;
↓
view_yview=0*608;
↓
view_yview=0;
player.yが607の場合
view_yview=floor(607/608)*608;
↓
view_yview=floor(0.9983552631578947)*608;
↓
view_yview=0*608;
↓
view_yview=0;
そして608以上になると
player.yが608の場合
view_yview=floor(608/608)*608;
↓
view_yview=floor(1)*608;
↓
view_yview=1*608;
↓
view_yview=608;
となり、viewが下のマップへ移動します。
カメラバグについて
カメラバグとは?
カメラバグとは、カメラオブジェクトを置いているルームで
playerがルームの端に立った時、カメラがルームの外側(何もない部分)にviewが移動してしまう現象です。
例として1600×608のルームを使います。
X座標の場合
ルームの左端にplayerが立った時、player.xは0です。
一つ前の解説でも計算しましたが
player.xが0の場合
view_xview=floor(0/800)*800;
↓
view_xview=floor(0)*800;
↓
view_xview=0*800;
↓
view_xview=0;
となるはずなのですが
GameMakerのバグなのか、floor(0/800)が-1になってしまい
view_xview=floor(0/800)*800;
↓
view_xview=-1*800;
↓
view_xview=-800;
となり、上記の図より更に左へviewが移動してしまい、何もない部分が表示されてしまいます。
次にルームの右端にplayerが立った時、player.xは1600です。
」
player.xが1600の場合
view_xview=floor(1600/800)*800;
↓
view_xview=floor(2)*800;
↓
view_xview=2*800;
↓
view_xview=1600;
この図より更に右へviewが移動してしまい、何もない部分が表示されてしまいます。
Y座標の場合も
player.yが0の場合
view_yview=floor(0/608)*608;
↓
view_yview=-1*608;
↓
view_yview=-608;
となり、上記の図より更に上へviewが移動してしまい、何もない部分が表示されてしまいます。
player.yが608の場合も
view_yview=floor(608/608)*608;
↓
view_yview=floor(1)*608;
↓
view_yview=1*608;
↓
view_yview=608;
となり、上記の図より更に下へviewが移動してしまい、何もない部分が表示されてしまいます。
対策
カメラバグは、playerのX座標またはY座標が0の時とルームの最大値の時に発生します。
なので、playerがバグの起きる場所にいる時はviewの計算をしないようにします。
ルームの左端はX座標が0
ルームの右端はX座標がroom_width(ルームの横幅)
ルームの上端はY座標が0
ルームの下端はX座標がroom_height(ルームの縦幅)
この4つの条件の時、計算しないようにif文を追加します。
if(0<player.x && player.x<room_width)
if(0<player.y && player.y<room_height)
if(global.grav=0){ if(instance_exists(player) == true){ if(0<player.x && player.x<room_width){--追加部分-- view_xview = floor(player.x/800)*800; view_yview = floor(player.y/608)*608; }--追加部分-- } }else{ if(instance_exists(player2) == true){ if(0<player.y && player.y<room_height){--追加部分-- view_xview = floor(player2.x/800)*800; view_yview = floor(player2.y/608)*608; }--追加部分-- } }
これでカメラバグは起きなくなります。
次にオブジェクトを追従するview機能を解説します。