プログラミング初心者です。メニューの選択肢の文字を縁取りしたいのですが、一瞬表示されたりそもそも表示されなかったりしてなかなか解決できません!
どうすればうまく表示されますか?
一応↓が今のプログラムです
#include "DxLib.h"
#define SCREEN_WIDTH 1920
#define SCREEN_HEIGHT 1080
int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey() {
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
for (int z = 0; z < 256; z++) {
if (tmpKey[z] != 0) { // z番のキーコードに対応するキーが押されていたら
Key[z]++; // 加算
}
else { // 押されていなければ
Key[z] = 0; // 0にする
}
}
return 0;
}
// 画面状態の定数
enum {
STATE_TITLE, //タイトル画面
STATE_SELECT, //選択画面
STATE_MAIN, //メイン画面
STATE_BOUNUS, //ボーナスステージ
STATE_END, //ゲーム終了
};
//-------------------------------------------------
// タイトル画面
//-------------------------------------------------
int title()
{
int Font = CreateFontToHandle("MS ゴシック", 50, 5, DX_FONTTYPE_EDGE); //"MSゴシック"の25pt,太さ5のフォントを作成
DrawStringToHandle( 150, 200, "Please Push Z", GetColor(255,255,255), Font );
if(Key[KEY_INPUT_Z]==1) return TRUE; //Zが押されたらTRUE
return FALSE; //Zが押されなければFALSE
}
//-------------------------------------------------
// 選択画面
//-------------------------------------------------
// メニュー項目の表示に必要な構造体を用意する
typedef struct{
int x, y; // 座標格納用変数
char name[128]; // 項目名格納用変数
} MenuElement_t ;
// 選択画面
int select()
{
// メニュー項目要素
#define SELECT_NUM 4
SetFontSize(50);
int handle = CreateFontToHandle(NULL, 40, 3, DX_FONTTYPE_EDGE, -1, 4 ) ;
static MenuElement_t MenuElement[SELECT_NUM] = {
{ 760, 600, "GAME START" },
{ 800, 700, "BOUNUS"},
{ 800, 800, "BACK TO TITLE" },
{ 800, 900, "EXIT" },
};
static int SelectNum = 0; // 現在の選択番号
// 計算フェーズ
if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 下キーが押された瞬間だけ処理
SelectNum = ( SelectNum + 1 ) % SELECT_NUM; // 現在の選択項目を一つ下にずらす(ループする)
}
if( Key[ KEY_INPUT_UP ] == 1 ){ // 上キーが押された瞬間だけ処理
SelectNum = ( SelectNum + SELECT_NUM - 1 ) % SELECT_NUM; // 現在の選択項目を一つ上にずらす(逆ループする)
}
if( Key[ KEY_INPUT_DOWN ] == 1 || Key[ KEY_INPUT_UP ] == 1 ){ // 下キーか、上キーが押された瞬間
for( int i=0; i<SELECT_NUM; i++ ){ // メニュー項目数である4個ループ処理
if( i == SelectNum ){ // 今処理しているのが、選択番号と同じ要素なら
MenuElement[i].x = 760; // 座標を760にする
handle;
} else { // 今処理しているのが、選択番号以外なら
MenuElement[i].x = 800;// 座標を800にする
handle;
}
}
}
// 描画フェーズ
for( int i=0; i<SELECT_NUM; i++ ,handle){ // メニュー項目を描画
ChangeFont("けいふぉんと");
DrawString(MenuElement[i].x, MenuElement[i].y , MenuElement[i].name, GetColor(255, 255, 0),handle);
}
DrawString(60,100,"選択画面 (上下で選んで、Zで決定)",GetColor(255,255,255));
// Zボタンで選択
if(Key[KEY_INPUT_Z]==1) {
switch( SelectNum ) {
case 0://ゲームスタート
return STATE_MAIN;
break;
case 1://ボーナス
return STATE_BOUNUS;
break;
case 2://タイトルに戻る
return STATE_TITLE;
break;
case 3://ゲーム終了
return STATE_END;
break;
}
}
return STATE_SELECT; //状態継続
}
//-------------------------------------------------
// ゲームメイン
//-------------------------------------------------
int x=10, y=10;
// ゲームメイン
int gmain()
{
DrawFormatString( x, y, GetColor(0,255,255), "座標[%d,%d]", x, y ); // 文字を描画する
x = x + 2; // x座標を2加算
y = y + 1; // y座標を1加算
if(Key[KEY_INPUT_Z]==1) return TRUE; //Zが押されたらTRUE
return FALSE; //Z押されなければFALSE
}
int img[5];
// ボーナス
int gbounus()
{
DrawFormatString(x, y, GetColor(0, 255, 255), "座標[%d,%d]", x, y); // 文字を描画する
x = x + 2; // x座標を2加算
y = y + 1; // y座標を1加算
if (Key[KEY_INPUT_Z] == 1) return TRUE; //Zが押されたらTRUE
return FALSE; //Z押されなければFALSE
}
//-------------------------------------------------
// メインループ
//-------------------------------------------------
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(false),
DxLib_Init(),
SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
int Font = CreateFontToHandle("MS ゴシック", 25, 5, DX_FONTTYPE_ANTIALIASING_EDGE); //"MSゴシック"の25pt,太さ5のフォントを作成
int BGM;
int fBGM;
BGM = LoadSoundMem("th06_01.wav");
PlaySoundMem(BGM, DX_PLAYTYPE_LOOP, TRUE);
SetGraphMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16);
SetMainWindowText("眞倭伝");
// 透過色の指定
SetTransColor(128, 132, 220);
// 画像読み込み
img[0] = LoadGraph("otamesi.png");
img[1] = LoadGraph("Hotamesi.png");
// 現在の状態
int state = STATE_TITLE;
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && (state != STATE_END)) {
DrawExtendGraph(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, img[0], FALSE);
switch (state) {
case STATE_TITLE: //タイトル画面
// タイトル
if (title()) {
// なにか押されたら選択画面へ
state = STATE_SELECT;
}
break;
case STATE_SELECT: //選択画面
// 選択画面
state = select();//戻りが画面状態
x = 10;
y = 10;
break;
case STATE_MAIN: //メイン画面
StopSoundMem(BGM);
DrawExtendGraph(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, img[1], FALSE);
// ゲームメイン
if (gmain()) {
// 終了したらタイトルへ
state = STATE_TITLE;
}
break;
case STATE_BOUNUS: //ボーナス
DrawExtendGraph(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, img[1], FALSE);
if (gbounus()) {
x = 10;
y = 10;
state = STATE_TITLE;
}
break;
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;