ゲームキャラを表示させたいのですが
imageListやimageコンポーネントなどにDrawメソッドで画像を描画してますが、左右逆向きに表示させる方法がわかりません。
例えば、Image1, Image2 : TImage; だとして、Image1に反転させたい画像があったとすると、、、
var
dest,src : TRect;
begin
src := Rect(0,0,Image1.Width,Image1.Height);
dest := Rect(Image1.Width,0,0,Image1.Height);
Image1.Picture.Bitmap.Canvas.CopyRect(dest,Image1.Picture.Bitmap.Canvas,src);
end;
てすれば左右反転が出来ます。同じ原理で上下反転とかも、、、
var
dest,src : TRect;
begin
src := Rect(0,0,Image1.Width,Image1.Height);
dest := Rect(Image1.Width,0,0,Image1.Height);
Image2.Picture.Bitmap.Canvas.CopyRect(dest,Image1.Picture.Bitmap.Canvas,src);
end;
最後の行です。描画先はIamge2です。別にIamge1に上書きしても構いませんが、、
それと、Imageにはビットマップオブジェクトとかが読み込まれていないと、Bitmap.Canvasには書き込めません。
ありがとうございます。たつめです
imageListにキャラの一連の絵が入ってるのですが
ImageList1.GetBitmap(0,Image1) ;として取り出してから反転して表示させるのがいいですか?
それと、取り出して表示させると
ImageList1のDrawingStyleをTransparentにして回りを透明にしてたのですが、その効果がなくなってしまうので、
ImageList2を作って格納するやり方で大丈夫でしょうか?
>IamgeList1.GetBitmap(0,Image1);
このImage1ってTImageですか?もしTImageであるなら、Image1.Picture.Bitmapとかでは?
TBitmapなら、これで構いません。
>取り出してから反転して...
どうするにも、一旦は、Bitmapオブジェクトに取り出さなきゃ反転できないと思います。表示してから反転させるくらいなら、TBitmapに取り出して、そこで反転した後、表示させた方がいいとは思います。
>ImageList1のDrawingStyleをTransparent...
私、ImageListのDrawingStyleってあんまよく分からないのですが、周りを透明にしたければ、、、、
例えば、Bitmapに一旦取り出す場合、
var
bmp : TBitmap;
begin
bmp := TBitmap.Create;
try
ImageList1.GetBitmap(0,bmp);
bmp.Transparent := true;
〜〜〜
finally
bmp.Free;
end;
end;
で、透過させられると思いますが、、、ただ、左下の部分を色を透過させるとかなんとかっていいますから、反転させてから透過するか、反転前に透過させるかでもしかすると違う部分が透過するかもしれません。
ありがとうございます。たつめです
>IamgeList1.GetBitmap(0,Image1);
IamgeList1.GetBitmap(0,Bitmap1);の間違いでしたすみません
http://www.geocities.co.jp/SiliconValley/1367/drawspeed.html
↑のページみてTimageコンポーネントよりTPaintBoxコンポーネントに描画させるようにしてるのですが、
>bmp.Transparent := true;
としてもいろいろやってみたのですが、透過されません。
今までは次のようにしてキャラのまわりの画像を透過させてました
ImageList1.DrawingStyle:=dsTransparent;
ImageList1.Draw(Bitmap1.Canvas,0,0,0);
注)Bitmap1は裏画面
PaintBox1.Canvas.CopyRect(Rect(0,0,640,480),Bitmap1.Canvas ,Bitmap1.Canvas.ClipRect);
注)PaintBox1が表画面
ImageList1.DrawingStyle = dsTransparent;
になってる状態のでも、透過できましたが、、、
どこで、bmp.Transparent := true;
を発行したんでしょうか?
多分、bmp.Transparent := true; を発行した時点で、ビットマップキャンバスの左下の部分にあたる色が透過色に設定されるんだと思います。
私にはどのような画像を扱っているのか分からないので何ともいえないのですが、もし透過させたい色が既に分かっているのであれば、 TransparentColorを設定すると言う手もあるのではないでしょうか?
とりあえずは、Transparent := true;を発行するタイミングの問題だと思います
ありがとうございます。たつめです。
TImageList,TButton,TPaintBoxコンポーネントを貼り付けて
a.bmp,c.bmp使用して
次のようにしましたが、ImageList.Add(u_bitmap2,u_bitmap2)の第2パラメーターに反転したマスクをしてするとなぜか有色の部分が黒色で塗りつぶされてしまいます。マスクに反転した画像を指定しなかった場合は大丈夫でした。どうしてでしょうか?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ImgList;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Button1: TButton;
ImageList1: TImageList;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
Bitmap1,u_Bitmap2,Bitmap2:TBitmap;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Bitmap1:=TBitmap.Create;
Bitmap1.PixelFormat:=pf32bit;
Bitmap1.LoadFromFile('../a.bmp');
Bitmap2:=TBitmap.Create;
Bitmap2.Transparent:=true;
Bitmap2.PixelFormat:=pf32bit;
Bitmap2.LoadFromFile('../c.bmp');
ImageList1.GetBitmap(0,Bitmap2);
u_Bitmap2:=TBitmap.Create;
u_Bitmap2.Transparent:=true;
u_BItmap2.Width:=100;
u_Bitmap2.Height:=100;
u_Bitmap2.Canvas.CopyRect(RECT(100,0,0,100),Bitmap2.Canvas,RECT(0,0,100,100));
ImageList1.Add(u_bitmap2,u_bitmap2);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//PaintBox1.Canvas.Draw(0,0,Bitmap2);
ImageList1.Draw(PaintBox1.Canvas,0,0,1);
end;
end.
追加です。
新しくソースを作って書いたら
bmp.Transparent:=true;のほうはうまくいきました;。すみません。
追加です。
環境はdelphi6personal,7professionalでwindowsXPHomeEditionで試しました
>マスクに反転した画像を指定しなかった場合は大丈夫でした。どうしてでしょうか?
どうしてかは知りません。そもそも、Mask画像って何に使うの?って突っ込み入れたいくらいにMask画像なんて使ったこともないし、プロパティをイヂったこともありません。
そもそもMask画像を使う必要があるのですか?と問いたい。反転,透過ときたらMaskかって、、、、
Mask画像を使う必要がないなら、第2引数を指定しなければいいわけだし、、、ImageListのImageTypeをitImageにしておけば黒くはなりませんね。。。
別に質問たてた方がいいのでは?
私はレタッチソフトを作ってみてるのですが
普段はTImageしか使わず、TImageListの方はよく知りません。
ただマスク関係の構造が同じならMaskを使うならTBitmap.Maskメソッドを使うなどして
2bitに変換しておかないといけないのではないでしょうか?
あと上のソースですが、画像をLoadFromFileで読み込んだあとに
TBitmapのPixelFormatを変更しないとpf32Bitは反映されません。
マスク画像の方は変換すれば必要ないでしょうが。
>そもそもMask画像を使う必要があるのですか?と問いたい。
レタッチソフトだとフルカラーで不定形に切り抜いた場合など、
透過色指定で抜くと必要なピクセルまで抜けてしまう可能性もあるので
マスクは不可欠なのですが、ゲームキャラの表示のように
使用色が限られていればマスク指定の必要はないと思います。
ツイート | ![]() |