〜 グラフィック 〜
トランプカードを描画 (要CARDS.DLL)

Windowsにはソリティアやフリーセル、ハーツといったトランプを用いたゲームが入っています。
これらのゲームで使用するトランプ画像はCards.DLLに入っていますので、
もし、トランプを使ったゲームが作りたいがトランプ画像を作ったり、
何らかの理由により、ソフトに同梱できない・したくない場合は、上記トランプを利用させてもらいましょう。
トランプ画像はDLLのリソースである為、BMPやJPGのようにpicload命令で読み込めません。
公開されているDLLの関数にて、初期化・描画・解放の順番で処理してください。
尚、Windows95・98・Meに入っているCards.DLLは16ビット版DLLの為、
32ビット版であるHSPからは利用することができないようです(環境がないために未確認)。
また、WindowsVistaには、Cards.DLL自体が入っておらず、利用できません。
CardGames.DLLからトランプリソースを利用しているとのことですが、
DLL仕様が公開されていないようなので、Vistaには対応していません。
16ビット環境、Vista環境でWindows標準付属のトランプを利用する場合は、
XP環境等でトランプリソースを吸い出し、画像ファイルとして読み込むのが手っ取り早いと思います。

下記のサンプルモジュールでは、トランプの初期化時に、DLLからトランプリソースを読み込んで、
仮想バッファに、クラブ・ダイヤ・ハート・スペードのAから順に転送しています。
クラブ・ダイヤ・ハート・スペードのKの後は、主に裏面で使用する画像が格納されています。
どのような画像となっているかは、サンプルを実行して確認してください。
リソースには色を反転されたトランプも含まれていますが、下記のモジュールでは読み込んでいません。
	
cardinit 作業ID
作業IDトランプ画像の読込先ウィンドウIDを指定する。
carddraw 番号, スート
番号トランプの番号(A〜K)を指定する。
尚、Aは0、1は2、2は3…Kは12である。
スートトランプのスート(マーク)を指定する。
尚、スートはクローバー(=0)、ダイヤ(=1)、ハート(=2)、スペード(=3)である。
getcardsize 格納配列
格納配列トランプ1枚の画像サイズを格納する数値型配列変数を指定する。
尚、要素0は横幅、要素1は高さである。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#module
#deffunc cardinit int
	mref id, 0
	ginfo 1
	card = id, 0, 0 // 0:ID 1:X 2:Y
	ll_libload cards, "cards.dll"
	ll_getproc cdtInit, "cdtInit", cards
	ll_getptr card.1 : ll_ret prm.0
	ll_getptr card.2 : ll_ret prm.1
	ll_callfunc prm, 2, cdtInit
	buffer card, card.1 * 10, card.2 * 7
	mref bmscr, 96 + id
	ll_getproc cdtDraw, "cdtDraw", cards
	repeat 68
		prm = bmscr.4, cnt \ 10 * card.1, cnt / 10 * card.2, cnt + (cnt / 53), cnt / 53
		ll_callfunc prm, 5, cdtDraw
	loop
	gsel prmy
	ll_getproc cdtTerm, "cdtTerm", cards
	ll_callfnv cdtTerm
	return

#deffunc carddraw int, int
	mref no, 0 : mref suit, 1
	i = no * 4 + suit
	gcopy card, i \ 10 * card.1, i / 10 * card.2, card.1, card.2
	return

#deffunc getcardsize val
	mref direction, 48
	direction = card.1, card.2
	return
#global

	cardinit 2 // ウィンドウID2を作業バッファとする
	color 200, 200, 200 : boxf
	repeat 16
		pos cnt \ 6 * 100 + 30, cnt / 6 * 120 + 30 : carddraw 13, cnt // ウラ面一覧を描画
	loop
	getcardsize size
	title "カードサイズ(" + size + "," + size.1 + ")"
	stop
cardinit 作業ID
作業IDトランプ画像の読込先ウィンドウIDを指定する。
carddraw 番号, スート
番号トランプの番号(A〜K)を指定する。
尚、Aは0、1は2、2は3…Kは12である。
スートトランプのスート(マーク)を指定する。
尚、スートはクローバー(=0)、ダイヤ(=1)、ハート(=2)、スペード(=3)である。
受取先 = getcardsize(方向)
受取先取得した画像サイズの受取先を指定する。
方向トランプ1枚の画像サイズの方向(横:0 縦:1)を指定する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#uselib "Cards.dll"
#func  global cdtInit "cdtInit" var, var
#func  global cdtDraw "cdtDraw" int, int, int, int, int, int
#func  global cdtTerm "cdtTerm"

#module
#deffunc cardinit int id, local i
	card = id, 0, 0 // 0:ID 1:X 2:Y
	cdtInit card.1, card.2
	i = ginfo_sel
	buffer card, card.1 * 10, card.2 * 7
	repeat 68
		cdtDraw hdc, cnt \ 10 * card.1, cnt / 10 * card.2, cnt + (cnt / 53), cnt / 53
	loop
	gsel i
	cdtTerm
	return

#deffunc carddraw int no, int suit, local i
	i = no * 4 + suit
	gcopy card, i \ 10 * card.1, i / 10 * card.2, card.1, card.2
	return

#defcfunc getcardsize int direction
	return card(direction + 1)
#global

	cardinit 1 // ウィンドウID1を作業バッファとする
	color 200, 200, 200 : boxf
	repeat 16
		pos cnt \ 6 * 100 + 30, cnt / 6 * 120 + 30 : carddraw 13, cnt // ウラ面一覧を描画
	loop
	title "カードサイズ(" + getcardsize(0) + "," + getcardsize(1) + ")"