请问如何在一张图片上加载另一张图片(100分)

  • 主题发起人 主题发起人 ruanning
  • 开始时间 开始时间
R

ruanning

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想做一个五子棋程序,一张图片当棋盘,棋子就是image,如何弄上去
谢谢指教
希望能给我源码,谢谢
 
给你一个思路:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
btnRestart: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btnRestartClick(Sender: TObject);
private
FBackBmp: TBitmap; //保存棋盘;
FBlackBmp: TBitmap; //保存黑子;
FWhiteBmp: TBitmap; //保存白子;
FIsWhite: Boolean; //当前是否是白子;
FCheckerWidth: Integer; //棋子所占方格的宽度;
function PointToRect(x, y: Integer): TRect;
procedure DoDrawBackImage;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
FBackBmp := TBitmap.Create; //保存棋盘;
FBlackBmp := TBitmap.Create; //保存黑子;
FWhiteBmp := TBitmap.Create; //保存白子;
//加载图片;
FBackBmp.LoadFromFile('棋盘.bmp');
FBlackBmp.LoadFromFile('黑子.bmp');
FWhiteBmp.LoadFromFile('白子.bmp');
FIsWhite := False; //黑子先走;
DoDrawBackImage;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FBackBmp.Free;
FBlackBmp.Free;
FWhiteBmp.Free;
end;

function TForm1.PointToRect(x, y: Integer): TRect;
begin
//这里假设x和y为左上顶点坐标;
//实用你要先将x、y换算为左上顶点坐标;
Result := Rect(x, y, x + FCheckerWidth, y + FCheckerWidth);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin //画棋子;
with Canvas do
if FIsWhite then
CopyRect(PointToRect(x, y), FWhiteBmp.Canvas,
Rect(0, 0, FWhiteBmp.Width, FWhiteBmp.Height))
else
CopyRect(PointToRect(x, y), FBlackBmp.Canvas,
Rect(0, 0, FBlackBmp.Width, FBlackBmp.Height));
end;

procedure TForm1.DoDrawBackImage;
begin
Canvas.Draw(0, 0, FBackBmp);
end;

procedure TForm1.btnRestartClick(Sender: TObject);
begin //重新开始;
DoDrawBackImage;
FIsWhite := False;
end;

end.

其它的就你自己想了,毕竟是你要写程序。[:)]
 
用IMAGE1做棋盘,如果放棋子就动态创建一个小的IMAGE放在合适的位置,并设为透明。
不过好像太耗费资源了。
 
thx1180,你这么做是不是画出来的棋子是方的?如果想要一个圆的怎么办?
就是说我想知道如何使图片某一部分透明:)
 
你可以把想透明的部分的颜色同背景颜色一致。
例如:
棋子.canvas.pixels[i,j] := 背景.canvas.pixels[x+i,y+j];
好像速度有点慢。
 
棋子当然是圆的,制作棋子图案时把背景色带上就行了啊。
不用运行时才设置或者一定要透明的。

应该还有一个数组或者记录之类的东西来记录每个交叉点的
状态(空、黑子、白子、顶点坐标)。
 
后退
顶部