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

(5) カード1枚目配布

 シャッフルしたカードは、配列cardに格納されている。配列cardの添字0から順に取り出して配布していく。取り出す添字の番号は変数cnumで管理する。
 取り出したカードは、カードの置き場所(0)、B、E、H、K、Nに配布する。すなわち、配列crdに格納することになる。

 配布されたカードを格納する配列crdを-1で初期化し、取り出すカード番号(インデックス)を0で初期化する。カード置き場所計算の処理の後に追加する。

    ptx(18) = 50 : pty(18) = 50
    foreach crd
        crd(cnt) = -1    ;配布カード初期化
    loop
    cnum = 0    ;取り出すカード番号(インデックス)

 カードをシャッフルし、1枚目のカードを配布する。メッセージ領域消去の後に追加する。

    gosub *shuffle    ;カードシャッフル
;1枚目配布
    color 0, 0, 0 : pos 20, 450 : mes "カード配布中です。"
    repeat 6        ;6枚分
        crd(cnt * 3) = card(cnum)    ;カード配布
        cnum = cnum + 1        ;インデックス加算
    loop
    gosub *gf_disp    ;ゲーム領域描画
    stop
 "crd(cnt * 3)"でcnt=0, 1, 2, 3, 4, 5となり、cnt*3=0, 3, 6, 9, 12, 15となる。

 ゲーム領域描画のサブルーチンに配布カード描画の処理を追加する。

;----- サブルーチン -----
;ゲーム領域描画 -----
*gf_disp
    ;カード置き場所描画
    color 0, 120, 0
    foreach ptx
        boxf ptx(cnt), pty(cnt), ptx(cnt) + 40, pty(cnt) + 55
    loop
    ;配布カード描画
    foreach crd
        if crd(cnt) ! -1 {
            pos ptx(cnt), pty(cnt)
            gcopy 1, crd(cnt) \ 13 * 40, crd(cnt) / 13 * 55
        }
    loop
    return
 "if crd(cnt) ! -1"の!は等しくないという演算子である。等しい(=)の逆である。



課題(card63.hsp)
 1枚目のカード配布の処理を追加する。また、カードの山の置き場にカード裏面の画像も表示する。

ヒント
・ゲーム領域描画のサブルーチンに追加する。
    ;カードの山(カードの裏)描画
    pos ptx(18), pty(18)
    gcopy 1, 80, 220
・「カード配布中です。」のメッセージを太字にするため、次の命令を追加する。
    font "MS ゴシック", 18, 1


(リスト)



(6) カード移動のアニメーション

 実行すると、カードがいきなり表示されている。ここでは、カードが少しずつ移動する様子をアニメーションで作成する。

 カードの山から配布する場所まで斜めに移動させる。
 図のように、x方向の長さとy方向の長さをそれぞれそ、10等分したものを移動量とする(何等分でもよい)。移動量dx, dyは次の式で求まる。

   dx = (x1 - x0) ÷ 10
   dy = (y1 - y0) ÷ 10

 実際には、移動元の座標(x0, y0)は置き場所Qなので(ptx(18), pty(18))である。移動先の座標(x1, y1)は、図ではハートの10で置き場所Bであるから(ptx(3), pty(3))である。
 移動元は変わらないが、移動先は変わる。移動先は置き場所の番号で指定する。移動先をnn番とし、移動中はカード裏面を描画することにする

 プログラム(サブルーチン)は次のようになる。

;カード移動アニメーション -----
*card_move
    kaisu = 10    ;分割数
    dx = abs(ptx(nn) - ptx(18)) / kaisu    ;移動量計算
    dy = abs(pty(nn) - pty(18)) / kaisu
    repeat kaisu, 1
        redraw 0
        gosub *gf_disp    ;ゲーム領域描画
        pos ptx(18) + dx * cnt, pty(18) + dy * cnt    ;座標設定
        gcopy 1, 80, 220    ;画像コピー
        redraw 1
        wait 5    ;時間待ち
    loop
    return

 gosub命令で呼び出す前に、変数nnに移動先の番号((0)〜P)を設定しておく必要がある。



課題(card64.hsp)
 カード移動のアニメーションの処理を追加する。

ヒント
・呼び出し前に変数nnに移動先の番号((0)〜P)を設定する。
   repeat 6        ;6枚分
        nn = cnt * 3        ;置き場所計算
        gosub *card_move    ;カード移動アニメーション
        crd(nn) = card(cnum)    ;カード配布
        cnum = cnum + 1        ;インデックス加算
    loop

実行次図のように、移動した軌跡が残ったままになる。

対策 → ゲーム領域消去の命令をゲーム領域描画サブルーチンの先頭に追加する。


 カブ・ゲーム制作 前へ 目次へ 次へ 
2007 © Hiroshi Masuda

 

 

inserted by FC2 system