アイワナ製作

カメラオブジェクトについて

カメラオブジェクトとは?

カメラオブジェクトとは、playerの座標からviewの座標を算出し、設定するオブジェクトです。

カメラオブジェクトの設定

stepイベント

if(global.grav=0){//重力が通常の時
if(instance_exists(player) == true){//playerがいたら
view_xview = floor(player.x/800)*800;//viewのX座標の計算
view_yview = floor(player.y/608)*608;//viewのY座標の計算
}
}else{//重力が反転の時
if(instance_exists(player2) == true){//player2がいたら
view_xview = floor(player2.x/800)*800;//viewのX座標の計算
view_yview = floor(player2.y/608)*608;//viewのY座標の計算
}
}

room startイベント

if(instance_exists(player) == true){//playerがいたら
view_xview = floor(player.x/800)*800;//viewのX座標の計算
view_yview = floor(player.y/608)*608;//viewのY座標の計算
}
if(instance_exists(player2) == true){//player2がいたら
view_xview = floor(player2.x/800)*800;//viewのX座標の計算
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;
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_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;
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_xview=800の図
この図より更に右へ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座標がの時とルームの最大値の時に発生します。
なので、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機能を解説します。

PAGE TOP

    inserted by FC2 system