imageファイルをif文などに組み入れて上手くループさせるには?

解決


めがり。  2004-12-13 13:43:24  No: 12272

麻雀のゲームを作ろうと奮起した初心者ですが、牌のイメージファイルを
上手くループに入れることが出来ません。
例えば、ひとつの牌を表示しようとすると
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;
というように変数を使って上手くループに入れたいのですが、どうしたらよいでしょうか?くだらなく程度の低い問題かもしれませんが、どなたかご教授ください。


りおりお  2004-12-13 15:13:23  No: 12273

ここでの 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枚のカードイメージが描かれます。


ぽこ  2004-12-13 20:41:39  No: 12274

投稿者の方のご要望からすると、配列を使いたいとのことなので

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;
でいけるのではないでしょうか?


ぽこ  2004-12-13 21:39:34  No: 12275

誤記ありました  すみません
procedure InitTileImage;のなかの
TempCompoをcomponoにするか
componoのとこTempCompo のどちらかに書き換えてください


めがり。  2004-12-14 16:27:11  No: 12276

>ぽこさん  りおりおさん
  ご教授本当にありがたく感じています!おかげで一歩前進しました。これからも多くの難題が待っていると思いますが、めげずに形あるものにしていきたいと思っております!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加