広告
広告
↓発売日:2017年04月04日↓
Java 第2版 入門編 ゼロからはじめるプログラミング (プログラミング学習シリーズ) 新品価格 |
今回はまっすぐ下にブロックを落下させたいと思います。
と言ってもただブロックの縦位置「block_y_count」の値を増やすだけなのでとても簡単です。
こちらがブロック落下用の関数になります。
void my_fall_block(){ block_y_count += block_speed; block_y = (int)(block_y_count / DRAW_BLOCK_WIDTH); }
落下のスピードを表す変数「float block_speed」を別に用意してそれを毎回足し合わせるカタチで落下させております。
そして気になるのは前回当たり判定用の縦位置と説明しました「block_y」の部分ですね。
これはSTGなど細かくピクセル単位で当たり判定をつける場合と違ってブロックパズルは基本的にはマス目単位での当たり判定で済ませる事ができるので、その現在のマス目にあたる値をブロックの幅で割る事によって算出して「block_y」に入れているというワケです。
あとはこのメソッドを「ゲームループ」に加えるだけですね。
広告
あらためてゲームループになります。
@Override public void handle(long time){ gc.clearRect(0,0,640,480); 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; } }
当たり判定がないのでどこまでもいってしまわないように下の壁についた時点で元に戻るよう制限をつけております。
ブロック落下!
前回はわかりやすいように「stage」の全体を表示しましたが今回から内側だけを描くようにします。
void my_draw_stage(){ for(int y=0;y<STAGE_HEIGHT - 2;y++){ for(int x=2;x<STAGE_WIDTH - 2;x++){ if(stage[y][x] == 1){gc.setFill(Color.RED); gc.fillText("■",x * DRAW_BLOCK_WIDTH,DRAW_POSITION_Y + y * DRAW_BLOCK_WIDTH);} else if(stage[y][x] == 9){gc.setFill(Color.WHITE); gc.fillText("■",x * DRAW_BLOCK_WIDTH,DRAW_POSITION_Y + y * DRAW_BLOCK_WIDTH);} } } }
配列を「for」文などで処理する時は配列の要素数を読み違えて配列の要素からはみ出る「バッファオーバーフロー」しないように注意が必要です。
ここまでの中間ソースになります。
それでは次回は左右の壁の当たり判定をつけたいと思います。
広告
↓発売日:2017年04月18日↓
Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで 新品価格 |
↓発売日:2016年06月25日↓
新品価格 |
↓発売日:2016年08月31日↓
新品価格 |
↓発売日:2018年11月21日↓
新品価格 |
↓発売日:2016年12月15日↓
新品価格 |
↓発売日:2016年09月28日↓
新品価格 |