2D横スクロールアクションのカメラ制御について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

2D横スクロールアクションのカメラ制御について

#1

投稿記事 by amehirune » 10年前

お久しぶりです、アメヒルネです。
一般的に「カメラ制御」と呼ばれているのかどうかはわかりませんが、今はここで詰まっています。
どなたかご助力いただければ幸いです。

今回やりたいと思っていたのは、ステージ上で、
自機をなるべくキャラクタを中心に描写する、というものです。
ただし、キャラクタを中心に描写することによって、ステージの「存在しない領域」まで描写領域に入っている場合、
ステージの方を優先とし、
「ステージの場外領域を描写しないようにする」
「キャラクタはそれに対応させて描写する」
という風にしたいのです。
(分かりにくくて申し訳ありません。)

後程記載するつもりですが、先にここで述べてしまいますと、
言語はCで、DXライブラリを用いています。
描写に用いる関数はDrawRotaGraph関数です。

ひとまず先に、簡単なカメラ制御のプログラムを描いてみました。

コード:

//キャラクタ関連の画面上位置計算を行い、描写する関数
int DrawGraphContCameraChar(int cx,int cy,int angle,int GrHandle,int TurnsFlag){

	int x;						//最終決定値
	int CameraX = ch.x-(WIN_X/2);	                //カメラのX座標
	const int FlipX = MAP_X - WIN_X;		//カメラと画面の最大差分

	if( CameraX<0 )				x = cx;		        //もし左端でスクロール不可なら、通常描写
	else if( CameraX>FlipX )	        x = cx - FlipX;		//もし右端でスクロール不可なら、差分描写
	else					x = cx - CameraX;	//スクロール可能範囲内なら、通常差分描写
	
	return DrawRotaGraph( x,cy-120,1.0f,0,GrHandle,TurnsFlag,angle );

}

//背景の画面上位置計算を行い、描写する関数
int DrawGraphContCameraBack(int cx,int cy,int GrHandle,int TurnsFlag){

	int x;
	int CameraX = ch.x-(WIN_X/2);
	const int FlipX = MAP_X - WIN_X;

	if( CameraX<0 )			x = 0;
	else if( CameraX>FlipX )	x = -FlipX;
	else				x = cx - CameraX;

	return DrawGraph( x,cy,GrHandle,TurnsFlag );

}
ただし、これだと以下の添付画像のように、キャラクタが半分はみ出て描写されてしまいます。
画像
画像

これを調整して、うまい具合に描写できるようにコードを追加したいのですが、
ここからどうすればいいのかわかりません。

どなたか、考え方やヒント、サンプルとなるプログラム、もしくは参考サイトでも構いません。
どうかよろしくお願いします。

開発環境:VC++2008EE
ライブラリ:DXライブラリ
OS:Windows7 Professional
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 2D横スクロールアクションのカメラ制御について

#2

投稿記事 by amehirune » 10年前

申し訳ありません。自己解決しました。
キャラクタ画像の横幅を2Yとしたとき、
マップのスクロール対象を左右にそれぞれYずつ拡張すればいいだけの話でした。

コード:

#define CH_X 72

//キャラクタ関連の画面上位置計算を行い、描写する関数
int DrawGraphContCameraChar(int cx,int cy,int angle,int GrHandle,int TurnsFlag){

	int x;									//最終決定値
	int CameraX = ch.x-(WIN_X/2);	//カメラのX座標
	const int FlipX = MAP_X - WIN_X;		//カメラと画面の最大差分

	if( CameraX<-CH_X )				x = cx + CH_X;				//もし左端でスクロール不可なら、通常描写
	else if( CameraX>FlipX+CH_X )	x = cx - ( FlipX + CH_X );	//もし右端でスクロール不可なら、差分描写
	else							x = cx - CameraX;			//スクロール可能範囲内なら、通常差分描写
	
	return DrawRotaGraph( x,cy-120,1.0f,0,GrHandle,TurnsFlag,angle );

}

//背景の画面上位置計算を行い、描写する関数
int DrawGraphContCameraBack(int cx,int cy,int GrHandle,int TurnsFlag){

	int x;
	int CameraX = ch.x-(WIN_X/2);
	const int FlipX = MAP_X - WIN_X;

	if( CameraX<-CH_X )				x = CH_X;
	else if( CameraX>FlipX+CH_X )	x = -FlipX-CH_X;
	else							x = cx - CameraX;

	return DrawGraph( x-CH_X,cy,GrHandle,TurnsFlag );

}
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

閉鎖

“C言語何でも質問掲示板” へ戻る