トップページ > 記事閲覧
メニューの縁取りについて
名前:K3 日時: 2022/09/09 22:28

プログラミング初心者です。メニューの選択肢の文字を縁取りしたいのですが、一瞬表示されたりそもそも表示されなかったりしてなかなか解決できません! どうすればうまく表示されますか? 一応↓が今のプログラムです #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;
メンテ

Page: 1 |

Re: メニューの縁取りについて ( No.1 )
名前:管理人 日時:2022/09/10 03:25

すみません、『選択肢の文字を縁取りしたい』についてもう少し具体的にご説明いただけないでしょうか? ( 見た目的にどのようなものを想定されているのでしょうか? )
メンテ
Re: メニューの縁取りについて ( No.2 )
名前:K3 日時:2022/09/11 10:21

見た目は、選択肢の黄色のフォントを白や黒で縁取りしたいのですがChangeFontTypeやCreateFontToHandleを使っても うまく縁取りされなかったり、そもそも表示されなかったり、惜しいところだと縁取りされた文字が一瞬だけ表示されてそれ以降、 表示されなくなってしまいました。
メンテ
Re: メニューの縁取りについて ( No.3 )
名前:たろう 日時:2022/09/11 15:34

K3さんのプログラムのうち、お困りになっている内容と関係のない部分(サウンドや画像など)を削ると下のようになりました。 以下の点が問題があるように思いましたので、その点を修正してあります。 ・SetGraphModeはフォントハンドルを削除してしまうので、CreateFontToHandleはSetGraphModeより後ろに作る ・毎ターン呼ばれるtitle()やselect()にCreateFontToHandleが入っているので、毎ターンフォントハンドルを作ってしまっている(たぶん) ・DrawStringToHandleを使わないと作成したフォント(エッジ付き)を使えないのにDrawStringが使われている ・DrawFormatStringToHandleを使わないと作成したフォント(エッジ付き)を使えないのにDrawFormatStringが使われている すみません、あまり全体を把握せず手を加えたので そのまま使うと問題あるかもしれませんm(__)m -------------------------------------------------------------------------------- #include "DxLib.h" #define SCREEN_WIDTH 1920 #define SCREEN_HEIGHT 1080 int Key[256]; int gpUpdateKey(){char t[256]; GetHitKeyStateAll(t); for(int z = 0; z < 256; z++){ if(t[z]!=0){Key[z]++;}else{Key[z]=0;}} return 0;} enum { STATE_TITLE, STATE_SELECT, STATE_MAIN, STATE_BOUNUS, STATE_END, }; typedef struct{ int x,y; char name[128];} MenuElement_t ; int font[3]; int title() { DrawStringToHandle( 150, 200, "Please Push Z", GetColor(255,255,255), font[1] ); if(Key[KEY_INPUT_Z]==1)return 1; return 0; } int select() { #define SELECT_NUM 4 SetFontSize(50); 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++ ){ if( i== SelectNum ){MenuElement[i].x=760;} else {MenuElement[i].x=800;} } } for( int i=0; i<SELECT_NUM; i++) { DrawStringToHandle(MenuElement[i].x, MenuElement[i].y , MenuElement[i].name, GetColor(255,255,0),font[2]); } DrawStringToHandle(60,100,"選択画面 (上下で選んで、Zで決定)",GetColor(255,255,255),font[2]); 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() { DrawFormatStringToHandle( x, y, GetColor(0,255,255),font[2], "座標[%d,%d]", x, y ); if(Key[KEY_INPUT_Z]==1)return 1; return 0; } // ボーナス int gbounus() { DrawFormatStringToHandle(x, y, GetColor(0,255,255),font[2], "座標[%d,%d]", x, y); x+=2; y++; if(Key[KEY_INPUT_Z]==1)return 1; return 0; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); SetGraphMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16); SetWindowSize(SCREEN_WIDTH*0.7, SCREEN_HEIGHT*0.7); font[0]=CreateFontToHandle("MS ゴシック", 25, 5, DX_FONTTYPE_ANTIALIASING_EDGE); font[1]=CreateFontToHandle("MS ゴシック", 50, 5, DX_FONTTYPE_EDGE); font[2]=CreateFontToHandle(NULL , 40, 3, DX_FONTTYPE_EDGE, -1, 4 ) ; int state = STATE_TITLE; while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && (state != STATE_END)) { DrawBox(0,0,SCREEN_WIDTH, SCREEN_HEIGHT,GetColor(0,200,200),1); switch (state) { case STATE_TITLE: if (title()) { state =STATE_SELECT; } break; case STATE_SELECT: state =select(); x=10;y=10; break; case STATE_MAIN: if (gmain()) { state =STATE_TITLE; } break; case STATE_BOUNUS: if (gbounus()) {x = 10; y = 10; state =STATE_TITLE; } break; } } DxLib_End(); // DXライブラリ終了処理 return 0; }
メンテ
Re: メニューの縁取りについて ( No.4 )
名前:K3 日時:2022/09/11 18:18

たろうさんありがとうございます! おかげで解決することができました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存