ページ 11

(タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 14:32
by C.C
こんにちは。今横スクロールゲームを作っているのですが、スクロールを行うと床として置いている画像の位置がずれてしまいます。教えていただけないでしょうか。

コード:

void DrawGameMain(){
	//スクロール座標調整
	b2Vec2 pos = g_stage.hero->GetPosition();
	int hx = (int)(pos.x * WLDSC);
	int hy = (int)(pos.y * WLDSC);
	if(hx - SCROLL_LIMIT < g_stage.screen_x){
		g_stage.screen_x = hx - SCROLL_LIMIT;
	}
	if(640 - SCROLL_LIMIT < hx - g_stage.screen_x){
		g_stage.screen_x = hx + SCROLL_LIMIT - 640;
	}
	if(hy - SCROLL_LIMIT < g_stage.screen_y){
		g_stage.screen_y = hy - SCROLL_LIMIT;
	}
	if(480 - SCROLL_LIMIT < hy - g_stage.screen_y){
		g_stage.screen_y = hy + SCROLL_LIMIT - 480;
	}
	DrawEnemyAndMap();	//地形描画
	
	//衝突チェック
	g_stage.isontheground = false;
	Collision();
	HeroState hstate = HERO_STANDING;
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	//主人公の位置と移動ベクトル
	b2Vec2 vec = g_stage.hero->GetLinearVelocity();
	float angle = g_stage.hero->GetAngle();
	//キーチェック
	if(g_stage.isontheground == true){
		//左右移動
		if(key & PAD_INPUT_LEFT){
			vec.x = -PHS(120.0f);
			g_stage.hero->SetLinearVelocity(vec);
			hstate = HERO_RUNNING;
			g_stage.isheroleft = true;
		}
		if(key & PAD_INPUT_RIGHT){
			vec.x = PHS(120.0f);
			g_stage.hero->SetLinearVelocity(vec);
			hstate = HERO_RUNNING;
			g_stage.isheroleft = false;
		}
		//ジャンプ
		if(IsBKeyTrigger(key) == true){
			vec.x = 0;
			vec.y = -62.0f;
			g_stage.hero->ApplyLinearImpulse(vec, pos);
			hstate = HERO_JUMP;
			g_stage.isontheground = false;
		}
	}
	//ジャンプ姿勢へ
	if(g_stage.isontheground == false)	hstate = HERO_JUMP;
	//転倒対策
	if(fabs(angle) > 0.2f)	g_stage.hero->SetAngularVelocity(-angle*2);
	
	DrawHero(hstate);	//主人公描画
	
	if(IsAKeyTrigger(key) == true)	GoGameOver();
}

コード:

b2Body* CreateBox(float x, float y, float w, float h, float angle, bool dynamic){
	//ボディ定義
	b2BodyDef bodyDef;
	if(dynamic)	bodyDef.type = b2_dynamicBody;	//動的ボディ
	else bodyDef.type = b2_staticBody;			//静的ボディ
	bodyDef.position.Set(x, y);
	bodyDef.angle = angle;
	//ボディ作成
	b2Body* body = g_world.CreateBody(&bodyDef);
	//シェイプ作成
	b2PolygonShape staticBox;
	staticBox.SetAsBox(w, h);
	//フィクスチャ定義
	b2FixtureDef fixtureDef;
	fixtureDef.shape = &staticBox;
	fixtureDef.density = 4.0f;		//密度
	fixtureDef.restitution = 0.2f;	//反発力
	body->CreateFixture(&fixtureDef);
	return body;
}

コード:

//マップの読み込み
int LoadMapData(char *filepath){
	int f;				//ファイルハンドル
	char buf[1024];		//テキスト読み込みバッファ

	f = FileRead_open(filepath);
	if(f == 0)	return -1;		//読み込みエラー

	//マップサイズと主人公初期位置読み込み
	if(FileRead_gets(buf, 1023, f) == -1)	return -1;
	float w, h, sx, sy;
	sscanf_s(buf, "%f, %f, %f, %f", &w, &h, &sx, &sy);
	g_stage.mapsize_w = w;
	g_stage.mapsize_h = h;

	//主人公キャラクター
	g_stage.hero = CreateBox(PHS(sx), PHS(sy), PHS(23), PHS(48), 0, true);

	//地形オブジェクトの読み込み
	if(FileRead_gets(buf, 1023, f) == -1)	return -1;
	int imax;
	sscanf_s(buf, "%d", &imax);	//行数取得
	float x, y, angle;
	int id;
	for(int i = 0; i < imax; i++){
		if(FileRead_gets(buf, 1023, f) == -1)	return -1;
		sscanf_s(buf, "%f, %f, %f, %f, %f, %d", &x, &y, &w, &h, &angle, &id);
		//ボディ作成
		Character ch;
		ch.body = CreateBox(PHS(x), PHS(y), PHS(w / 2), PHS(h / 2), angle, false);
		if((int)w == 48)	ch.ID = WALL_48;
		if((int)w == 192)	ch.ID = WALL_192;
		if((int)w == 284)	ch.ID = WALL_284;
		if((int)w == 568)	ch.ID = WALL_568;
		if(id == 1)	ch.ID = GOAL_FLAG;
		ch.used = true;
		g_stage.wall[g_stage.num_mapchara] = ch;
		g_stage.num_mapchara++;
	}

	FileRead_close(f);
	return 0;
}
//主人公の描画
void DrawHero(int hstate){
	b2Vec2 pos = g_stage.hero->GetPosition();
	float angle = g_stage.hero->GetAngle();
	//キャラクター描画
	int animpat = (g_lasttime / (1000 / 12)) % 4;
	switch(hstate){
		case HERO_STANDING:
			DrawRotaGraph(VIWX(pos.x), VIWY(pos.y), 1, angle, g_images.hero[0], TRUE, g_stage.isheroleft);
			break;
		case HERO_RUNNING:
			DrawRotaGraph(VIWX(pos.x), VIWY(pos.y), 1, angle, g_images.hero[1 + animpat], TRUE, g_stage.isheroleft);
			break;
		case HERO_JUMP:
			DrawRotaGraph(VIWX(pos.x), VIWY(pos.y), 1, angle, g_images.hero[5], TRUE, g_stage.isheroleft);
			break;
	}
}
//地形と雪だまの描画
void DrawEnemyAndMap(){
	//地形の描画
	for(int i = 0; i < g_stage.num_mapchara; i++){
		if(g_stage.wall[i].used == false)	continue;
		b2Vec2 pos = g_stage.wall[i].body->GetPosition();
		float angle = g_stage.wall[i].body->GetAngle();
		int id = g_stage.wall[i].ID;
		DrawRotaGraph(VIWX(pos.x), VIWX(pos.y), 1, angle, g_images.wall[id], TRUE);
	}
}

Re: こんにちは。

Posted: 2012年5月22日(火) 14:46
by softya(ソフト屋)
やたらグローバル変数で情報が受け渡されているので追いかけるのが困難ですね。
あと構造体他メソッド系の情報もないようですし。

次のことをお願いします。
(1)データ付きのソース全部の公開。ユーザー登録してのzip添付をおすすめします。ただし、プロジェクトのncb等の巨大バイナリデータは不要です。
ユーザー登録は画面下部にあります。
(2)「スクロールを行うと床として置いている画像の位置がずれてしまいます。」の部分の詳細な説明をお願いします。画像があると更に良いです。DrawEnemyAndMap()での描画でしょうか?
(3) (2)の続きとして描画している部分の仕組みの詳細な説明が欲しいです。

【補足】
タイトルが内容を表していないので修正しておきます。

Re: 横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 15:02
by C.C
すみません。ユーザ登録できませんでした。
時間を空けてもう一度試してみます

Re: 横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 15:04
by softya(ソフト屋)
C.C さんが書きました:すみません。ユーザ登録できませんでした。
時間を空けてもう一度試してみます
登録でどんな問題がありましたか?
時間で解決する問題は少ないと思いますが。

Re: 横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 15:11
by C.C
softya(ソフト屋) さんが書きました:
C.C さんが書きました:すみません。ユーザ登録できませんでした。
時間を空けてもう一度試してみます
登録でどんな問題がありましたか?
時間で解決する問題は少ないと思いますが。
最後のコード入力の失敗を繰り返したために「時間を空けてもう一度入力してください。」と表示されました

Re: 横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 15:24
by softya(ソフト屋)
C.C さんが書きました:
softya(ソフト屋) さんが書きました:
C.C さんが書きました:すみません。ユーザ登録できませんでした。
時間を空けてもう一度試してみます
登録でどんな問題がありましたか?
時間で解決する問題は少ないと思いますが。
最後のコード入力の失敗を繰り返したために「時間を空けてもう一度入力してください。」と表示されました
認証コードですね。
私は、どのぐらい時間を空ければ良いかは把握しておりませんので、もし中々認証できないようならまた書き込んで頂けますか?その時はDixq(管理人)さんと相談します。

Re: 横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 15:28
by C.C
わかりました。ありがとうございます

Re: 横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 15:59
by C.C
登録できました。よろしくお願いします

[削除]添付ファイルはライセンス的に問題がありそうなので削除しました。 by softya(ソフト屋)

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 16:18
by softya(ソフト屋)
(2)の問題は分かりましたが原因はソースコードがないので不明ですね。
それと、これって『14歳からはじめる C言語わくわくゲームプログラミング教室』のものですよね?
ソースコードはまったく違うなら添付してもらって良いですが同じなら不可です。
画像に関してはマズイと思いますので、とりあえず添付を削除します。

[補足]
No: 2で書いた(1)の必要十分なソースコードと(3)の解説をお願いします。

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 16:53
by C.C
すみません。ソースはまったく同じです。本と同じようにならなかったので質問をさせていただきました。
(3)はウィンドウのサイズを超えるとスクロールはするのですが、それと同時に床の画像も上下に動いてしまいます。
説明が下手ですみません

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 17:11
by softya(ソフト屋)
C.C さんが書きました:すみません。ソースはまったく同じです。本と同じようにならなかったので質問をさせていただきました。
(3)はウィンドウのサイズを超えるとスクロールはするのですが、それと同時に床の画像も上下に動いてしまいます。
説明が下手ですみません
わくわくのソースコードはダウンロード出来るので比較してみてください(WinMeageなど)。
もし、実力を付けるために自力で直したいのならHeroの座標がスクロールに反映される仕組みを説明してみてください。
本の内容をどのぐらい理解しているかが鍵となります。

【補足】
私としてはWLDSCやSCROLL_LIMITを値を疑っています。

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年5月22日(火) 19:54
by C.C
softya(ソフト屋) さんが書きました:
C.C さんが書きました:すみません。ソースはまったく同じです。本と同じようにならなかったので質問をさせていただきました。
(3)はウィンドウのサイズを超えるとスクロールはするのですが、それと同時に床の画像も上下に動いてしまいます。
説明が下手ですみません
わくわくのソースコードはダウンロード出来るので比較してみてください(WinMeageなど)。
もし、実力を付けるために自力で直したいのならHeroの座標がスクロールに反映される仕組みを説明してみてください。
本の内容をどのぐらい理解しているかが鍵となります。

【補足】
私としてはWLDSCやSCROLL_LIMITを値を疑っています。
ありがとうございます。一晩考えて見ます

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年6月28日(木) 09:56
by C.C
返事が遅れて申し訳ありません。
解決できました。

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年6月28日(木) 10:34
by asd
一晩考えた後、結局どのようにして解決したのでしょうか?
解決しましたで終わりにせず、その方法まできちんと明記しておいてください。
解決しましたで終わってしまうと、同じ内容で困っている方が参照したときに困ってしまいます。

以下、フォーラムルールより引用
http://dixq.net/board/board.html
---
また、解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
同じ事で困っている人の為に過去ログに有用な情報を残すようお願いします。

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年6月28日(木) 11:48
by C.C
すみません。時間がなくて正解のソースコードを丸々コピーしました。

Re: (タイトル修正)横スクロールゲームで床の画像の位置がずれる。

Posted: 2012年6月28日(木) 14:39
by asd
C.C さんが書きました:すみません。時間がなくて正解のソースコードを丸々コピーしました。
最初質問したときは丸々コピーではなく手打ちで対応されていたということでしょうか。
正解のソースと自分が打ち込んだソースの差分を比較するツールを使えば何が違っていたのかが一目瞭然かと思います。

正解のソースがあってそれを丸々コピーすれば動作はするようになるかもしれませんが、
結局何が問題でどう解決する必要があったのか不明なままになるので、今後同じような問題が起きた場合に困ることになります。
#正解のソースがなかった場合困りますよね

そういう意味でも「原因は分からないけど何となく動いた」という解決方法は避けたほうがよいです。
#結局困るのは自分ですし