HSP3 ゲームのプログラミング
 ブロック・ゲーム制作 前へ 目次へ 次へ 

(1) 計画

 ブロック・ゲームとは、ブロック崩しである。図のように、ラケットゲームの画面にブロックを表示して、ボールでブロックを消していくゲームとする。得点は、ブロック1個につき10点とする。


○ ブロックの描画
 ブロックは、@画像を用意して、gcopy命令で描画する方法、Aboxf命令で描画する方法、が考えられる。どちらの方法でも、ブロックの配置座標、ブロックの有無を情報として格納する配列が必要である。配置座標をbx, by、有無をbfとすると次のような描画処理になる。

  @gcopy Aboxf
描画 foreach  bx
    if bf(cnt) = 有り {
        pos bx(cnt), by(cnt)
        gcopy n, x, y
    }
loop
foreach  bx
    if bf(cnt) = 有り {
        color rr, gg, bb
    } else {    なし
        color 背景色
    }
    boxf bx(cnt), by(cnt), xsize, ysize
loop

ダウンロード
block1.bmp (8KB)
 ここでは、@の方法でプログラムを作成していく。
 画像ファイルが必要になるが、ブロックをいろいろとデザインできる。Aの方法でもline命令など組み合わせて可能であるが処理が面倒になる。

 ブロックのサイズは4×2(32×16ドット)とし、横(x)方法に12個、縦(y)方向に8個の合計96個のブロックが配置できるようにする。図(1)のように有無bfに変化を付けて配置したり、図(2)のように座標yに変化を付けて配置したりすることができる。


(2) ブロック描画

サンプル(block11.hsp)
 ブロックを描画する。

    dim bx, 96 : dim by, 96 : dim bf, 96
    buffer 1
    picload "block1.bmp"
    screen 0
    gmode 2, 32, 16         ;ブロックサイズで設定
    mm = 8          ;間隔
    ;ブロック初期設定
    foreach bf
        bx(cnt) = (cnt \ 12) * 4 + 6  ;ブロックx座標
        by(cnt) = cnt / 12 * 2 + 4    ;ブロックy座標
        bf(cnt) = 1             ;1:あり/0:なし
    loop
    ;画面消去
    color 0, 128, 0
    boxf 0, 0, winx * mm - 1, winy * mm         ;ゲーム領域消去
    ;ブロック描画
    foreach bf
        if bf(cnt) = 1 { 
            pos bx(cnt), by(cnt)
            gcopy 1, 0, 16
        }
    loop
    stop

実行横(x)方法に12個、縦(y)方向に8個の合計96個のブロックが描画される。


サンプル(block12.hsp)
 ブロックを描画する(図(1))。

    dim bx, 96 : dim by, 96 : dim bf, 96
    buffer 1
    picload "block1.bmp"
    screen 0
    gmode 2, 32, 16         ;ブロックサイズで設定
    mm = 8          ;間隔
    ;ブロック初期設定
    foreach bf
        bx(cnt) = (cnt \ 12) * 4 + 6    ;ブロックx座標
        by(cnt) = cnt / 12 * 2 + 4      ;ブロックy座標
    loop
    repeat 8
        lp = cnt
        if lp \ 3 = 0 {
            repeat 12
                np = lp * 12 + cnt
                if cnt \ 2 = 0 : bf(np) = 1 : else : bf(np) = 0     ;1:あり/0:なし
            loop
        }
        if lp \ 3 = 1 {
            repeat 12
                np = lp * 12 + cnt
                if cnt \ 2 = 1 : bf(np) = 1 : else : bf(np) = 0     ;1:あり/0:なし
            loop
        }
        if lp \ 3 = 2 {
            repeat 12
                np = lp * 12 + cnt
                bf(np) = 0              ;1:あり/0:なし
            loop
        }
    loop
    ;画面消去
    color 0, 128, 0
    boxf 0, 0, winx * mm - 1, winy * mm         ;ゲーム領域消去
    ;ブロック描画
    foreach bf
        if bf(cnt) = 1 { 
            pos bx(cnt), by(cnt)
            gcopy 1, 0, 16
        }
    loop
    stop


サンプル(block13.hsp)
 ブロックを描画する(図(2))。

    dim bx, 96 : dim by, 96 : dim bf, 96
    buffer 1
    picload "block1.bmp"
    screen 0
    gmode 2, 32, 16         ;ブロックサイズで設定
    mm = 8          ;間隔
    ;ブロック初期設定
    foreach bf
        bx(cnt) = (cnt \ 12) * 4 + 6  ;ブロックx座標
        by(cnt) = cnt / 12 * 2 + (cnt \ 2) + 4    ;ブロックy座標
        bf(cnt) = 1             ;1:あり/0:なし
    loop
    ;画面消去
    color 0, 128, 0
    boxf 0, 0, winx * mm - 1, winy * mm         ;ゲーム領域消去
    ;ブロック描画
    foreach bf
        if bf(cnt) = 1 { 
            pos bx(cnt), by(cnt)
            gcopy 1, 0, 16
        }
    loop
    stop

試してみよういろいろなブロック配置のプログラムを作成してみよ。



課題(block61.hsp)
 ラケットのプログラムracket96.hspにブロックの描画block11.hspを追する。


(リスト)新しいウィンドウで開く


 ブロック・ゲーム制作 前へ 目次へ 次へ 
2007 © Hiroshi Masuda

 

 

inserted by FC2 system