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, 220font "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 |