ページ 11

DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 19:03
by ヒューガ
DXライブラリで3Dゲームを作ろうとしているのですが

コード:

#include"variable.h"
botan_t botan;
key_t key;
my_t my;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
		SetMainWindowText("ACE C○MBAT");
					load_main();
		

 while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  && GHK()==0 && GHP()==0 && comand()==0){
	 
	graph_main();
}

DxLib_End(); 
	return 0;
}
とやるとモデルが映りません。しかし

コード:

#include"variable.h"
botan_t botan;
key_t key;
my_t my;
int model;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
		SetMainWindowText("ACE C○MBAT");
					load_main();
		

 while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  && GHK()==0 && GHP()==0 && comand()==0){
	 
	graph_main();
}

DxLib_End(); 
	return 0;
}
とint modelをつけるとモデルが映るのですが、どうしてなのでしょうか。
モデルはここには書いていませんが構造体に格納しています。
ここ以外でmodelは使っていません。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 19:16
by h2so5
ヒューガ さんが書きました: モデルはここには書いていませんが構造体に格納しています。
なぜ肝心な部分を載せないんですか?

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 19:26
by softya(ソフト屋)
読み辛いのでインデントを整理する事をおすすめします。
さて問題点ですが、再現できるコードを全部載せて頂かないと判断は難しいです。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 19:33
by ヒューガ
ごめんなさい

コード:

void load(){
	my.model=MV1LoadModel("qube.mqo");
}
void load_main(){
	load();
}
これでロードです。
void graph_my(){
MV1SetPosition(my.model,VGet(320.0f,000.0f,600.0f)) ;
MV1DrawModel(my.model);
}
void graph_main(){
graph_my();
}
これでモデルセットです。
カメラは動かしていません。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 19:39
by softya(ソフト屋)
構造体の宣言も教えて下さい。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 19:45
by Dixq (管理人)
プログラムがうまく動かないときは極力シンプルにしていくのがベストです。
DXライブラリのサンプルプログラムは必ず動くわけですから
http://homepage2.nifty.com/natupaji/DxL ... nc_3d.html
カスタマイズしたいなら、そこから少しずつ変更して行って、どこでうまくいかなくなったか確認するとよいと思います。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 19:51
by ヒューガ
構造体の宣言でしたら

コード:

typedef struct{
	int model;
}my_t;
ですね

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 21:14
by softya(ソフト屋)
提示してもらった最低限のコードで本当に問題が起きますか?

まとめると次のようになります。 ※モデルのファイル名はこちらの都合で変えてあります。

コード:

#include "DxLib.h"

typedef struct {
	int model;
} my_t;

my_t my;

void load()
{
	my.model = MV1LoadModel( "sample/SimpleModel.mqo" );
}
void load_main()
{
	load();
}
void graph_my()
{
	MV1SetPosition( my.model, VGet( 320.0f, 000.0f, 600.0f ) ) ;
	MV1DrawModel( my.model );
}
void graph_main()
{
	graph_my();
}

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
	SetMainWindowText( "ACE C○MBAT" );
	load_main();

	while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
		graph_main();
	}

	DxLib_End();
	return 0;
}
これで問題が起きないのなら他に問題の原因となる部分があると言うことです。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 21:19
by ヒューガ
問題なくできました。
これと違うプロジェクトで実験モデルのような物作ってる時にもこのようなことが起きました。
グローバル変数を何か宣言しなきゃいけないんでしょうか?

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 21:30
by softya(ソフト屋)
その問題が起こるコードを見せて欲しいんですよ。
グローバル変数は無関係です。バグを内包してして、たまたま関係する場合はありますが。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 21:37
by ヒューガ

コード:

#include"variable.h"
botan_t botan;
key_t key;
my_t my;
wave_t wave[1000];
int x;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
		SetMainWindowText("mach model");
					my.img=LoadGraph("f22l.png");


 while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  && GHK()==0 && GHP()==0 && comand()==0){

	 DrawGraph(320,240,my.img,TRUE);
	 
}

DxLib_End(); 
	return 0;
}
構造体

コード:

typedef struct{
	int up,down,right,left,b[16];
}botan_t;
typedef struct{
	int up,down,right,left,shot,missile,slow,seek;
	int up_n,down_n,right_n,left_n,shot_n,missile_n,slow_n,seek_n;
}key_t;
typedef struct{
	int img,s;
}my_t;
typedef struct{
	int f,c;
	double point,mach,range;
}wave_t;
これですね。
main関数があるコードのint x;を抜くとf22が映らなくなります。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 21:58
by softya(ソフト屋)
波及的に他のコードで問題が発生していると思いますので、ポインタの操作ミスや配列の添字オーバーなどが怪しいです。
なので、問題が再現する出来るだけコンパクトなコードを提示してもらわないと問題点は指摘できないです。
あるいは、問題が起きるコードとデータ全部を何処かのアップローダにUPしてもらうかです。
今までの断片だと何時まで経っても解決には至りません。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月12日(木) 23:27
by ヒューガ
http://www1.axfc.net/uploader/N/so/156398
一応あげときます。
プロジェクト一式です

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 19:22
by softya(ソフト屋)
残念ながらそのままのコードでもモデルが表示されません。
なにか操作しないと表示されないんでしょうか?

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 21:53
by ヒューガ
モデルハンドルをすべてグローバル変数にすると映りました。
構造体のメンバにはできないようです。
お騒がせしました。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 21:55
by softya(ソフト屋)
ヒューガ さんが書きました:モデルハンドルをすべてグローバル変数にすると映りました。
構造体のメンバにはできないようです。
お騒がせしました。
出来ないはずはないです。普通はそう組みます。

【補足】
ソースコードを見なおしてみたら、ダウンロードしたコードではrender_main()が何処からも呼び出されていませんでした。
この状態だとint model;をコメントアウトすると確かに消えます。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:10
by ヒューガ
別スレで円錐作って座標把握しろって言われてその実験のままだったので・・・
render_main()をDrawCone3Dのうえに書いて実行して
やはりint modelを消すと映らなくなります。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:14
by softya(ソフト屋)
分かりました。配列の添字外のアクセスです。
デバッガでブレークポイントの作成→新しいデータブレークポイントの作成を選んで&my.modelの4バイトをブレーク条件にしたらある命令が引っかかりました。
それは、botan.b[16]=0;です。
これは、配列宣言時にb[16]と宣言しているためで配列の要素数は16個、添字はb[0]からb[15]の範囲となります。
b[16]は存在しません。配列外にアクセスして&my.modelの値を0にしたのです。

こういうバグは偶然治ったというあやふやな物でねじ伏せてはいけません。後々厄介なバグを引き起こします。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:34
by ヒューガ
正常に動きました!ありがとうございます!

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:38
by softya(ソフト屋)
ヒューガ さんが書きました:正常に動きました!ありがとうございます!
ただ直すのではなく、デバッガでブレークして問題があることを確認してみ下さい。
問題を見つける方法を覚えて、問題点をちゃんと理解して修正すると言う段階を踏まないと同じ事を繰り返しやすいです。
次からは自分で見つける自信がありますか?

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:40
by ヒューガ
デバッガなら1時期お世話になりました。
意外と初歩的なところでミスって起きるものですね・・・
次からは自分で見つけます!

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:46
by softya(ソフト屋)
ヒューガ さんが書きました:デバッガなら1時期お世話になりました。
意外と初歩的なところでミスって起きるものですね・・・
次からは自分で見つけます!
普通データブレークは、初心者は使わないと思いますよ。
本当に使ったことがありますか?
※ 命令ブレークとは別物です。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:51
by ヒューガ
VisualC++でコードの左に赤丸つけるやつですが
あれは違うんですか?

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 22:57
by softya(ソフト屋)
ヒューガ さんが書きました:VisualC++でコードの左に赤丸つけるやつですが
あれは違うんですか?
全然違いますよ。
それは命令or行ブレークです。指定行に来たらブレークします。
変数の変化を検知してブレークするのがデータブレークです。

Re: DXライブラリで3Dゲーム

Posted: 2012年7月13日(金) 23:02
by ヒューガ
なるほど・・・いろいろありがとうございます!