ページ 11

ウィンドウが表示されない原因

Posted: 2008年3月27日(木) 16:59
by k.a
今、シューティングゲームを作っています。
自機を動かすことができて、次は自機を狙う弾のプログラム書こうと思いそのためのプログラムを書き、
正常に動くか確かめるためにさっそく実行したのですが、なぜか、ウィンドウが表示されません。
プログラムを書き直して再度実行しても表示されず、いったい何が原因なのかまったくわかりません。
どのようにすれば、ウィンドウが表示されるのでしょうか?

使用しているコンパイルはBorland C++ Compiler 5.5でBCC Developerを使っていて、OSはWindows XPです。

Re:ウィンドウが表示されない原因

Posted: 2008年3月27日(木) 17:29
by やそ
自機を動かしたときのソース(もちろん画面表示されたもの)と今回作った表示されないソースを見比べるしかないんじゃないでしょうか?
k.a さんの書き方では、全ての回答は推測の域をでませんよ^^;

現象の再現できる最小構成のプログラムを晒せますか?

もしくは、自機を動かした時のソースとそこからどこをどのように修正したのか分かるソース。

自機を狙う弾をどのように管理&表示しようとしたのでしょうか?

エラーを吐くんじゃなくて、何も表示されない状態なのでしょうか?

有用な回答を得るためにはもう少し情報提供する努力をしてみましょう^^

Re:ウィンドウが表示されない原因

Posted: 2008年3月27日(木) 19:26
by k.a
すばやい回答ありがとうございます。
情報が少なかったことは、本当にごめんなさい。これからはいい情報提供ができるように努力します。

>現象の再現できる最小構成のプログラムを晒せますか?
  ソースが83行あり、掲示してもいいのか悩んだので自機を狙う弾と構造体だけ掲示します。

struct CharaData{
float x, y; //左上座標
int ghandle; //画像
int life;     //ライフ プラグ
float vx, vy; //速度
};
//グローバル変数
struct CharaData tama[10];
int tama_g = LoadGraph("media\\tama.bmp");

//自機を狙う弾の関数  
void TamaInit(){
   //弾の初期化
for(int i; i<10; i++){
if(tama.life == 0){
tama.life = 1;
tama.x = 350;
tama.y = 350;
//自機と弾の距離を求める
float dx = jiki.x - tama.x;
float dy = jiki.y - tama.y;
float d = sqrt(dx * dx + dy * dy);
//tamaの速度を求める
tama.vx = (jiki.x - tama.x) / d * 50.0;
tama.vy = (jiki.y - tama[i].y) / d * 50.0;
break;
}
}
//弾の移動
for(int i=0; i<10; i++){
if(tama[i].life > 0){
tama[i].x += tama[i].vx;
tama[i].y += tama[i].vy;
 //弾の消去 TRUEなら消しFALSEなら表示する。
  if(tama[i].x < 0 || tama[i].x > 650 || tama[i].y < 0 || tama[i].y > 490){
tama[i].life = 0;
}else{
DrawGraph(tama[i].x, tama[i].y, tama_g, TRUE);
}
}
}
}

正常に自機を動かせた時のソースに↑のソースを書き加えました。

>自機を狙う弾をどのように管理&表示しようとしたのでしょうか?
  for文とif文で各弾をチェックしてtama[i].lifeが0なら初期化をして0以上なら移動させます。

  弾の移動処理の最後のif文は画面外に出たならtama[i].lifeに0を代入し、出ていなかったら
  表示するようになっていると思います。
                (まだ一度も正常に動いていないので本当にそうなるかわかりません。)

>エラーを吐くんじゃなくて、何も表示されない状態なのでしょうか?
  はい、全く何も表示されませんしそれどころか、ウィンドウ自体が開きません。


わかりやすく書いたつもりですが、何かわからないことがありましたら容赦なく言ってください。
  

Re:ウィンドウが表示されない原因

Posted: 2008年3月27日(木) 19:33
by 管理人
ザッと見ただけなのですが、
「画像が表示されない」のではなく、「ウィンドウ自体が表示されない」でいいですか?

上のプログラムでは画像は表示されないと思います。
というのも、DXライブラリの初期化関数の前に、グラフィックのロードを行っているので、
初期化関数を読んだ時点でクリアされてしまいます。

int tama_g = LoadGraph("media\\tama.bmp");

このように、宣言と同時に格納するのではなく、グラフィックをロードする関数を別に作り、
初期化関数を呼んだあとで、この関数を呼びましょう。

ウィンドウ自体が表示されない場合は、メイン文を見る必要があるかもしれないので、
コードすべてを投稿していただいたほうが早いかもしれません。
「参照」からソースコードを添付できます。

Re:ウィンドウが表示されない原因

Posted: 2008年3月27日(木) 23:25
by k.a
アドバイスありがとうございます。
けど少し言いずらいのですが、なぜか正常動きました。

こうなった経緯を説明すると・・・
管理人さんが言ったとおりにソースを添付しようとした時、
もしかして添付したら自分の実名がでてしまうのじゃないかと考え(ファイル名に本名を使っているので)、
ファイルの名前を変えたのです。すると今度はコンパイルができなくなり、パニックを起こしてしまって
(ファイル名を変えたのがいけなかったようです。)そのときに誤って正常に動かないソースが入っている
ファイルを削除してしまいました。          
しまったと思い、慌てて予備としてとっていた正常に動くソースを正常に動かないソースに書き換えました。
で、一度コンパイルして「動くかな?」と軽い気持ちで実行したところ正常に動いたというわけです。

実は前にもこのようなことがあり、そのときはソースを一旦すべて消しまた書き直したら正常に動きました。
この時、このようなことはもう起きないと高をくくっていたのですが、また起きてしまい「もしかして、
こんなことがこれからも続くのかな。」と考えて原因知るためにこのトピックを投稿したのですが、
とんだお騒がせしました。
こんなトピックに回答してくださったやそさん、管理人さんアドバイス本当にありがとうございます。
また、わからないことができたら質問をしに来ますので、そのときはお願いします。

あ、あと今回正常に動かなかったソースは添付しておきます。
本当にありがとうございました。

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 00:18
by tk-xleader
たぶん、ファイル名に日本語(半角英数字以外)が使われていたのが原因ではないでしょうか?
BCCは半角英数字以外のファイル名は使えませんから…

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 01:19
by 管理人
しかしそうだとすると、ウィンドウが表示できなかったのではなく、コンパイル自体できなかったのでは・・。

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 09:11
by k.a
回答ありがとうございます。

>たぶん、ファイル名に日本語(半角英数字以外)が使われていたのが原因ではないでしょうか?
>ウィンドウが表示できなかったのではなく、コンパイル自体できなかったのでは・・。
  ファイル名はすべて英語で書いていて、コンパイルもできました。
  ただ、正常に動かないソースを実行したあと、書き直してコンパイルをするとエラーで、
  <program still running?>とでてコンパイルができませんでした。

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 09:44
by Mist
> ただ、正常に動かないソースを実行したあと、書き直してコンパイルをするとエラーで、
>  <program still running?>とでてコンパイルができませんでした。
正常に動かないソースで作ったexeがきちんと終了していない(動いたまま)からではないですか?

「<program still running?>」=「exeが実行中で更新できませんよ」

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 11:24
by k.a
回答ありがとうございます。

それならば、正常に動かないソースで作ったexeが実行しているのに、
なぜウィンドウが開かないのでしょうか?
自分で考えれる原因は、
   ・プログラム自体が重かったから。
   ・管理人さんが指摘したとおりメイン文に問題があったから。
   ・同じく管理人さんが指摘した変数の宣言と同時に画像データを格納したから。(これはないか?)
   ・パソコンの寿命が近いから。(4年間使い続けているノートパソコンです。)
ぐらいです。
この中でプログラム自体が重かったとパソコンの寿命が近いは考えずらいですし、
メイン文に問題があったからが一番考えられますが、そのソースは上で書いたとおり削除してしまったので
確かめれません。(誤解を招く文だったので書きますが、添付したソースは書き直したものです。)
それに、メイン文は本を見て正確に写しそれを使い自機を正常に動かせたので間違いはないと思います。
(正常に動かないソースをもとのソースに書き直すと、正常に動きましたし。)

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 12:06
by バグ
私もBCCを使っていた時に同じ現象が起こった事がありました。どういう訳かexeファイルが終了されない事があるんですよね。右上の×ボタンで終了させた時によく起こったように思います。

タスクマネージャーでexeファイルを終了させてからビルドするといいですよ。

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 13:36
by 管理人
バグさんと被りますが、DxLibで作っていると時々きちんと終了しない事があります。
DXライブラリの終了関数を呼んでから終わらなかった時になるのかもしれません。
そんなときはタスクマネージャーの「プロセス」から(デフォルトなら)「DxLib.exe」を終了させて下さい。
もし自分でプロジェクトを作っているならそのプロジェクト名.exeになっていると思います。

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 14:13
by Mist
> なぜウィンドウが開かないのでしょうか?
普通に考えれば、プログラム自体に問題があるのだと思います。
例えば、バッファオーバーランとかしてしまっている場合、思いもよらぬところに影響が出たりしますね。
「ウィンドウが開く=exeが実行されている」、「ウィンドウが開かない=exeは実行されていない(もしくは終了している)」という考えはちょっと違うかと思います。
「ウィンドウが開かない=プログラムがバグっている」ぐらいかな。

Re:ウィンドウが表示されない原因

Posted: 2008年3月28日(金) 15:32
by k.a
回答ありがとうございます。
タスクマネージャの事を知らなくて調べてみたら、こんなものがあるんだと関心しました。
やっぱり、コンピュータについて詳しくないと問題が発生した時の対処に困りますね。
コンピュータについて勉強しないと・・・

これからは、プログラミングしていて問題が発生した時、ソースとにらめっこをし
頑張ってその問題を解決したいと思います。

回答してくださったやそさん、管理人さん、tkmakwins15さん、Mistさん、本当にありがとうございます。