2D画像の描画とキャラ移動時の衝突判定について改

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シュヨウ

2D画像の描画とキャラ移動時の衝突判定について改

#1

投稿記事 by シュヨウ » 8年前

先程誤って質問を途中送信してしまったので改めて送信し直しました、申し訳ございません。

独学で2Dゲーム制作でプログラミングを学んでいる者なのですが、現在ドットイートゲームを作成中に背景とキャラクターを描画したのですが描画背景に対しキャラクターの描画位置がずれており、床と床の中間辺りにキャラが描画され、キャラを移動させたとき左側の壁には陥没し、右側の壁には間隔が空くように描画されます。

自分としてはキャラを背景マップの床に重なり、壁に隣接するように動くように描画したいと考えています。
ソースは以下のように記述してます。

環境はVisualStudio2013のC++です。
知識としては本サイトで解説されていたC++の基礎的な部分を理解しているつもりですが、何か至らない点もあるかもしれません。
よろしければ知識をお貸しいただければ幸いです。

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i<256; i++){
		if (tmpKey[i] != 0){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int player,chip[8];
int Handle01;//キャラクター描画差分01
int Handle02;//キャラクター描画差分02
int Handle03;//キャラクター描画差分03
int Handle04;//キャラクター描画差分04
int px =10, py = 10;//キャラクター初期位置
int aitem = 0;

//ステージマップ
int map[15][20] = {
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
	{ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2 },
	{ 2, 4, 4, 5, 3, 4, 4, 3, 3, 4, 4, 3, 3, 4, 4, 3, 5, 4, 4, 2 },
	{ 2, 4, 3, 3, 1, 4, 4, 3, 4, 4, 4, 4, 3, 4, 4, 1, 3, 3, 4, 2 },
	{ 2, 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 4, 3, 4, 4, 4, 4, 3, 4, 2 },
	{ 2, 4, 3, 4, 4, 3, 3, 3, 5, 4, 4, 5, 3, 3, 3, 4, 4, 3, 4, 2 },
	{ 2, 4, 3, 4, 4, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 4, 4, 3, 4, 2 },
	{ 2, 4, 1, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 4, 4, 4, 4, 1, 4, 2 },
	{ 2, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 2 },
	{ 2, 4, 4, 4, 3, 4, 4, 2, 4, 4, 4, 4, 2, 4, 4, 3, 4, 4, 4, 2 },
	{ 2, 4, 4, 4, 3, 4, 4, 2, 5, 4, 4, 5, 2, 4, 4, 3, 4, 4, 4, 2 },
	{ 2, 4, 3, 4, 1, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 1, 4, 3, 4, 2 },
	{ 2, 4, 3, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 4, 4, 4, 4, 3, 4, 2 },
	{ 2, 5, 3, 4, 4, 3, 3, 4, 5, 4, 4, 5, 4, 3, 3, 4, 4, 3, 5, 2 },
	{ 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0 },
};

// キーの入力移動
void gpCalc(){

	int kx =px, ky=py;
	//キーの入力操作
	if (Key[KEY_INPUT_RIGHT] >= 1){ // 右キーが押されていたら
		player = Handle01;
		kx++;                       // 右へ移動
	}
	if (Key[KEY_INPUT_DOWN] >= 1){ // 下キーが押されていたら
		player = Handle02;
		ky++;                       // 下へ移動
	}
	if (Key[KEY_INPUT_LEFT] >= 1){ // 左キーが押されていたら
		player = Handle03;
		kx--;                       // 左へ移動
	}
	if (Key[KEY_INPUT_UP] >= 1){ // 上キーが押されていたら
		player = Handle04;
		ky--;                       // 上へ移動
	}
       //進行不能箇所の衝突判定
	if (map[ky][kx] != 1 && map[ky][kx] != 2 && map[ky][kx] != 3 && map[ky][kx] != 6) {
		px = kx;
		py = ky;
	}
       //マップ上のアイテム所得
	if (map[py][px] == 5) {
		map[py][px] = 4;
		aitem += 1;
	}

}

//キャラ描画
void gpDraw(){
	DrawRotaGraph(px*32, py*32, 1.0, 0.0, player, TRUE);
	DrawFormatString(0, 0, GetColor(255, 255, 255), "SCORE:%d", aitem);
}
//マップ表示
void gMap(){
	for (int y = 0; y < 15; y++) {
		for (int x = 0; x < 20; x++) {
			DrawGraph(x * 32, y * 32, chip[map[y][x]], FALSE);
			//ステージクリア処理
			if (aitem >= 10)
			{
				//アイテム一定数入手で扉解放
				map[0][9] = 7;
				map[0][10] = 7;
			}
		}
	}
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	SetGraphMode(640, 480, 32);

	Handle01 = LoadGraph("Graphics/主人公_右.png"); // 画像をロード
	Handle02 = LoadGraph("Graphics/主人公_前.png"); // 画像をロード
	Handle03 = LoadGraph("Graphics/主人公_左.png"); // 画像をロード
	Handle04 = LoadGraph("Graphics/主人公_後.png"); // 画像をロード
       
       //背景マップ画像の読込
	LoadDivGraph("Graphics/45_libraly-map.png", 8, 4, 2, 32, 32, chip);

	player = Handle02;//表示キャラ_初期状態

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0){

		gpCalc();

		gMap();

		gpDraw();

		ScreenFlip();
		WaitTimer(100);
	}

	DxLib_End();
	return 0;
}

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2D画像の描画とキャラ移動時の衝突判定について改

#2

投稿記事 by usao » 8年前

キャラクタの描画処理は 82行目の

> DrawRotaGraph(px*32, py*32, 1.0, 0.0, player, TRUE);

かと思いますが,座標の指定は正しいのでしょうか?
(この関数は「中心」を指定するみたいですよ.)

シュヨウ

Re: 2D画像の描画とキャラ移動時の衝突判定について改

#3

投稿記事 by シュヨウ » 8年前

ご返事ありがとうございます。

自分としましては

> DrawRotaGraph(px*32, py*32, 1.0, 0.0, player, TRUE);

の部分でキャラの出現開始位置をマップの中央辺りから始めるつもりで上述のように記述しました。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2D画像の描画とキャラ移動時の衝突判定について改

#4

投稿記事 by usao » 8年前

えっと,もう少し詳細に書くと…

マップの描画は89行目の
> DrawGraph(x * 32, y * 32, chip[map[y][x]], FALSE);

キャラクタの描画処理は 82行目の
> DrawRotaGraph(px*32, py*32, 1.0, 0.0, player, TRUE);


軽くググった感じ,

・前者の関数DrawGraphは,最初の2つの引数に 描画対象領域の左上の座標 を指定
・後者の関数DrawRotaGraphでは,最初の2つの引数に 描画対象領域の中心の座標 を指定

という形で,描画場所の指定の仕方が異なっているようですよ.

提示コードでは
マップの1マスの描画領域の左上座標が32の倍数になっていて,
「キャラクタの描画先の中心座標」も32の倍数になっているので,
キャラクタが4つのマスにまたがる(キャラクタの中心が,マスの角にくる)形で描画されるのではないしょうか?

#キャラクタの描画も DrawGraph を使うのではダメなんでしょうか?

シュヨウ

Re: 2D画像の描画とキャラ移動時の衝突判定について改

#5

投稿記事 by シュヨウ » 8年前

詳細なご説明、本当にありがとうございます。

いただいたご意見を参考にDrawGraphに変更したところ、無事希望通りの動作になりました。

自分の理解力の至らなかったばかりにお手数をお掛けしてしまい、申し訳ありませんでした。
お陰様で自分になりにどうして、そうなったのかもわかった気がします。

重ねてありがとうございました。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 2D画像の描画とキャラ移動時の衝突判定について改

#6

投稿記事 by みけCAT » 8年前

シュヨウ さんが書きました:先程誤って質問を途中送信してしまったので改めて送信し直しました、申し訳ございません。
2D画像の描画とキャラ移動時の衝突判定についてのことでしょうか?
わかりにくいので「誤って送信してしまった」方にも書いておいてほしかったです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

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