同じプログラムを別のPCで実行すると。

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

同じプログラムを別のPCで実行すると。

#1

投稿記事 by BEMANI » 16年前

前回ファイル読み込みの件で投稿させて頂きましたBEMANIです。
あれ以来、スコアのセーブが出来るようになり非常に助かりました。

本題なのですが、
デスクトップ・ノートとPCが二種類あり、現在デスクトップで作業しています。
デスクトップでは正常に起動し、思い通りの結果になるのですが
ノートになると画面が真っ黒になってしまいました。

動いていないのかな?と思ったのですが、効果音(音楽)は流れていました。
どうやら画像がうまく表示できていないのではないかと思うのですが
全く同じソースなので、なぜ真っ黒になるのか原因が解りません。

VC++2008 EEを使用し、OSはXPです。
PCに関しての知識が乏しいのでこのような質問でいいのか解りませんが、
何か原因が解る方いらっしゃらないでしょうか・・・。

lbfuvab

Re:同じプログラムを別のPCで実行すると。

#2

投稿記事 by lbfuvab » 16年前

他のDxライブラリを使ったプログラムは動きますか?

BEMANI

Re:同じプログラムを別のPCで実行すると。

#3

投稿記事 by BEMANI » 16年前

>>lbfuvabさん
今のプロジェクトより少し前に作成した物のバックアップがあったので
そちらを実行してみました所、正常に映りました。

また、全く違うプロジェクトで画像を描画するというものがあったので
そちらも実行してみました所、正常に映っておりました。

Libra

Re:同じプログラムを別のPCで実行すると。

#4

投稿記事 by Libra » 16年前

ロードする時のファイルのパス(ファイルの場所)が違うのではないでしょうか?

BEMANI

Re:同じプログラムを別のPCで実行すると。

#5

投稿記事 by BEMANI » 16年前

>>Libraさん
ファイルパスが違う(「画像が存在しない」・「ファイル名が違う」)等で
正しく画像を格納することができなかった場合、
テクスチャを描画する段階でエラーが出てしまわないですか?
ロード時に使っている関数はD3DXCreateTextureFromFileAというものです。

パスは、ソリューションから見ての相対指定ですので間違っているとは考えにくいのです;
(念のため見直しましたが、間違ってはいませんでした。)

御津凪

Re:同じプログラムを別のPCで実行すると。

#6

投稿記事 by 御津凪 » 16年前

> ロード時に使っている関数はD3DXCreateTextureFromFileAというものです。

この関数の戻り値を確認してください。
何か問題があれば S_OK (0)以外の値が返ってくるはずです。
たとえ読み込めていなかったとしても、
変数が NULL である場合、たぶん問題なく描画をスルーします。
(結果、何も描画されない)

それとは別に注意があるので一応書いておきます。

ソリューションから起動する場合と、
直接起動する場合、
デフォルトの設定だとカレントディレクトリが違います。
ソリューションからデバッグ起動すると、ソリューションファイルの置かれているディレクトリが
カレントディレクトリになり、
直接起動すると、その実行ファイルの置かれているディレクトリが
カレントディレクトリになります。

通常、ビルドした実行ファイルは Debug 及び Release フォルダにあるので、
このようなディレクトリの違いがでます。

dic

Re:同じプログラムを別のPCで実行すると。

#7

投稿記事 by dic » 16年前

ロードする所のコード
描画する所のコードを書いてくれると返答の仕方が変わってくると思います

BEMANI

Re:同じプログラムを別のPCで実行すると。

#8

投稿記事 by BEMANI » 16年前

>>御津凪さん
ロード失敗時に、画像が読み込めなかったらメッセージウインドウで
「読み込み失敗」なるものを表示していますが、メッセージが出ないので読み込めていると思います。
念のためにロード関数を使った場所すべての戻り値を調べましたが、全てS_OKが返ってきました。


また、描画時に「デバイスオブジェクト->SetTexture(0, テクスチャ格納先);」
を使っていますが、テクスチャ格納先に画像がロード出来なかった場合、

0x4b6e799b でハンドルされていない例外が発生しました:
0xC0000005: 場所 0xcdcdcd7d に書き込み中にアクセス違反が発生しました。

値は皆さんと違うと思いますが、格納できていないというメッセージが出るため、
ファイルパスが間違っている・ファイル名が違う等があった場合は
このようなエラーメッセージが出力され起動ができません。

カレントディレクトリに関してですが、こちらは間違っていないと思います。


>>dicさん
D3DXCreateTextureFromFileAが長いのでLOAD_IMAGEにしています。

・ロードする所
LOAD_IMAGE(デバイスオブジェクト, "ファイル名", &画像格納先);


・描画する所
そのまま乗せても大丈夫なのでしょうか・・・。
(アニメーション・回転計算は抜いています)

//***********************************************************************************************
// オブジェクトを描画する
// 第一引数	:	描画するX座標
// 第二引数	:	描画するY座標
// 第三引数	:	アニメーションするかどうか(TRUE:する	FALSE:しない)
// 第四引数	:	回転するかどうか(TRUE:する	FALSE:しない)
// 第五引数	:	回転する角度
// 第六引数	:	色指定
// 第七引数	:	表示する画像が格納されているポインタ
//***********************************************************************************************
void CPRINT::CDrawObj(float Xpos, float Ypos, bool AFlag, bool SFlag, float Angle, char Color, LPDIRECT3DTEXTURE9 Texture)
{
	// 描画するテクスチャをセットする
	CDevice->GetD3DDevice()->SetTexture(0, Texture);
	vertex[0].rhw = vertex[1].rhw = vertex[2].rhw = vertex[3].rhw = 1.0f;

	// Specularなし
	vertex[0].specular = vertex[1].specular = vertex[2].specular = vertex[3].specular = D3DCOLOR_XRGB(0, 0, 0);

	// 色指定
	vertex[0].diffuse = vertex[1].diffuse = vertex[2].diffuse = vertex[3].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);

	// Z値を0にする
	vertex[0].z = vertex[1].z = vertex[2].z = vertex[3].z = 0.0f;


	//-------------------------------------------------------------------------------
	// ウインドウ内でのX, Y座標
	//-------------------------------------------------------------------------------
	vertex[0].x = Xpos;
	vertex[0].y = Ypos;

	vertex[1].x = Xpos + Rect.right;
	vertex[1].y = Ypos;
	
	vertex[2].x = Xpos + Rect.right;
	vertex[2].y = Ypos + Rect.bottom;
	
	vertex[3].x = Xpos;
	vertex[3].y = Ypos + Rect.bottom;


	//-------------------------------------------------------------------------------
	// テクスチャ内でのX, Y座標
	//-------------------------------------------------------------------------------
	vertex[0].tx = (1/AParX) * Color;
	vertex[0].ty = TYpos;

	vertex[1].tx = (1/AParX) + vertex[0].tx;
	vertex[1].ty = vertex[0].ty;

	vertex[2].tx = vertex[1].tx;
	vertex[2].ty = TYpos + Anime.bottom;	

	vertex[3].tx = vertex[0].tx;
	vertex[3].ty = vertex[2].ty;


	//-------------------------------------------------------------------------------
	// ポリゴンの描画
	//-------------------------------------------------------------------------------
	CDevice->GetD3DDevice()->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(TLVERTEX));

}

※送った引数を元に描画するというものです。


全く同じプロジェクトを学校のデスクトップに移して(3台目のPCで)起動しましたが
こちらでも正常に動きました。
また、ソースは全くいじってないです。
ノートだからいけない・・・ということはないですよね;

御津凪

Re:同じプログラムを別のPCで実行すると。

#9

投稿記事 by 御津凪 » 16年前

> ノートだからいけない・・・ということはないですよね;

もしかしたらということなのですが、
ノートPCのグラフィックボードがSpecular非対応だったりするかもしれません。

あと、FVF値はどのようにセットされていますか?
(一応、TLVERTEX 構造体の中身も)

BEMANI

Re:同じプログラムを別のPCで実行すると。

#10

投稿記事 by BEMANI » 16年前

>>御津凪さん
今問題となっているプロジェクトの、少し前のプロジェクトにも
描画の所で同じような表記がされていますが(Specular)、そちらでは正常に動作しております。
非対応ではないかと思います;

えー、FVF値はマクロ定義でこのように書きました。
#define FVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1)

TLVERTEX構造体の中身です。
typedef struct _tlvertex
{
	float		x, y, z;
	float		rhw;
	D3DCOLOR	diffuse;
	D3DCOLOR	specular;
	float		tx, ty;		
}TLVERTEX;

御津凪

Re:同じプログラムを別のPCで実行すると。

#11

投稿記事 by 御津凪 » 16年前

関係ないかもしれませんが、
D3DFVF_XYZRHW で座標を指定して描画するとき、
頂点がスクリーン表示範囲からずれた時に、
描画されなくなったり、描画がおかしくなることがあります。

まあ恐らく非対応のほうかもしれませんが、
一応、Direct3D SDK に付属している DirectX Caps Viewer で対応しているか
確認してみるといいと思います。

BEMANI

Re:同じプログラムを別のPCで実行すると。

#12

投稿記事 by BEMANI » 16年前

>>御津凪さん

>D3DFVF_XYZRHW で座標を指定して描画するとき・・・
そんなことあるんですか;
はじめて聞きました;



>まあ恐らく非対応のほうかもしれませんが・・・
これは、元から入っているサンプルプログラムを実行して
映るかどうかを確認しよう ということですよね?

見当はずれなことを言っているかもしれませんが
ためしに、ShadowVolume.exeという名前の実行ファイルを起動してみました。
内容は、オブジェクトに対して1~6個の光を選択して当てる(光源計算?)サンプルでした。
全部試してないですが、いくつか実行した結果全て映りました。


言うのが遅れたかもしれないのですが、家のデスク・学校のデスク・ノートの中では
ノートのスペックが一番低いです。(この辺りは関係ないんのですかね;)

御津凪

Re:同じプログラムを別のPCで実行すると。

#13

投稿記事 by 御津凪 » 16年前

> これは、元から入っているサンプルプログラムを実行して
> 映るかどうかを確認しよう ということですよね?

DirectX のほとんどのサンプルは、基本ハードで動作できない場合はダイアログか何か表示させた後、
リファレンスモード(描画処理等を全てCPU側で処理するモード)で起動するので、
まずは(どんなに時間がかかろうが必ず)表示されます。

(と、言うことは、リファレンスモードで実行するように変更すればノートでも表示されるかも)

上記に書いた DirectX Caps Viewer というのは、
パソコンのグラフィックボードの性能をチェックするツールです。
(利用できるテクスチャの最大サイズや、スクリーンモードでのカラーフォーマットの対応状況等)

このツールはチェック結果をテキストファイルに保存できるので、
ほかのPCと見比べて、何が違うのか調べてみるといいと思います。
(言い忘れていましたが、ノートPCにはDirectXの最新版は入っていますか?)

BEMANI

Re:同じプログラムを別のPCで実行すると。

#14

投稿記事 by BEMANI » 16年前

>>御津凪さん
DirectXのバージョンは最新にしてあります!

何か色々と初めて聞く情報ばかりです;
グラフィックボードの性能をチェックできるツールだったんですね~。

調べるのに結構時間かかりそうなので地道に調べていきます・・・。
ただ、並行して出来ないのが辛いですが;;
表示ができたら御報告に伺いたいと思います。
御津凪さん御親切にありがとうございます><

BEMANI

Re:同じプログラムを別のPCで実行すると。

#15

投稿記事 by BEMANI » 16年前

とりあえず映るには映ったので報告に上がりました。

変更した場所は、CreateDevice(デバイスの作成)の第二引数なのですが、
D3DDEVTYPE_HAL と 書いていたものを D3DDEVTYPE_REF に変えてみました。

しかし、デスクトップと比べ画面の切り替わりや、
キャラクターの動き等、ゲーム自体の速度が極端に遅くなってしまっています。
そのあたりを今度調べていってみます。

一応、画面表示ができなかった・・・という問題はなくなりましたので
これにて解決とさせて頂きます。


そんなに処理が重いのかな;
御津凪さん、お付き合い頂きまして本当にありがとうございます><

御津凪

Re:同じプログラムを別のPCで実行すると。

#16

投稿記事 by 御津凪 » 16年前

> キャラクターの動き等、ゲーム自体の速度が極端に遅くなってしまっています。

まずゲームにはならないほどに遅くなります。
(描画も含め、全てをCPUで処理しているため)
それほどグラフィックカードでの計算が速いということです。

とりあえず映ったということは、ノートでは対応していない何かが関係しているわけですね。
がんばって原因を探してみてください。

BEMANI

Re:同じプログラムを別のPCで実行すると。

#17

投稿記事 by BEMANI » 16年前

>>御津凪さん
気になったのでお友達の、自分よりかはスペックのいいノートPCで起動すると動きました。
やはり、なにかがダメなんですよね。

デスクトップで映るなら、先にゲームの方やってしまえばどうでしょう
と言われたのですが、ノートで映らないと作業時間が限られてしまうので本当に直さないとです。

>がんばって原因を探してみてください。
ありがとうございます><
頑張ってみます^^
もし、期待通りの動作になった時、報告に伺います!

BEMANI

Re:同じプログラムを別のPCで実行すると。

#18

投稿記事 by BEMANI » 16年前

正常に動作するようになりました~。
これで、学校でも作業できます><
アドバイスを下さった方々、ありがとうございました!

閉鎖

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