広告
↓発売日:2018年09月22日↓
新品価格 |
今回はまっすぐ下にブロックを落下させたいと思います。
と言ってもただブロックの縦位置「block_y_count」の値を増やすだけなのでとても簡単です。
それでは落下処理に入る前にそのままでは再描画の際に前のデータが残ったままになってしまうので、前のデータを消去→再描画を繰り返すいわゆるゲームループを作ります。
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); my_init_var(); while(ProcessMessage() == 0){ ClearDrawScreen(); my_make_block(); my_draw_back(); my_draw_variable(); my_draw_block(); my_draw_stage(); ScreenFlip(); } DxLib_End(); return 0; }
前回のメインにゲームループを加えたものになります。
「my_init_var()」で初期化した後「while()」文によって繰り返しになっているのが確認できるかと思います。
ここで前のデータを消去する関数にあたるのが「ClearDrawScreen()」になります。
あと「while()」文の条件にある「ProcessMessage()」というのはマルチタスク環境下において別のプログラムと適切に連携をとる為の関数になります。
「0」以外が返ってきた場合はエラーになるので即ループを抜けてプログラムを終了します。
このあたりは前回同様DXライブラリでプログラムを組む時のおきまりの手順のようなものなのでセットで覚えてしまいましょう。
それではここに落下処理を加えていきます。
広告
こちらがブロック落下用の関数になります。
void my_fall_block(){ block_y_count += block_speed; block_y = block_y_count / DRAW_BLOCK_WIDTH; }
落下のスピードを表す変数「float block_speed」を別に用意してそれを毎回足し合わせるカタチで落下させております。
そして気になるのは前回当たり判定用の縦位置と説明しました「block_y」の部分ですね。
これはSTGなど細かくピクセル単位で当たり判定をつける場合と違ってブロックパズルは基本的にはマス目単位での当たり判定で済ませる事ができるので、その現在のマス目にあたる値をブロックの幅で割る事によって算出して「block_y」に入れているというワケです。
あとはこの関数を「メイン」に加えるだけですね。
あらためてメインになります。
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); my_init_var(); while(ProcessMessage() == 0){ ClearDrawScreen(); my_make_block(); my_draw_back(); my_draw_variable(); my_draw_block(); my_draw_stage(); my_fall_block(); if(block_y_count > DRAW_BLOCK_WIDTH * 17){ block_y_count = 0; block_y = 0; } ScreenFlip(); } DxLib_End(); return 0; }
当たり判定がないのでどこまでもいってしまわないように下の壁についた時点で元に戻るよう制限をつけております。
ブロック落下!
前回はわかりやすいように「stage[23][18]」の全体を表示しましたが今回から内側だけを描くようにします。
void my_draw_stage(){ int x,y; for(y=0;y<STAGE_HEIGHT - 2;y++){ for(x=2;x<STAGE_WIDTH - 2;x++){ if(stage[y][x] == 1)DrawFormatString(x * DRAW_BLOCK_WIDTH, y * DRAW_BLOCK_WIDTH,Color_Red,"■"); else if(stage[y][x] == 9)DrawFormatString(x * DRAW_BLOCK_WIDTH, y * DRAW_BLOCK_WIDTH,Color_Black,"■"); } } }
配列を「for」文などで処理する時は配列の要素数を読み違えて配列の要素からはみ出る「バッファオーバーフロー」しないように注意が必要です。
ここまでの中間ソースになります。
それでは次回は左右の壁の当たり判定をつけたいと思います。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |