新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]の"選択画面を作ってみよう"を利用して自分なりに書いてみました。
main.cpp
#include "DxLib.h"
#include <stdio.h>
#include <stdlib.h>
static int Key[256]; // キーが押されているフレーム数を格納する
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey );//全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 )//i番のキーコードに対応するキーが押されていたら
Key[i]++; //加算
else
Key[i] = 0; //0にする//押されていなければ
}
return 0;
}
typedef struct{
int x,y; //座標
int color; //文字の色
char music_name[128];//ぶんかちょうは6曲しかない
}music_t;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
int Font01 = CreateFontToHandle("平成ゴシック",16,16,DX_FONTTYPE_ANTIALIASING_EDGE_8X8,-1,1,0,-1);//フォント
int img_back01 = LoadGraph("title03a.png"); //背景その1
int img_back02 = LoadGraph("title03b.png"); //背景その2
int WHITE = GetColor(130,105,105); //色
int YELLOW= GetColor(240,210,210); //GetColorの引数が白、黄色じゃないのは無視してください
int fp = FileRead_open("music.txt"); //ファイルを開く
int i=0;
char buf[128];
if(fp == NULL){ //ファイルが無ければ
MessageBox(NULL,TEXT("ファイルが存在しません"),TEXT("警告"),MB_OK|MB_ICONERROR);
return -1; //戻り値 -1
}
for(i=0;i<4;i++)//最初の4行は飛ばす
while(FileRead_getc(fp)!='\n');
music_t music[6] = { // 構造体にこの順番で入れていく
{ 60, 130, YELLOW, "No.1 天狗の手帖 ~ Mysterious Note"},
{ 65, 150, WHITE , "No.2 風の循環 ~ Wind Tour" },
{ 65, 170, WHITE , "No.3 天狗が見ている ~ Black Eyes" },
{ 65, 190, WHITE , "No.4 東の国の眠らない夜" },
{ 65, 210, WHITE , "No.5 レトロスペクティブ京都" },
{ 65, 230, WHITE , "No.6 風神少女" },
};
int SelectNum=0; //現在選択中の
while(!ProcessMessage() && !ClearDrawScreen() && !gpUpdateKey() && !CheckHitKey(KEY_INPUT_ESCAPE)){
if( Key[ KEY_INPUT_DOWN ] == 1 || (Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){ // キーが押された処理
SelectNum = ( SelectNum + 1 ) % 6; // 現在の選択項目を一つ下にずらす(ループする)
}
if(Key[ KEY_INPUT_UP ] == 1 || (Key[KEY_INPUT_UP]%5==0 && Key[KEY_INPUT_UP]>30)){
SelectNum = (SelectNum +5 ) % 6; //上にずらす
}
if(Key[ KEY_INPUT_UP ] == 1 || Key[ KEY_INPUT_DOWN ] == 1 ||(Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30) ||
(Key[KEY_INPUT_UP]%5==0 && Key[KEY_INPUT_UP]>30)){
for( int i=0; i<6; i++ ){ // メニュー項目数である5個ループ処理
if( i == SelectNum ){ // 今処理しているのが、選択番号と同じ要素なら
music[i].color = YELLOW; // 色を帰る
music[i].x = 60; // 座標を買える
} else { // 今処理しているのが、選択番号以外なら
music[i].color = WHITE; // 色を変える
music[i].x = 65; // 座標を替える
}
}
}
// 描画フェーズ
DrawGraph( 0,0,img_back01,TRUE); // 画像を描写
DrawGraph(512,0,img_back02,TRUE); // 同上
for(i=0; i<6; i++ ){ // 項目を描画
DrawStringToHandle(music[i].x,music[i].y,music[i].music_name,music[i].color,Font01);
}
if(strchr(buf,'#')==NULL){
DrawFormatString(65,320+18*i,YELLOW,"%s",buf);
i++;
}
ScreenFlip();
}
FileRead_close(fp);
// 終了処理
DxLib_End();
return 0;
}
music.txt
コメントは6行づつで区切ります。
# 曲のコメント
# この記号でコメント
#
コメント1
コメント
コメント
コメント
コメント
コメント
コメント2
コメント
コメント
コメント
コメント
コメント
コメント3
コメント
コメント
コメント
コメント
コメント
コメント4
コメント
コメント
コメント
コメント
コメント
コメント5
コメント
コメント
コメント
コメント
コメント
コメント6
コメント
コメント
コメント
コメント
コメント
音楽を再生する(まだその部分はまだ作っていません)プログラムを書きたいのですが、「フフフフフフフフフフフフフフフ」と表示されます。
また、"No.2 風の循環 ~ Wind Tour"を選択し、zキーが押されたら"コメント2"を表示...としたいのですが、
プログラムの書き方が全く分かりません。どの様に書けばよいかお教え願います.
分かりづらいと思いますので、参考画像を添付しておきます。
これまた汚いコードですが、宜しくお願いします。
P.S
>>soft屋様
前回はインデントの方法を教えてくださり有難うございました。
これでかなり楽になりました。
[追記]
すいません。開発環境を書いていませんでした。
Windows XP
VC2008EE