龍神録、死んだ回数をカウントするプログラムについて

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

龍神録、死んだ回数をカウントするプログラムについて

#1

投稿記事 by 青成 » 13年前

龍神録プログラミングの館様のサイトでC++の勉強をしているものです。

今の所、22:ボムを撃ってみようの所まで来ました。


自分でも何か作ってみようという事で、死んだ回数をカウントするプログラムを組もうと思っています。

そこで、GV.hにGLOBAL int dethcount;を書いて、out.cppの一部に

コード:

//敵ショットと自機との処理
void enemyshot_and_ch(){
    int s,n;
    for(s=0;s<SHOT_MAX;s++){//敵ショット総数
        if(shot[s].flag>0){//そのショットが登録されていたら
            for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
                if(shot[s].bullet[n].flag==1){//弾が登録されていたら
                    if(out_judge_enemyshot(s,n)){//自機にその弾が接触していたら
                        shot[s].bullet[n].flag=0;//弾をオフ

                        /*喰らいボム処理をここに追加*/

                        if(ch.flag==0 && ch.mutekicnt==0){//ステータスが通常で、無敵じゃなかったら
                            ch.flag    =2;    //1:喰らいボム受付中 2:死んで浮き上がり中
                            ch.cnt    =0;
                            se_flag[3]=1;//ピチュり音
		[color=#FF0000]dethcount++; //死んだ回数をカウントする[/color]
                            return;
                        }
                    }
                }
            }
        }
    }
}
を書いて、graph.cppの一部に

コード:

void graph_board(){
        DrawGraph(  0,  0,img_board[10],FALSE);
        DrawGraph(  0, 16,img_board[11],FALSE);
        DrawGraph(  32,464,img_board[12],FALSE);
        DrawGraph(416,  0,img_board[20],FALSE);
		DrawFormatString( 450,100,GetColor( 0, 255, 0 ), "当たった回数[%d]", dethcount ); // あたった回数を表示する
		
		 FontHandle = CreateFontToHandle("MS 明朝" , 22 , 5, DX_FONTTYPE_NORMAL);
		  DrawFormatStringToHandle( 450 , 150 , GetColor(0,255,255) , FontHandle , "あたった回数[%d]" , dethcount ) ; //当たった回数を表示する
}
を書きました。
DrawFormatStringの方はちゃんと死んだ回数をカウントして表示してくれましたが、DrawFormatStringToHandleの方は実行してから文字が一瞬だけ表示されてすぐに消えてしまいます。
DrawFormatStringの方は文字が安っぽい感じがするので、フォントを指定できるDrawFormatStringToHandleを使いたいです。

どうしてDrawFormatStringToHandleの方は一瞬だけ文字が表示されてすぐに消えるんでしょう?
また、解決策は何かありますか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 龍神録、死んだ回数をカウントするプログラムについて

#2

投稿記事 by みけCAT » 13年前

「一瞬」ってどのくらいでしょうか?
フォントの作りすぎではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

青成

Re: 龍神録、死んだ回数をカウントするプログラムについて

#3

投稿記事 by 青成 » 13年前

一瞬は0.5秒くらいです。
フォントは一つしか指定していません・・・

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 龍神録、死んだ回数をカウントするプログラムについて

#4

投稿記事 by みけCAT » 13年前

このコードだと、graph_board関数を呼ぶたびにフォントを作成しています。
DxLib.h (バージョン3.10aのもの)をみると、

コード:

#define MAX_FONT_NUM								(40)				// 同時に持てるフォントハンドルの最大数
とあります。すなわち、フォントは40個までしか同時に作れないということです。
0.5秒ということは30フレームくらいなので、きれいに理論と一致していますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 龍神録、死んだ回数をカウントするプログラムについて

#5

投稿記事 by Dixq (管理人) » 13年前

CreateFontToHandleは最初の一回でよいです。
このままではフォントを一秒間に60回作っては表示を繰り返しています。Deleteもしていないので勢いよくメモリリークしているでしょう。
(訂正:生成に失敗するので、生成に失敗し始めてからはリークしませんね)
ためしにCreateフォントしないでやってみてください。正常に表示されるはずです。

また、提示された場所でカウントするとのちに喰らいボムの仕組みを作った時にバグが生じるので気を付けてください。

喰らう→死にカウントがカウントアップ→ボム打つのが間に合う→結果死んでないので死にカウントがずれる

という感じです。

青成

Re: 龍神録、死んだ回数をカウントするプログラムについて

#6

投稿記事 by 青成 » 13年前

つまり、 FontHandle = CreateFontToHandle("MS 明朝" , 22 , 5, DX_FONTTYPE_NORMAL); を書く場所が間違っているという事ですか?

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 龍神録、死んだ回数をカウントするプログラムについて

#7

投稿記事 by Dixq (管理人) » 13年前

そうです。
初期化する時等、最初の一回しか通らない場所に書いてください。

青成

Re: 龍神録、死んだ回数をカウントするプログラムについて

#8

投稿記事 by 青成 » 13年前

できました!
FontHandleをグローバル変数にして、

main.cppに

if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化


FontHandle = CreateFontToHandle("MS 明朝" , 22 , 5, DX_FONTTYPE_NORMAL);

while(ProcessLoop()==0){//メインループ 以下略

のように書いたら正常に動作しました。

本当にありがとうございます><

閉鎖

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