どうもこんにちはZEROXEと申します。
今回始めて投稿させていただきます。
ここ最近ゲームプログラミングの館を見つけてDxLibを使ってのプログラミングを始めたものです。
昔からゲームが作りたくてC言語とかも少しかじったんですが挫折していまいして、
DxLibを使えばなんとか作れるかもしれないと思ってサイトに1度目を通しました。
タイトル画面でつまずいてインターネットを検索するもいい方法が見つかりませんでした。
Yahoo!の掲示板にも書き込んだんですがどうしても上手くいかなかったので、
この掲示板に書き込みました。※
2.質問文
では本題に移りますが、今回はノベルゲームを作ろうと思いまして下のコードを分からないところは
インターネットで調べて作っていたのですが、タイトル画面のところでつまずいてしまいました。
このプログラムは、先ずPlease Start Enterkeyという文字を起動直後の画面で点滅表示してから
エンターキーが入力されたら選択画面を表示するプログラムです。
一応画像は自分で作ったものを使っていますので自作の画象の部分は画象と書き直してあります。
分からないところはここからなんですが、選択画面のところで文字を上下キーで選択した後に、
エンターキーを押したときに、New GameやLOADなどのイベントを発生させるにはどうしたら良いのでしょうか?
もう一つ質問なのですが、ゲームなどの音量設定や画面をフルスクリーンやウィンドウモードなどを、
ゲームの設定画面のようにプレイヤーが変更するにはどうしたらよいのでしょうか?
3.C言語についての知識
C言語の知識は、新ゲームプログラミングの館を1度見まして、昔C言語の本を1冊読んだ程度です。
他 VBA HSPもやってみましたが、挫折しました。
C言語は、コンソールアプリケーションでは少しかけるのですがWindows API が難しく諦めていたところ
新ゲームプログラミングの館を見つけたというわけです。
※コンソールアプリケーションでは簡単な計算機を作ることは出来ますが複雑な処理などはできません。
自分でインターネットで探して作ったプログラムです。
4.環境
一応環境も書いておきます。
OSはWindows 7 64bit・ソフトはMicrosoft visual C++ Express edition・ライブラリはDxLibです。
5.自分で作ったプログラム
#include "DxLib.h"
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; // 座標格納用変数
char name[128]; // 項目名格納用変数
} MenuElement_t ;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE); //ウィンドウモード!! TRUEでウィンドウ FALSEでフルスクリーン
SetMainWindowText("タイトル");//ウィンドウタイトルの設定
DxLib_Init(); // DXライブラリ初期化処理
int White,Black,Pink,Count=0,Font00,Handle000,Handle003;//変数群
White = GetColor( 255, 255, 255);//白色
Black = GetColor( 0, 0, 0);//黒色
Pink = GetColor( 255, 0, 93);//ピンク?
SetFontSize(21);//文字の大きさ
SetDrawMode( DX_DRAWMODE_NEAREST ) ;//ネアレストネイバー法とバイリニア法との変更
Font00= CreateFontToHandle( NULL, 40, 0, -1); //フォント変更
Handle000= LoadGraph("画象"); //画像をロード
Handle003= LoadGraph("画象"); //画像をロード
//初期画面①の文字点滅処理プログラム
while(1){
if( ProcessMessage() == -1)break ;//エラーが起きたらループを抜ける
ClearDrawScreen();//描いてあるものを消す
DrawRotaGraph( 325, 300, 1.0, 0.0, Handle000, TRUE );//データハンドルを使っての画像描画
if( Count%120 < 60 )//2秒のうち最初の1秒なら
DrawFormatString( 190,360,White,"Please Start Enterkey");//文字表示
if( CheckHitKey( KEY_INPUT_RETURN ) == 1 ){//EnterKeyが押されていれば
break;//無限ループ通過
}
Count++;
ScreenFlip();
}
//メニュー項目要素を作る
MenuElement_t MenuElement[5]={
{ 460, 100, "New Game"},//タグの中身の順番で格納される。
{ 480, 150, "LOAD"},
{ 480, 200, "EXTRA"},
{ 480, 250, "System"},
{ 480, 300, "END"},
};
int SelectNum = 0;//現在の選択番号
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
// 計算フェーズ
if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 下キーが押された瞬間だけ処理
SelectNum = ( SelectNum + 1 ) % 5; // 現在の選択項目を一つ下にずらす(ループする)
}
if( Key[ KEY_INPUT_UP ] == 1 ){ // 上キーが押された瞬間だけ処理
SelectNum = ( SelectNum + 4 ) % 5; // 現在の選択項目を一つ上にずらす(逆ループする)
}
if( Key[ KEY_INPUT_DOWN ] == 1 || Key[ KEY_INPUT_UP ] == 1 ){ // 下キーか、上キーが押された瞬間
for( int i=0; i<5; i++ ){ // メニュー項目数である5個ループ処理
if( i == SelectNum ){ // 今処理しているのが、選択番号と同じ要素なら
MenuElement[i].x = 460; // 座標を460にする
} else { // 今処理しているのが、選択番号以外なら
MenuElement[i].x = 480;// 座標を480にする
}
}
}
// 描画フェーズ
for( int i=0; i<5; i++ ){ // メニュー項目を描画
DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;//ネアレストネイバー法とバイリニア法との変更
DrawRotaGraph( 280, 150, 0.5, 0.0, Handle003, TRUE );//データハンドルを使っての描画
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}