マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C.C
記事: 64
登録日時: 13年前

マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#1

投稿記事 by C.C » 13年前

こんにちは。
マップを読み込んで表示したいのですが、表示がされません。見ていただけないでしょうか
よろしくお願いします

コード:

#include "DxLib.h"
#include "practice.h"
#include "Others.h"

Images img;
StageInfo stage;
//グローバル変数
GameState gamestate = GAME_TITLE;
int ghandle[6];
//時間計測用関数
int g_lasttime = 0;		//直前の計測時刻
float g_frametime = 0;	//1フレームにかかった時間
float x = 0, y = 0;

int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC){
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//DXライブラリ初期化
	if(DxLib_Init() == -1) return -1;
	
	GameImageLoad();
	
	SetDrawScreen(DX_SCREEN_BACK);
	g_lasttime = GetNowCount() & INT_MAX;	//現在時刻の記録
	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
		//1ループにかかった時間を計測
		int curtime = GetNowCount() & INT_MAX;
		g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
		g_lasttime = curtime;
		
		ClsDrawScreen();
		//各画面の描画
		switch(gamestate){
		case GAME_TITLE:
			DrawGameTitle();
			break;
		case GAME_MAIN:
			DrawGameMain();
			break;
		case GAME_CLEAR:
			DrawGameClear();
			break;
		case GAME_OVER:
			DrawGameOver();
			break;
		}
		ScreenFlip();
	}
	//DXライブラリの終了処理
	DxLib_End();
	return 0;
}
int GameImageLoad(){
	//プレーヤー
	if(LoadDivGraph("media\\chara_hero_l.png", 6, 6, 1, 46, 96, ghandle) == -1)	return -1;
	//タイトル画面
	img.logo[0] = LoadGraph("media\\titleback.png");
	if(img.logo[0] == -1)	return -1;
	img.logo[1] = LoadGraph("media\\avalanche.png");
	if(img.logo[1] == -1)	return -1;
	//ゲームオーバー
	img.logo[2] = LoadGraph("media\\gameover.png");
	if(img.logo[2] == -1)	return -1;
	//壁
	img.wall[WALL_568] = LoadGraph("media\\wall_s.png");
	if(img.wall[WALL_568] == -1) return -1;
	img.wall[WALL_48] = DerivationGraph(0, 0, 48, 48, img.wall[WALL_568]);
	img.wall[WALL_192] = DerivationGraph(0, 0, 192, 48, img.wall[WALL_568]);
	img.wall[WALL_284] = DerivationGraph(0, 0, 284, 48, img.wall[WALL_568]);
	//ゴールの旗
	img.wall[GOAL_FLAG] = LoadGraph("media\\goalflag.png");
	if(img.wall[GOAL_FLAG] == -1) return -1;
	//マップ
	if(GameMapLoad("media\\stage01.txt") == -1){
		MessageBox(NULL, "マップデータ読み込み失敗", "DXライブラリ", MB_OK);
	}
	
	//読み込み成功
	return 1;
}
//タイトル画面描画
void GoGameTitle(){
	gamestate = GAME_TITLE;
}
void DrawGameTitle(){
	int Black = GetColor(0, 0, 0);	//黒色の値を取得
	//画像表示
	DrawGraph(0, 0, img.logo[0], FALSE);
	DrawGraph(20, 80, img.logo[1], TRUE);
	//テキスト表示
	DrawString(100, 340, "Zキーでゲームスタート" , Black);	//文字列表示
	DrawString(100, 376, "カーソルキーで左右移動" , Black);	//文字列表示
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	if(IsAKeyTrigger(key) == true) GoGameMain();
}
//ゲーム本編描画
void GoGameMain(){
	gamestate = GAME_MAIN;
}	
void DrawGameMain(){
	int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
	float mv = 80.0f * g_frametime;	//移動量計算
	if(key & PAD_INPUT_RIGHT){
		x += mv;
		stage.isheroleft = false;
	}
	if(key & PAD_INPUT_LEFT){
		x -= mv;
		stage.isheroleft = true;
	}
	if(key == 0){
		//プレーヤー
		DrawRotaGraph((int)x, (int)y, 1, 0, ghandle[0], TRUE, stage.isheroleft);
	}
	else {
		int animpat = (g_lasttime / (1000 / 12)) % 4;
		DrawRotaGraph((int)x, (int)y, 1, 0, ghandle[1 + animpat], TRUE, stage.isheroleft);
	}
	//Zキーを押すとゲームオーバー画面へ
	if(IsAKeyTrigger(key) == true)	GoGameOver();
}
//マップの読み込み
int GameMapLoad(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);
	stage.mapsize_w = w;
	stage.mapsize_h = h;
	
	//主人公キャラクター
	DrawRotaGraph((int)sx, (int)sy, 1, 0, ghandle[0], TRUE, stage.isheroleft);
	
	//地形オブジェクト読み込み
	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;
		
		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;
		stage.wall[stage.num_mapchara] = ch;
		stage.num_mapchara++;		
	}
	
	FileRead_close(f);
	return 0;
}

//ゲームクリア画面描画
void GoGameClear(){
	gamestate = GAME_CLEAR;
}
void DrawGameClear(){
}
//ゲームオーバー画面描画
void GoGameOver(){
	gamestate = GAME_OVER;
	stage.timerstart = g_lasttime;
}
void DrawGameOver(){
	DrawGraph(20, 120, img.logo[2], TRUE);
	//5秒経ったらタイトル画面へ
	if(g_lasttime - stage.timerstart > 2000)	GoGameTitle();
}
	
最後に編集したユーザー C.C on 2012年6月28日(木) 10:40 [ 編集 1 回目 ]

アバター
asd
記事: 319
登録日時: 14年前

Re: C.C

#2

投稿記事 by asd » 13年前

内容については触れていません、すみません。

前のスレッドでsoftya(ソフト屋)さんからタイトルが内容を表していないので修正しましたと
修正指摘がされているので、内容が推測しにくいタイトルをつけるのはやめませんか?

http://dixq.net/forum/viewtopic.php?f=3&t=10735

また、前のスレッドでは一晩考えますの後解決しましたで終わっていますが、どうやって解決したのかをきちんと書いておくとよいと思います。
Advanced Supporting Developer
無理やりこじつけ(ぉ

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#3

投稿記事 by softya(ソフト屋) » 13年前

タイトル修正しました。あとcodeタグで種類が違ったので変更しておきました。 c#→cpp
これからソースを見てみますが、今のままだと分からないのでマップデータのサンプルを掲示して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#4

投稿記事 by C.C » 13年前

softya(ソフト屋) さんが書きました:タイトル修正しました。あとcodeタグで種類が違ったので変更しておきました。 c#→cpp
これからソースを見てみますが、今のままだと分からないのでマップデータのサンプルを掲示して下さい。
毎回ご迷惑おかけして申し訳ありません。
添付ファイル
stage01.txt
(121 バイト) ダウンロード数: 184 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#5

投稿記事 by softya(ソフト屋) » 13年前

ざっと見て良くない点ですが。
(1)GameMapLoad()がGameImageLoad()から呼び出されている。関数の名前から推測できる機能を超えた行為です。WinMain()から呼び出すべきでしょう。
(2)GameMapLoad()内でDrawRotaGraph()をしている理由が不明。
あとヘッダや他のソースファイルとかが分からないので色々と分かりませんが、最大の問題はマップ表示している所が見当たらないように見えることです。
何処で表示しているんでしょうか?

※ 前回の質問トピックに関しての解決後のコードもお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#6

投稿記事 by C.C » 13年前

DrawRotaGraphで表示ができると思っていたのですが違うのですか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#7

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:DrawRotaGraphで表示ができると思っていたのですが違うのですか
ソースコードの何処で表示しているつもりでしょうか?
C.Cさんの考えるマップ表示しているDrawRotaGraph()は何処にあるか正確に書いて下さい。
あと何のためのRotaなのでしょうか? DrawGraphではなくDrawRotaGraphを使っている理由を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#8

投稿記事 by C.C » 13年前

softya(ソフト屋) さんが書きました:
C.C さんが書きました:DrawRotaGraphで表示ができると思っていたのですが違うのですか
ソースコードの何処で表示しているつもりでしょうか?
C.Cさんの考えるマップ表示しているDrawRotaGraph()は何処にあるか正確に書いて下さい。
あと何のためのRotaなのでしょうか? DrawGraphではなくDrawRotaGraphを使っている理由を教えて下さい。
GameMapLoad関数で読み込みと表示をやろうと思い、そこで使っています。
そしてDrawRotaGraph()である理由は角度をつけて表示ができると考えたためです

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#9

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:
softya(ソフト屋) さんが書きました:
C.C さんが書きました:DrawRotaGraphで表示ができると思っていたのですが違うのですか
ソースコードの何処で表示しているつもりでしょうか?
C.Cさんの考えるマップ表示しているDrawRotaGraph()は何処にあるか正確に書いて下さい。
あと何のためのRotaなのでしょうか? DrawGraphではなくDrawRotaGraphを使っている理由を教えて下さい。
GameMapLoad関数で読み込みと表示をやろうと思い、そこで使っています。
そしてDrawRotaGraph()である理由は角度をつけて表示ができると考えたためです
それは、関数名からすると機能違いですね。そういう事は避けましょう。
あと主人公キャラクターとご自分でコメント書いてますが、そのとおり主人公キャラクターの表示です。どこかのコピペでしょうか?
つまり、マップ表示が見当たりません。
表示はWinMainにあるProcessMessageのwhileループ内に呼び出される関数でないと表示されませんのでプログラムの流れをちゃんと理解して下さいね。
ちなみに、GameMapLoad関数をwhileループ内に移動していけませんよ。
前回のトピックでもコピーして解決したみたいですがコピペばかりでは理解が進みませんので、どこかでニッチもサッチも行かなくなりますよ。
一行一行意味を理解して記述するようにしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#10

投稿記事 by C.C » 13年前

それは、関数名からすると機能違いですね。そういう事は避けましょう。
あと主人公キャラクターとご自分でコメント書いてますが、そのとおり主人公キャラクターの表示です。どこかのコピペでしょうか?
つまり、マップ表示が見当たりません。
表示はWinMainにあるProcessMessageのwhileループ内に呼び出される関数でないと表示されませんのでプログラムの流れをちゃんと理解して下さいね。
ちなみに、GameMapLoad関数をwhileループ内に移動していけませんよ。
前回のトピックでもコピーして解決したみたいですがコピペばかりでは理解が進みませんので、どこかでニッチもサッチも行かなくなりますよ。
一行一行意味を理解して記述するようにしましょう。
マップ表示というのがよくわかりません。
GameMapLoad関数内のsscanf_sでtxtファイルの座標を取得し、その座標にDrawRotaGraph()でキャラクターや壁、床などを表示するだけでマップの表示は完了と考えていたのですが表示用の関数が新たに必要だということですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#11

投稿記事 by softya(ソフト屋) » 13年前

基本の基本なのですがDxLibは毎フレーム画像を表示する前提で作られたライブラリで、1フレームは通常1/60秒です。
つまり、常に表示していないと画面から消えてしまいます。
その表示のためのループがWinMainにあるProcessMessageの書かれたwhileループです。このループ中から呼び出されない処理は表示出来ません。

ただ、今のところ壁、床などを表示する処理は何処にも見当たらないわけですが。

>表示用の関数が新たに必要だということですか?
絶対に必要です。
ゲームの処理は基本的に、初期化(ロード含む)、更新(移動等)、表示で構成されますが、素直に作ればそれぞれ関数が必要なので3つの関数が出来上がります。
さらに主人公、敵、マップを処理するなら3種類x3つの関数で合計9つ関数を作るのが一番メンテしやすくバグの少なくなる分り易い作り方です。

ここのコンテンツに分かりやすい説明があるので熟読・理解してみて下さい。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/
ゲームを作るのなら避けて通れない知識がたくさん書かれています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。


C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#13

投稿記事 by C.C » 13年前

表示用の関数GameMapDraw()を作ったのですがGameMapLoad関数で取得した座標を使って表示したくて考えたのですが、
GetPosX(int x), GetPosY(int y)関数を作り、GameMapLoadから座標を取得してどの関数でも使えるようにしたいです。正しいでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#14

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:表示用の関数GameMapDraw()を作ったのですがGameMapLoad関数で取得した座標を使って表示したくて考えたのですが、
GetPosX(int x), GetPosY(int y)関数を作り、GameMapLoadから座標を取得してどの関数でも使えるようにしたいです。正しいでしょうか?
(1)マップ処理の関数を集めたマップ関数モジュールファイルを作って、その中にGameMapLoad()関数やGameMapDraw()関数を入れてそのGet関数も入れるなら良いと思います。
名前から何の関数かわかりませんので、GetMapPosX(int x), GetMapPosY(int y)が良いでしょうが引数がxだと何の値が戻るんでしょうか?
これだと引数の設計が変だと思いますよ。関数の入出力をもう一度ちゃんと考えて設計してみてください。
マップのデータは、もっと複雑じゃないですか?

(2)もう一つの関数を設計するポイントとしてGameMapLoad()で取得したデータはどの様に保存するか考えないと行けません。
データの参照できる範囲はバグを防止するためできるだけ限定的であるのが望ましいからです。

より安全な変数の参照範囲 → 1.ローカル変数 > 2.引数・戻り値 > 3.ファイル内グローバル変数 > 4.グローバル変数

最良は1.ローカル変数ですが外部から一切参照できません。
関数内に関数は作れませんからデータを取り出すことも叶いませんので保存するデータは基本に2.から4.の範囲で選ぶことになります。
そして何処に保存どうやって保存しますか? 最初に見せてもらったコードは一切この事が考慮されていませんでした。

(1)と(2)を検討して、それぞれの結論を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#15

投稿記事 by C.C » 13年前

(1)マップ処理の関数を集めたマップ関数モジュールファイルを作って、その中にGameMapLoad()関数やGameMapDraw()関数を入れてそのGet関数も入れるなら良いと思います。
名前から何の関数かわかりませんので、GetMapPosX(int x), GetMapPosY(int y)が良いでしょうが引数がxだと何の値が戻るんでしょうか?
これだと引数の設計が変だと思いますよ。関数の入出力をもう一度ちゃんと考えて設計してみてください。
マップのデータは、もっと複雑じゃないですか?

(2)もう一つの関数を設計するポイントとしてGameMapLoad()で取得したデータはどの様に保存するか考えないと行けません。
データの参照できる範囲はバグを防止するためできるだけ限定的であるのが望ましいからです。

より安全な変数の参照範囲 → 1.ローカル変数 > 2.引数・戻り値 > 3.ファイル内グローバル変数 > 4.グローバル変数

最良は1.ローカル変数ですが外部から一切参照できません。
関数内に関数は作れませんからデータを取り出すことも叶いませんので保存するデータは基本に2.から4.の範囲で選ぶことになります。
そして何処に保存どうやって保存しますか? 最初に見せてもらったコードは一切この事が考慮されていませんでした。

(1)と(2)を検討して、それぞれの結論を教えて下さい。
すみません。自分に理解力が無いみたいで
関数モジュールファイルとは何ですか?調べましたがよくわからないです。GetPosX(int x)関数での戻り値を最初に貼り付けたソースの13行目のfloat x, yにしたときfloat x, yに値が代入されているということでいいんでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#16

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:
(1)マップ処理の関数を集めたマップ関数モジュールファイルを作って、その中にGameMapLoad()関数やGameMapDraw()関数を入れてそのGet関数も入れるなら良いと思います。
名前から何の関数かわかりませんので、GetMapPosX(int x), GetMapPosY(int y)が良いでしょうが引数がxだと何の値が戻るんでしょうか?
これだと引数の設計が変だと思いますよ。関数の入出力をもう一度ちゃんと考えて設計してみてください。
マップのデータは、もっと複雑じゃないですか?

(2)もう一つの関数を設計するポイントとしてGameMapLoad()で取得したデータはどの様に保存するか考えないと行けません。
データの参照できる範囲はバグを防止するためできるだけ限定的であるのが望ましいからです。

より安全な変数の参照範囲 → 1.ローカル変数 > 2.引数・戻り値 > 3.ファイル内グローバル変数 > 4.グローバル変数

最良は1.ローカル変数ですが外部から一切参照できません。
関数内に関数は作れませんからデータを取り出すことも叶いませんので保存するデータは基本に2.から4.の範囲で選ぶことになります。
そして何処に保存どうやって保存しますか? 最初に見せてもらったコードは一切この事が考慮されていませんでした。

(1)と(2)を検討して、それぞれの結論を教えて下さい。
すみません。自分に理解力が無いみたいで
関数モジュールファイルとは何ですか?調べましたがよくわからないです。GetPosX(int x)関数での戻り値を最初に貼り付けたソースの13行目のfloat x, yにしたときfloat x, yに値が代入されているということでいいんでしょうか
ちょっと言葉が分かりづらかったですね。
関数モジュールファイル = 1つの機能の関数群で構成されたソースファイルです。
ここでいえばMapに関わる関数しか入っていないソースファイルということになります。

>GetPosX(int x)関数での戻り値を最初に貼り付けたソースの13行目のfloat x, yにしたときfloat x, yに値が代入されているということでいいんでしょうか

こちらが逆にわからないです。
GetPosX()関数本体と関数の呼び出しの例を書いてみて下さい。[少し補正]
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#17

投稿記事 by C.C » 13年前

おはようございます。
float x, yにsscanf_s(buf, "%f, %f, %f, %f", &w, &h, &sx, &sy);で取得したsx, syをGetPosX, GetPosY関数に送ります。
GetPosX(sx), GetPosY(sy)
そしてGetPosX, GetPosYの戻り値をfloat x, yにします。
GetPosX(int x) return sx;
GetPosY(int y) return sy;
ですのでfloat x, yにsx, syの値が代入され、どの関数でも使えるようになるといいなと考えています
モジュールファイルとはcppファイルやhファイルのことですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#18

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:おはようございます。
float x, yにsscanf_s(buf, "%f, %f, %f, %f", &w, &h, &sx, &sy);で取得したsx, syをGetPosX, GetPosY関数に送ります。
GetPosX(sx), GetPosY(sy)
そしてGetPosX, GetPosYの戻り値をfloat x, yにします。
GetPosX(int x) return sx;
GetPosY(int y) return sy;
ですのでfloat x, yにsx, syの値が代入され、どの関数でも使えるようになるといいなと考えています
おはようございます。 疑問に番号を振ったので1つ1つお応え下さい。
C言語の文法として実に無理な設計が見受けられます。

(疑問1)
GetPosX(sx)
で送ると言うことでがGetPosXでは送られたものを何処に保存するのでしょうか?

(疑問2)
あと宣言でGetPosX(int x) だということだとfloat→intの型変換で情報が失われます。これは構わないのですか?

(疑問3)
GetPosX(int x) return sx;
が関数の定義だとすると、xは使われずsxは何処か不思議なところから参照しています。
sxは何処から来たのでしょうか?

[現在の設計のイメージ化したもの]
入力:sx
呼び出し GetPosX(sx);

GetPosX(int x) → xの保存先なし?

戻り値:sx?

(提案1)
データの流れを考えて設計しましょう。
ポイントはsx、syを保存してsx,syを参照できる関数を作ることですよね?
1つの関数で作るのは無理だと思います。保存と参照は別関数で考えてみて下さい。

(疑問4)
sxとsyしか保存しなくて良いのでしょうか?

(疑問5)
マップは複数種類あるのに区別の方法が無いですが、sx,syはそれぞれ1つしか値はないのですか?
WALL_48からWALL_568まであるみたいですよ。

C.C さんが書きました: モジュールファイルとはcppファイルやhファイルのことですか?
cppとhで1セットの名前がついた物という事ですね。
私見ですがGameMapDraw()やGameMapLoad()関数ならGameMap.cpp/GameMap.hで定義されているのが良いかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#19

投稿記事 by C.C » 13年前

(疑問1) return を行うと保存されるのですか?
(疑問2) すみません。記述ミスでしたね。正しくは return (float)x; です
(疑問3)sx, syは最初に貼り付けたソースのGameMapLoad関数で定義しています。
(疑問4,5)まだ製作途中のソースを貼り付けてますので。sx,syはプレイヤーの座標です。そしてwallの座標は144行目に定義しています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#20

投稿記事 by softya(ソフト屋) » 13年前

>(疑問1) return を行うと保存されるのですか?
残念ながら何処にも保存されません。

>(疑問2) すみません。記述ミスでしたね。正しくは return (float)x; です
float→int→floatと型変換される事になるのでintを経由した時点で情報は失われます。

>(疑問3)sx, syは最初に貼り付けたソースのGameMapLoad関数で定義しています。
前にも書いた通りローカル変数を参照する別関数を作ることはできません。

>(疑問4,5)まだ製作途中のソースを貼り付けてますので。sx,syはプレイヤーの座標です。そしてwallの座標は144行目に定義しています。
ああ、すいません。プレーヤーの座標の方でしたか。

144行目だと
float x, y, angle;
ですがforでループで回しているのにx,y,angleは1個しか無いようですが?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#21

投稿記事 by ookami » 13年前

横からすいません。こういうときはステップ実行かなと。
http://marupeke296.com/DBG_No1_Step.html
最初の投稿から時間がたっているのでソースコードがわかりませんが、
今問題になっている行にブレークポイントをしかけて、1行1行実行してみてはいかがでしょうか。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#22

投稿記事 by C.C » 13年前

softya(ソフト屋) さんが書きました:>(疑問1) return を行うと保存されるのですか?
残念ながら何処にも保存されません。

>(疑問2) すみません。記述ミスでしたね。正しくは return (float)x; です
float→int→floatと型変換される事になるのでintを経由した時点で情報は失われます。

>(疑問3)sx, syは最初に貼り付けたソースのGameMapLoad関数で定義しています。
前にも書いた通りローカル変数を参照する別関数を作ることはできません。

>(疑問4,5)まだ製作途中のソースを貼り付けてますので。sx,syはプレイヤーの座標です。そしてwallの座標は144行目に定義しています。
ああ、すいません。プレーヤーの座標の方でしたか。

144行目だと
float x, y, angle;
ですがforでループで回しているのにx,y,angleは1個しか無いようですが?
返信遅れまして申し訳ありません。
(疑問1,2,3)ではソース13行目のfloat x, yにGameMapLoad関数のsscanf_sで直接取得した場合はどうなるのでしょう?
(疑問4,5)144行目のfloat x, yはsscanf_sでtxtファイルを1行ずつ取得して更新しています。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#23

投稿記事 by C.C » 13年前

ookami さんが書きました:横からすいません。こういうときはステップ実行かなと。
http://marupeke296.com/DBG_No1_Step.html
最初の投稿から時間がたっているのでソースコードがわかりませんが、
今問題になっている行にブレークポイントをしかけて、1行1行実行してみてはいかがでしょうか。
ありがとうございます。試してみます

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#24

投稿記事 by C.C » 13年前

コード:

#include "DxLib.h"
#include "practice.h"
#include "Others.h"

Images img;
StageInfo stage;
//グローバル変数
GameState gamestate = GAME_TITLE;
int ghandle[6];
//時間計測用関数
int g_lasttime = 0;		//直前の計測時刻
float g_frametime = 0;	//1フレームにかかった時間
float playerX, playerY, wallX, wallY;
float w, h, angle;

int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC){
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//DXライブラリ初期化
	if(DxLib_Init() == -1) return -1;

	GameMapLoad("media\\stage01.txt");
	
	GameImageLoad();
	
	SetDrawScreen(DX_SCREEN_BACK);
	g_lasttime = GetNowCount() & INT_MAX;	//現在時刻の記録
	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
		//1ループにかかった時間を計測
		int curtime = GetNowCount() & INT_MAX;
		g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
		g_lasttime = curtime;
		
		ClsDrawScreen();
		//各画面の描画
		switch(gamestate){
		case GAME_TITLE:
			DrawGameTitle();
			break;
		case GAME_MAIN:
			DrawGameMain();
			break;
		case GAME_CLEAR:
			DrawGameClear();
			break;
		case GAME_OVER:
			DrawGameOver();
			break;
		}
		ScreenFlip();
	}
	//DXライブラリの終了処理
	DxLib_End();
	return 0;
}
int GameImageLoad(){
	//プレーヤー
	if(LoadDivGraph("media\\chara_hero_l.png", 6, 6, 1, 46, 96, ghandle) == -1)	return -1;
	//タイトル画面
	img.logo[0] = LoadGraph("media\\titleback.png");
	if(img.logo[0] == -1)	return -1;
	img.logo[1] = LoadGraph("media\\avalanche.png");
	if(img.logo[1] == -1)	return -1;
	//ゲームオーバー
	img.logo[2] = LoadGraph("media\\gameover.png");
	if(img.logo[2] == -1)	return -1;
	//壁
	img.wall[WALL_568] = LoadGraph("media\\wall_s.png");
	if(img.wall[WALL_568] == -1) return -1;
	img.wall[WALL_48] = DerivationGraph(0, 0, 48, 48, img.wall[WALL_568]);
	img.wall[WALL_192] = DerivationGraph(0, 0, 192, 48, img.wall[WALL_568]);
	img.wall[WALL_284] = DerivationGraph(0, 0, 284, 48, img.wall[WALL_568]);
	//ゴールの旗
	img.wall[GOAL_FLAG] = LoadGraph("media\\goalflag.png");
	if(img.wall[GOAL_FLAG] == -1) return -1;
	
	//読み込み成功
	return 1;
}
//タイトル画面描画
void GoGameTitle(){
	gamestate = GAME_TITLE;
}
void DrawGameTitle(){
	int Black = GetColor(0, 0, 0);	//黒色の値を取得
	//画像表示
	DrawGraph(0, 0, img.logo[0], FALSE);
	DrawGraph(20, 80, img.logo[1], TRUE);
	//テキスト表示
	DrawString(100, 340, "Zキーでゲームスタート" , Black);	//文字列表示
	DrawString(100, 376, "カーソルキーで左右移動" , Black);	//文字列表示
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	if(IsAKeyTrigger(key) == true) GoGameMain();
}
//ゲーム本編描画
void GoGameMain(){
	gamestate = GAME_MAIN;
}	
void DrawGameMain(){
	int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
	float mv = 80.0f * g_frametime;	//移動量計算
	if(key & PAD_INPUT_RIGHT){
		playerX += mv;
		stage.isheroleft = false;
	}
	if(key & PAD_INPUT_LEFT){
		playerX -= mv;
		stage.isheroleft = true;
	}
	if(key == 0){
		//プレーヤー
		DrawRotaGraph((int)playerX, (int)playerY, 1, 0, ghandle[0], TRUE, stage.isheroleft);
	}
	else {
		int animpat = (g_lasttime / (1000 / 12)) % 4;
		DrawRotaGraph((int)playerX, (int)playerY, 1, 0, ghandle[1 + animpat], TRUE, stage.isheroleft);
	}
	//Zキーを押すとゲームオーバー画面へ
	if(IsAKeyTrigger(key) == true)	GoGameOver();
}
//マップの読み込み
int GameMapLoad(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;
	sscanf_s(buf, "%f, %f, %f, %f", &w, &h, &playerX, &playerY);
	stage.mapsize_w = w;
	stage.mapsize_h = h;
	
	//主人公キャラクター
	DrawRotaGraph((int)playerX, (int)playerY, 1, 0, ghandle[0], TRUE, stage.isheroleft);
	
	//地形オブジェクト読み込み
	if(FileRead_gets( buf, 1023, f ) == -1)	return -1;
	int imax;
	sscanf_s(buf, "%d" , &imax);	//行数取得
	
	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", &wallX, &wallY, &w, &h, &angle, &id);
		
		Character ch;
		
		if((int)w == 48){
			ch.ID = WALL_48;
			DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[ch.ID], TRUE);
		}
		if((int)w == 192){
			ch.ID = WALL_192;
			DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[ch.ID], TRUE);
		}
		if((int)w == 284){
			ch.ID = WALL_284;
			DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[ch.ID], TRUE);
		}
		if((int)w == 568){
			ch.ID = WALL_568;
			DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[ch.ID], TRUE);
		}
		if(id == 1){
			ch.ID = GOAL_FLAG;
			DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[ch.ID], TRUE);
		}
		ch.used = true;
		stage.wall[stage.num_mapchara] = ch;
		stage.num_mapchara++;		
	}
	
	FileRead_close(f);
	return 0;
}

//ゲームクリア画面描画
void GoGameClear(){
	gamestate = GAME_CLEAR;
}
void DrawGameClear(){
}
//ゲームオーバー画面描画
void GoGameOver(){
	gamestate = GAME_OVER;
	stage.timerstart = g_lasttime;
}
void DrawGameOver(){
	DrawGraph(20, 120, img.logo[2], TRUE);
	//5秒経ったらタイトル画面へ
	if(g_lasttime - stage.timerstart > 2000)	GoGameTitle();
}
	
主人公は指定した座標に表示できました。ですが壁は画像自体が表示されません。どこか間違っているのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#25

投稿記事 by softya(ソフト屋) » 13年前

>(疑問1,2,3)ではソース13行目のfloat x, yにGameMapLoad関数のsscanf_sで直接取得した場合はどうなるのでしょう?
>(疑問4,5)144行目のfloat x, yはsscanf_sでtxtファイルを1行ずつ取得して更新しています。

どちらにしても、複数個あるデータを配列でもない変数に保存すると上書きされて最後のデータしか残りません。
あとグローバル変数に保存すれば他の関数からは参照可能にはなりますが上に書いた問題は残ります。

>主人公は指定した座標に表示できました。ですが壁は画像自体が表示されません。どこか間違っているのでしょうか?

前にも書きましたが、
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
のループ中に表示しないと意味がありません。
DrawGameMain()関数で主人公をDrawRotaGraph()しているから表示されたのです。
でもDrawGameMain()関数で壁を表示してはいませんよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#26

投稿記事 by C.C » 13年前

softya(ソフト屋) さんが書きました:>(疑問1,2,3)ではソース13行目のfloat x, yにGameMapLoad関数のsscanf_sで直接取得した場合はどうなるのでしょう?
>(疑問4,5)144行目のfloat x, yはsscanf_sでtxtファイルを1行ずつ取得して更新しています。

どちらにしても、複数個あるデータを配列でもない変数に保存すると上書きされて最後のデータしか残りません。
あとグローバル変数に保存すれば他の関数からは参照可能にはなりますが上に書いた問題は残ります。

>主人公は指定した座標に表示できました。ですが壁は画像自体が表示されません。どこか間違っているのでしょうか?

前にも書きましたが、
while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
のループ中に表示しないと意味がありません。
DrawGameMain()関数で主人公をDrawRotaGraph()しているから表示されたのです。
でもDrawGameMain()関数で壁を表示してはいませんよね?
DrawGameMain()関数で壁を表示しましたが明らかに指定した座標と違う位置に表示されてしまいます。

コード:

void DrawGameMain(){
     //壁の表示
	for(int i = 0; i < stage.num_mapchara; i++){
		if(stage.wall[i].used == false)	continue;

		int id = stage.wall[i].ID;
		DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[id], TRUE);
	}	
      int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
	float mv = 80.0f * g_frametime;	//移動量計算
	if(key & PAD_INPUT_RIGHT){
		playerX += mv;
		stage.isheroleft = false;
	}
	if(key & PAD_INPUT_LEFT){
		playerX -= mv;
		stage.isheroleft = true;
	}
	if(key == 0){
		//プレーヤー
		DrawRotaGraph((int)playerX, (int)playerY, 1, 0, ghandle[0], TRUE, stage.isheroleft);
	}
	else {
		int animpat = (g_lasttime / (1000 / 12)) % 4;
		DrawRotaGraph((int)playerX, (int)playerY, 1, 0, ghandle[1 + animpat], TRUE, stage.isheroleft);
	}
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#27

投稿記事 by softya(ソフト屋) » 13年前

何度も説明してますがwallX, wallY, angleは最後のものしか保存されていないわけですから、うまく表示されるはずがありません。

大きな疑問は、GameMapLoad()で使っているstage構造体です。
これは理解されて使っていますか?
stage.wall.IDとstage.wall.usedだけは配列で管理されているようですが。
そもそも構造体と配列はどのぐらい理解されているのでしょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#28

投稿記事 by ookami » 13年前

ステップ実行はうまく行きましたか?

ちょっと細かく書きますね。

最後に示されたソースコードで言うと、
DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[id], TRUE);
にブレイクポイントを仕掛けて(赤マルがついた状態で)実行してみてください。

ブレイクしたら(実行が中断して、赤マルに矢印がついたら)、「wallX」や「wallY」をマウスで指してください。
思ったとおりの値になっているでしょうか?
まずはここまで試してみてください。

---

ブレイクした状態から、F5で再開できますが、すぐにまた同じところでブレイクすると思います。
これは、ループで何度も同じ処理が回っているためです。
そのたびに、「wallX」や「wallY」をマウスで指してください。
思ったとおりの値になっているでしょうか。

---

次にロード部分を見てみましょう。
sscanf_s( buf, "%f, %f, %f, %f, %f, %d", &wallX, &wallY, &w, &h, &angle, &id);
にブレイクポイントを仕掛けて、「wallX」や「wallY」をマウスで指してください。
この時、
上ではF5で実行状態に戻りましたが
F10を押してください。
矢印が1行進むと思います。
その状態で再度、「wallX」や「wallY」をマウスで指してください。
値が変わっていると思います。

---

その時々で、思ったとおりの値が代入されているか、
または、描画の処理に使用されているか、確認してください。

へにっくす

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#29

投稿記事 by へにっくす » 13年前

whileの外にあるGameMapLoad関数ではDraw関数を使わないで
構造体の配列に代入するだけ。
実際に描画するところで、その構造体の配列を参照する。
という設計にした方がいいと思いますが…

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#30

投稿記事 by C.C » 13年前

ookami さんが書きました:ステップ実行はうまく行きましたか?

ちょっと細かく書きますね。

最後に示されたソースコードで言うと、
DrawRotaGraph((int)wallX, (int)wallY, 1, angle, img.wall[id], TRUE);
にブレイクポイントを仕掛けて(赤マルがついた状態で)実行してみてください。

ブレイクしたら(実行が中断して、赤マルに矢印がついたら)、「wallX」や「wallY」をマウスで指してください。
思ったとおりの値になっているでしょうか?
まずはここまで試してみてください。

---

ブレイクした状態から、F5で再開できますが、すぐにまた同じところでブレイクすると思います。
これは、ループで何度も同じ処理が回っているためです。
そのたびに、「wallX」や「wallY」をマウスで指してください。
思ったとおりの値になっているでしょうか。

---

次にロード部分を見てみましょう。
sscanf_s( buf, "%f, %f, %f, %f, %f, %d", &wallX, &wallY, &w, &h, &angle, &id);
にブレイクポイントを仕掛けて、「wallX」や「wallY」をマウスで指してください。
この時、
上ではF5で実行状態に戻りましたが
F10を押してください。
矢印が1行進むと思います。
その状態で再度、「wallX」や「wallY」をマウスで指してください。
値が変わっていると思います。

---

その時々で、思ったとおりの値が代入されているか、
または、描画の処理に使用されているか、確認してください。
ありがとうございます。
試してみましたが、softyaさんのおっしゃていたとおり最後のデータは指定した座標に表示されていました

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#31

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:ありがとうございます。
試してみましたが、softyaさんのおっしゃていたとおり最後のデータは指定した座標に表示されていました
へにっくすさんの提案や私の質問には答えていただいていませんが、修正する方針は決まりましたでしょうか?

【補足】
今までの内容を読みなおして頂けると分かると分かると思いますが一環して同じ事しか説明していません。
(1)マップの表示処理MapDrawはwhileループ中にないとマズイ。
(2)マップ座標などはMapLoadからMapDrawに引き継ぐ方法を考えないとマズイ。
(3)複数のマップ情報'座標など)を管理するなら構造体・配列などが必要。
これらの踏まえてのNo: 27の質問やNo: 29の提案と成るわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#32

投稿記事 by C.C » 13年前

softya(ソフト屋) さんが書きました:
C.C さんが書きました:ありがとうございます。
試してみましたが、softyaさんのおっしゃていたとおり最後のデータは指定した座標に表示されていました
へにっくすさんの提案や私の質問には答えていただいていませんが、修正する方針は決まりましたでしょうか?

【補足】
今までの内容を読みなおして頂けると分かると分かると思いますが一環して同じ事しか説明していません。
(1)マップの表示処理MapDrawはwhileループ中にないとマズイ。
(2)マップ座標などはMapLoadからMapDrawに引き継ぐ方法を考えないとマズイ。
(3)複数のマップ情報'座標など)を管理するなら構造体・配列などが必要。
これらの踏まえてのNo: 27の質問やNo: 29の提案と成るわけです。
へにっくすさん、softyaさん、返信遅れまして申し訳ありません。
アドバイスしていただいたことを考えておりました。
そして一応マップの表示はできました。
ありがとうございました。ソースも一緒にのせておきます。

コード:

#include "DxLib.h"
#include "practice.h"
#include "Others.h"

Images img;
StageInfo stage;
//グローバル変数
GameState gamestate = GAME_TITLE;
int ghandle[6];
//時間計測用関数
int g_lasttime = 0;		//直前の計測時刻
float g_frametime = 0;	//1フレームにかかった時間
float playerX, playerY, wallX, wallY;
float w, h, angle;

int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC){
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//DXライブラリ初期化
	if(DxLib_Init() == -1) return -1;

	GameMapLoad("media\\stage01.txt");
	
	GameImageLoad();
	
	SetDrawScreen(DX_SCREEN_BACK);
	g_lasttime = GetNowCount() & INT_MAX;	//現在時刻の記録
	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
		//1ループにかかった時間を計測
		int curtime = GetNowCount() & INT_MAX;
		g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
		g_lasttime = curtime;
		
		ClsDrawScreen();
		//各画面の描画
		switch(gamestate){
		case GAME_TITLE:
			DrawGameTitle();
			break;
		case GAME_MAIN:
			DrawGameMain();
			break;
		case GAME_CLEAR:
			DrawGameClear();
			break;
		case GAME_OVER:
			DrawGameOver();
			break;
		}

		GameMapDraw();
		ScreenFlip();
	}
	//DXライブラリの終了処理
	DxLib_End();
	return 0;
}
int GameImageLoad(){
	//プレーヤー
	if(LoadDivGraph("media\\chara_hero_l.png", 6, 6, 1, 46, 96, ghandle) == -1)	return -1;
	//タイトル画面
	img.logo[0] = LoadGraph("media\\titleback.png");
	if(img.logo[0] == -1)	return -1;
	img.logo[1] = LoadGraph("media\\avalanche.png");
	if(img.logo[1] == -1)	return -1;
	//ゲームオーバー
	img.logo[2] = LoadGraph("media\\game_over_back.png");
	if(img.logo[2] == -1)	return -1;
	//壁
	img.wall[WALL_568] = LoadGraph("media\\block.png");
	if(img.wall[WALL_568] == -1) return -1;
	img.wall[WALL_48] = DerivationGraph(0, 0, 48, 48, img.wall[WALL_568]);
	img.wall[WALL_192] = DerivationGraph(0, 0, 192, 48, img.wall[WALL_568]);
	img.wall[WALL_284] = DerivationGraph(0, 0, 284, 48, img.wall[WALL_568]);
	//ゴールの旗
	img.wall[GOAL_FLAG] = LoadGraph("media\\goalflag.png");
	if(img.wall[GOAL_FLAG] == -1) return -1;
	
	//読み込み成功
	return 1;
}

//タイトル画面描画
void GoGameTitle(){
	gamestate = GAME_TITLE;
}
void DrawGameTitle(){
	int Black = GetColor(0, 0, 0);	//黒色の値を取得
	//画像表示
	DrawGraph(0, 0, img.logo[0], FALSE);
	DrawGraph(20, 80, img.logo[1], TRUE);
	//テキスト表示
	DrawString(100, 340, "Zキーでゲームスタート" , Black);	//文字列表示
	DrawString(100, 376, "カーソルキーで左右移動" , Black);	//文字列表示
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	if(IsAKeyTrigger(key) == true) GoGameMain();
}
//ゲーム本編描画
void GoGameMain(){
	gamestate = GAME_MAIN;
}	
void DrawGameMain(){
	
	int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
	float mv = 80.0f * g_frametime;	//移動量計算
	if(key & PAD_INPUT_RIGHT){
		playerX += mv;
		stage.isheroleft = false;
	}
	if(key & PAD_INPUT_LEFT){
		playerX -= mv;
		stage.isheroleft = true;
	}
	if(key == 0){
		//プレーヤー
		DrawRotaGraph((int)playerX, (int)playerY, 1, 0, ghandle[0], TRUE, stage.isheroleft);
	}
	else {
		int animpat = (g_lasttime / (1000 / 12)) % 4;
		DrawRotaGraph((int)playerX, (int)playerY, 1, 0, ghandle[1 + animpat], TRUE, stage.isheroleft);
	}
	//Zキーを押すとゲームオーバー画面へ
	if(IsAKeyTrigger(key) == true)	GoGameOver();
}
//マップを読み込んで表示
int GameMapLoad(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;
	sscanf_s(buf, "%f, %f, %f, %f", &w, &h, &playerX, &playerY);
	stage.mapsize_w = w;
	stage.mapsize_h = h;
	
	//地形オブジェクト読み込み
	if(FileRead_gets( buf, 1023, f ) == -1)	return -1;
	int imax;
	sscanf_s(buf, "%d" , &imax);	//行数取得
	
	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", &wallX, &wallY, &w, &h, &angle, &id);
		
		Character ch;
		
		if((int)w == 48){
			ch.ID = WALL_48;
			ch.ID_X = (int)wallX;
			ch.ID_Y = (int)wallY;
			ch.ID_Angle = angle;
		}
		if((int)w == 192){
			ch.ID = WALL_192;
			ch.ID_X = (int)wallX;
			ch.ID_Y = (int)wallY;
			ch.ID_Angle = angle;
		}
		if((int)w == 284){
			ch.ID = WALL_284;
			ch.ID_X = (int)wallX;
			ch.ID_Y = (int)wallY;
			ch.ID_Angle = angle;
		}
		if((int)w == 568){
			ch.ID = WALL_568;
			ch.ID_X = (int)wallX;
			ch.ID_Y = (int)wallY;
			ch.ID_Angle = angle;
		}
		if(id == 1){
			ch.ID = GOAL_FLAG;
			ch.ID_X = (int)wallX;
			ch.ID_Y = (int)wallY;
			ch.ID_Angle = angle;
		}
		
		ch.used = true;
		stage.Wall[stage.num_mapchara] = ch;
		stage.num_mapchara++;		
	}
	
	FileRead_close(f);
	return 0;
}
//壁の描画
void GameMapDraw(){
	for(int i = 0; i < stage.num_mapchara; i++){
		if(stage.Wall[i].used == false) continue;
		
		int id = stage.Wall[i].ID;
		int wall_x = stage.Wall[i].ID_X;
		int wall_y = stage.Wall[i].ID_Y;
		float wall_angle = stage.Wall[i].ID_Angle;

        DrawRotaGraph(wall_x, wall_y, 1, wall_angle, img.wall[id], TRUE);
	}
}
//ゲームクリア画面描画
void GoGameClear(){
	gamestate = GAME_CLEAR;
}
void DrawGameClear(){
}
//ゲームオーバー画面描画
void GoGameOver(){
	gamestate = GAME_OVER;
	stage.timerstart = g_lasttime;
}
void DrawGameOver(){
	DrawGraph(20, 120, img.logo[2], TRUE);
	//5秒経ったらタイトル画面へ
	if(g_lasttime - stage.timerstart > 2000)	GoGameTitle();
}
	

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#33

投稿記事 by softya(ソフト屋) » 13年前

stateが
case GAME_TITLE:
case GAME_CLEAR:
case GAME_OVER:
の時に GameMapDraw();するのはマズイとおもいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#34

投稿記事 by C.C » 13年前

softya(ソフト屋) さんが書きました:stateが
case GAME_TITLE:
case GAME_CLEAR:
case GAME_OVER:
の時に GameMapDraw();するのはマズイとおもいます。
どうマズイのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#35

投稿記事 by softya(ソフト屋) » 13年前

C.C さんが書きました:
softya(ソフト屋) さんが書きました:stateが
case GAME_TITLE:
case GAME_CLEAR:
case GAME_OVER:
の時に GameMapDraw();するのはマズイとおもいます。
どうマズイのですか?
常にマップが前面に表示されていてますが、それぞれのstate(タイトルなど)表示を阻害していませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

C.C
記事: 64
登録日時: 13年前

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#36

投稿記事 by C.C » 13年前

softya(ソフト屋) さんが書きました:
C.C さんが書きました:
softya(ソフト屋) さんが書きました:stateが
case GAME_TITLE:
case GAME_CLEAR:
case GAME_OVER:
の時に GameMapDraw();するのはマズイとおもいます。
どうマズイのですか?
常にマップが前面に表示されていてますが、それぞれのstate(タイトルなど)表示を阻害していませんか?
アドバイスいただいたことを無視したことになり申し訳ないのですが、DrawGameMain関数の中で呼び出しました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: マップを読み込んで表示したいのですが、うまく表示がされません(タイトル修正)

#37

投稿記事 by softya(ソフト屋) » 13年前

ちなみに。

コード:

        case GAME_MAIN:
            GameMapDraw();
            DrawGameMain();
            break;
とすれば解決するのと呼出しの順番は結構重要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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