麻雀のゲームを作ろうと奮起した初心者ですが、牌のイメージファイルを
上手くループに入れることが出来ません。
例えば、ひとつの牌を表示しようとすると
if i=0 then begin
image35.picture:=image1.Picture;
end;
if i=1 then begin
image35.picture:=image2.Picture;
end;
if i=2 then begin
image35.picture:=image3.Picture;
end;
if i=3 then begin
image35.picture:=image4.Picture;
end;
if i=4 then begin
image35.picture:=image5.Picture;
といったような膨大なソース量になってしまいます。
できれば
if i=0 then begin
image35.picture:=image(i).Picture;
end;
というように変数を使って上手くループに入れたいのですが、どうしたらよいでしょうか?くだらなく程度の低い問題かもしれませんが、どなたかご教授ください。
ここでの image1 などは TImage のことですか? だとすると image(i) というふうにアクセスするには、それらを貼ってあるフォームなどの FindComponent メソッドを使います。こんな感じです。
var
compo:TComponent;
compo := FindComponent('image'+IntToStr(i));
if compo is TImage then image35.picture := TImage(compo).Picture;
FindComponent をヘルプで読んでみてください。
ところで、わたしは以前トランプゲームをつくったことがあります。麻雀ゲームとは、ある決まったサイズのイメージを多数保持して表示する必要があることは似てますね。そこで、画像を素早く表示するには、特定の画像を数値でアクセス出来ればいいことになります。わたしは、TImageList にトランプのカードのイメージを読み込んでおき、それをインデックスを指定して描画することにしました。一番簡単な方法をちょっと試してみませんか。
トランプカードのイメージは、ソリテアに使われているdllから設定できます。
新規で Form1 に Button1 と Win32 タブのところの ImageList1 を貼り付けます。
そして、
implementation
{$R *.DFM}
function cdtInit(var dx, dy : integer): integer; stdcall;external 'cards.dll' name 'cdtInit';
function cdtDraw(hdc, X, Y, iCard, iDraw, col : integer): integer; stdcall;external 'cards.dll' name 'cdtDraw';
function cdtTerm : integer; stdcall;external 'cards.dll' name 'cdtTerm';
var
dx,dy:integer;
procedure TForm1.FormCreate(Sender: TObject);
var
bmp:TBitmap;
i:integer;
begin
cdtInit(dx,dy);
ImageList1.Width := dx;
ImageList1.Height := dy;
bmp := TBitmap.Create;
bmp.PixelFormat := pf4bit;
bmp.Width := dx;
bmp.Height := dy;
bmp.Canvas.Brush.Color := clOlive;
bmp.Canvas.FillRect(Rect(0,0,dx,dy));
for i := 0 to 51 do begin
cdtDraw(bmp.Canvas.Handle,0,0,i,0,clWhite);
ImageList1.AddMasked(bmp,clOlive);
end;
bmp.Free;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
cdtTerm;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
WindowState := wsMaximized;
for i := 0 to 51 do
ImageList1.Draw(Canvas,(dx+5)*(i mod 8)+10,(dy+5)*(i div 8)+10,i);
end;
のようにすると、Button1 を押すとフォームに52枚のカードイメージが描かれます。
投稿者の方のご要望からすると、配列を使いたいとのことなので
var TileImages : array[1..2] of TImage; //[]ないはテキトーに変えてください
...
procedure InitTileImage;
var
i : integer;
TempCompo : TComponent;
begin
for i := 0 to 1 do
begin
compo := FindComponent('image'+IntToStr(i+1));
if (compo<>nil)and(compo is TImage) then TileImages[i+1] := TImage(compo);
end;
end;
を起動時にでも1回呼び出して
で
if i=0 then begin
image35.Picture.Assign(TileImages[i+1].Picture);
// image35.picture:= TileImages[i+1].Picture;
でいけるのではないでしょうか?
誤記ありました すみません
procedure InitTileImage;のなかの
TempCompoをcomponoにするか
componoのとこTempCompo のどちらかに書き換えてください
>ぽこさん りおりおさん
ご教授本当にありがたく感じています!おかげで一歩前進しました。これからも多くの難題が待っていると思いますが、めげずに形あるものにしていきたいと思っております!
ツイート | ![]() |