文字が上手く表示されないです

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

文字が上手く表示されないです

#1

投稿記事 by ノエル » 10年前

C言語の勉強を兼ねてこちらの「龍神録の館」様を参考に東方風の弾幕ゲームを作成しています。
C言語を一度勉強したのですが長い間離れていたのでかなり忘れてしまっている状態で再び勉強しながら作成しています。
DXライブラリを今回初めて使うのでこちらも勉強しています。
ゲームの骨格を作っていてメニュー画面からゲーム画面や設定画面に移行できるようにしようと思い、「ゲームプログラミングの館」様から「メニュー画面の作り方」のソースコードを使わせて頂き書いてみたのですがメニューの文字が一瞬表示されてすぐ消えてしまいます。
原因は「CreateFontToHandle」を毎回呼び出してしまっている事は分かったのですが対処の仕方が分からずつまずいてしまっています。
対処の仕方のご教授頂けると有難いです。

Menu.cpp

コード:

#include "Menu.h"
#include "SceneMgr.h"
#include "DxLib.h"
#include "Keyboard.h"

const static int GAME_Y   = 240;    //「Game Start」文字のy位置
const static int CONFIG_Y = 270;    //「Option」文字のy位置
const static int MANUAL_Y = 300;    //「Manual」文字のy位置
const static int END_Y = 330;       //「Quit」文字のy位置

typedef enum{
    eMenu_Game,       //ゲーム
    eMenu_Config,    //設定
	eMenu_Manual,    //マニュアル 
	eMenu_End,       //終了
    eMenu_Num,       //本項目の数
} eMenu ;

static int NowSelect = eMenu_Game;    //現在の選択状態(初期はゲーム選択中)

//更新
void Menu_Update(){
    if(Keyboard_Get(KEY_INPUT_DOWN)==1){//下キーが押されていたら
        NowSelect = (NowSelect+1)%eMenu_Num;//選択状態を一つ下げる
    }
    if(Keyboard_Get(KEY_INPUT_UP)==1){//上キーが押されていたら
        NowSelect = (NowSelect+(eMenu_Num-1))%eMenu_Num;//選択状態を一つ上げる
    }
    if(Keyboard_Get(KEY_INPUT_RETURN)==1){//エンターキーが押されたら
        switch(NowSelect){//現在選択中の状態によって処理を分岐
        case eMenu_Game://ゲーム選択中なら
            SceneMgr_ChangeScene(eScene_Game);//シーンをゲーム画面に変更
            break;
        case eMenu_Config://設定選択中なら
            SceneMgr_ChangeScene(eScene_Config);//シーンを設定画面に変更
            break;
        }
    }
}

//描画
void Menu_Draw(){

		int Handle00,Handle01,Handle02,Handle03; // データハンドル格納数
		int Font00; //フォントハンドル格納変数

	    Handle00 = LoadGraph( "mydat/img/board/title1.png" ); // 画像をロード
		Handle01 = LoadGraph( "mydat/img/board/title2.png" ); // 画像をロード
		Handle02 = LoadGraph( "mydat/img/board/title3.png" ); // 画像をロード
		Handle03 = LoadGraph( "mydat/img/board/title4.png" ); // 画像をロード
		Font00 = CreateFontToHandle("メイリオ",15,3, DX_FONTTYPE_ANTIALIASING ) ;//"メイリオ"の15pt,太さ3のフォントを作成
        
		DrawGraph( 1, 1, Handle00, TRUE ); // データハンドルを使って画像を描画
		DrawGraph( 1, 1, Handle03, TRUE ); // データハンドルを使って画像を描画

		DrawFormatStringToHandle(280, GAME_Y,GetColor(0,0,0),Font00,"Game Start");
		DrawFormatStringToHandle(280, CONFIG_Y,GetColor(0,0,0),Font00,"Option");
		DrawFormatStringToHandle(280, MANUAL_Y,GetColor(0,0,0),Font00,"Manual");
		DrawFormatStringToHandle(280, END_Y,GetColor(0,0,0),Font00,"Quit");
	
    int y=0;
    switch(NowSelect){//現在の選択状態に従って処理を分岐
    case eMenu_Game://ゲームを選択中なら
        y=GAME_Y;    //ゲームの座標を格納
        break;
    case eMenu_Config://設定を選択中なら
        y=CONFIG_Y;    //設定の座標を格納
        break;
	case eMenu_Manual://マニュアルを選択中なら
        y=MANUAL_Y;    //マニュアルの座標を格納
        break;
	case eMenu_End://終了を選択中なら
        y=END_Y;    //終了の座標を格納
        break;
    }
	DrawStringToHandle(250, y,"→" ,GetColor(0,0,0),Font00);
}
最後に編集したユーザー ノエル on 2014年12月10日(水) 15:29 [ 編集 1 回目 ]

ノエル
記事: 3
登録日時: 10年前

Re: 文字が上手く表示されないです

#2

投稿記事 by ノエル » 10年前

操作を間違えて2回投稿していましました…片方のトピックを削除お願いできますでしょうか…?
申し訳ございません…

Rittai_3D
記事: 525
登録日時: 12年前

Re: 文字が上手く表示されないです

#3

投稿記事 by Rittai_3D » 10年前

初期化関数を作って一度だけ呼べばよいのではないでしょうか。
LoadGraph() , CreateFontToHandle() を Menu_Draw() 内に書く必要はありません。

Menu_Draw() を毎フレーム呼び出すわけではないのであれば無視してください。
初心者です

byu

Re: 文字が上手く表示されないです

#4

投稿記事 by byu » 10年前

表示云々の前に一つ指摘を。
Menu_Draw()の度にLoadGraph()、CreateFontToHandle()を呼ぶ必要はありますか?
オフトピック
あとこれはトピとは関係ないですが、座標を代入するswitchの部分に関して。

コード:

int coodinate_y[] = { 240, 270, 300, 330 };
と、enumに対応するインデックスにその座標を設定した配列を作っておけば

コード:

DramStringToHandle(250, coodinate_y[NowSelect], /* -- 省略 -- */);
だけで、switchを使わず処理出来ると思いますよ。
(多分合ってるはず…)

ノエル
記事: 3
登録日時: 10年前

Re: 文字が上手く表示されないです

#5

投稿記事 by ノエル » 10年前

3D_3Dさん・byuさんのご指摘によりMenu_Draw()外に書いたところ表示されました。

記述する場所に問題があったんですね…教本や調べて理解する事ができました。
ご教授ありがとうございました。

閉鎖

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