トップページ > 過去ログ > 記事閲覧
スロットについて
名前:DX初心者です 日時: 2010/02/01 14:08

現在、スロットゲームを作ろうとしてるんですが、どうも描画が上手く出来ないのとボタン入力が上手く出来ないので、ここに書かして貰いました。 ↓問題のソース #include "DxLib.h" const int KOMA_WIDTH = 51; //1コマの幅 const int KOMA_HEIGHT = 18; //1コマの高さ const int GAP = 2; //リール間のギャップ(各リールの左右) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ int hHandle , nHandle ,mHandle ; //グラフィックハンドル int hidariIndex[3];//現在の上段インデックス int nakaIndex[3]; int migiIndex[3]; bool startFlag = false; //回転フラグ(trur:回転、false:停止) ChangeWindowMode(true); SetMainWindowText("eva"); if(DxLib_Init() == -1){ return -1; } SetGraphMode((KOMA_WIDTH + GAP * 2) * 3, KOMA_HEIGHT * 3, 32); //ウインドウサイズの変更 hHandle = LoadGraph("hidari.bmp"); SetDrawScreen(DX_SCREEN_BACK); for(int i=0; i<3; i++){ hidariIndex[i] = 5; } nHandle = LoadGraph("naka.bmp"); SetDrawScreen(DX_SCREEN_BACK); for(int j=0; j<3; j++){ nakaIndex[j] = 5; } mHandle = LoadGraph("migi.bmp"); SetDrawScreen(DX_SCREEN_BACK); for(int x=0; x<3; x++){ migiIndex[x] = 5; } /*メインループ開始*/ while(ProcessMessage() == 0){ //ループ処理 if(CheckHitKey(KEY_INPUT_ESCAPE) == 1){ break; } //左リール if(CheckHitKey(KEY_INPUT_Z) == 1){ //Zキーが押されたとき if(startFlag){ startFlag = false; //回転中なら停止させる }else{ startFlag = true; //停止中なら回転させる } } if(startFlag){ //回転フラグが立っているとき for(int i=0; i<3; i++){ //現在のインデックスを+1する hidariIndex[i] ++; if(hidariIndex[i] > 20){ //現在のインデックスが20を上回るとき hidariIndex[i] = 0; //0にする } } } ClearDrawScreen(); //バッファをクリアする for(int i=0; i<3; i++){ DrawRectGraph(GAP + (KOMA_WIDTH + GAP * 2) * i, 0, //画像の任意の矩形部分を表示 KOMA_WIDTH * i, (20 - hidariIndex[i]) * KOMA_HEIGHT, KOMA_WIDTH, 3 * KOMA_HEIGHT, hHandle, false, false); } //中リール if(CheckHitKey(KEY_INPUT_X) == 1){ //Xキーが押されたとき if(startFlag){ startFlag = false; //回転中なら停止させる }else{ startFlag = true; //停止中なら回転させる } } if(startFlag){ //回転フラグが立っているとき for(int j=0; j<3; j++){ //現在のインデックスを+1する nakaIndex[j] ++; if(nakaIndex[j] > 20){ //現在のインデックスが20を上回るとき nakaIndex[j] = 0; //0にする } } } ClearDrawScreen(); //バッファをクリアする for(int j=0; j<3; j++){ DrawRectGraph(GAP + (KOMA_WIDTH + GAP * 2) * j+ 55 , 0, //画像の任意の矩形部分を表示 KOMA_WIDTH * j, (20 - nakaIndex[j]) * KOMA_HEIGHT, KOMA_WIDTH, 3 * KOMA_HEIGHT, nHandle, false, false); } //右リール if(CheckHitKey(KEY_INPUT_C) == 1){ //Cキーが押されたとき if(startFlag){ startFlag = false; //回転中なら停止させる }else{ startFlag = true; //停止中なら回転させる } } if(startFlag){ //回転フラグが立っているとき for(int x=0; x<3; x++){ //現在のインデックスを+1する migiIndex[x] ++; if(migiIndex[x] > 20){ //現在のインデックスが20を上回るとき migiIndex[x] = 0; //0にする } } } ClearDrawScreen(); //バッファをクリアする for(int x=0; x<3; x++){ DrawRectGraph(GAP + (KOMA_WIDTH + GAP * 2) * x + 110 , 0, //画像の任意の矩形部分を表示 KOMA_WIDTH * x, (20 - migiIndex[x]) * KOMA_HEIGHT, KOMA_WIDTH, 3 * KOMA_HEIGHT, mHandle, false, false); } ScreenFlip(); WaitTimer(100); } /*メインループ終了*/ DxLib_End(); return 0; } この状態で起動すると、右リールしか表示されなくて、ボタンもZ・X・Cどれでも止まってしまうのですがどうすれば良いでしょうか? 誰か解りやすく教えてもらえないでしょうか?

Page: 1 |

Re: スロットについて ( No.1 )
名前:Masao 日時:2010/02/01 14:41

無駄あり SetDrawScreen(DX_SCREEN_BACK); は1回のみで十分。 ClearDrawScreen(); //バッファをクリアする は、ScreenFlip()の直後1回のみ実行すること。 なぜかはリファレンスを見ましょう。 特にこのふたつの関数については、リファレンスを読み直してください。 >この状態で起動すると、右リールしか表示されなくて、 さきほどいったようにScreenFlip()するまえにバッファクリアしてるからです。 止まってしまうのもあたりまえです。 if(CheckHitKey(KEY_INPUT_X) == 1){ //Xキーが押されたとき if(startFlag){ startFlag = false; //回転中なら停止させる }else{ startFlag = true; //停止中なら回転させる } } これは  Xキーが押されたとき ではなく  Xキーが押されている間 です。 つまり押している間は毎フレーム呼び出されます。 このコードでは startFlag を true, false, true, false と、繰り返します。 WaitTimer(100) なので、キーをひとつ押していれば0.1秒ごとにtrue false がひっくりかえります。 それから、Z,X,Cを分ける意味はあるのでしょうか? 中身ではまったく同じ処理をやっているようにみえます。 あと追加ですが、WaitTimer はそんなふうに使ってはいけません。 違反ではないですが、スムーズな動きをするゲームを作りたいならば、それを使わない方が無難です。 http://dixq.net/g/ ココに誘導するのもあれですが、こちらを読むといいとおもいますよ。
Re: スロットについて ( No.2 )
名前:DX初心者です 日時:2010/02/01 15:40

指摘された所を直してみたら大分形になってきました。 ありがとう御座います。 また、行き詰ったら質問するかもしれませんが、頑張って行きたいと思います・

Page: 1 |