Hallo,
Ich habe diese kleine Funktion:
Delphi-Quellcode:
procedure TChar.walkTimerRun(Sender :TObject);
begin
if(self.walkPos.X < self.finalPos.X) and not(self.X = 'r')then
begin
self.walkPos.X:= self.walkPos.X+4;
self.layer.Left:= self.walkPos.X;
TCObjectControler.walk_rigth(self);
self.X:= 'l';
end else if(self.walkPos.X > self.finalPos.X) and not(self.X = 'l')then
begin
self.walkPos.X:= self.walkPos.X-4;
self.layer.Left:= self.walkPos.X;
TCObjectControler.walk_left(self);
self.X:= 'r';
end else if(self.walkPos.Y < self.finalPos.Y) and not(self.Y = 'u') then
begin
self.walkPos.Y:= self.walkPos.Y+4;
self.layer.Top:= self.walkPos.Y;
TCObjectControler.walk_down(self);
self.Y:= 'd';
end else if(self.walkPos.Y > self.finalPos.Y) and not(self.Y = 'd') then
begin
self.walkPos.Y:= self.walkPos.Y-4;
self.layer.Top:= self.walkPos.Y;
TCObjectControler.walk_up(self);
self.Y:= 'u';
end else
begin
self.walkTimer.Enabled:= false;
showmessage(IntToStr(self.layer.Top)+' == '+IntToStr(self.finalPos.Y));
self.walkTimer.Enabled:= false;
self.layer.Picture.Bitmap.Assign(nil);
self.stand.GetBitmap(0, self.layer.Picture.Bitmap);
self.Y:= '';
self.X:= '';
end;
end;
Also, ich bewege das Bild erst nach rechts oder links und dann nach oben oder nach unten bis es die gewünschte Position erreicht. Die X Koordinaten stimmen auch immer, aber es erreicht nie ganz die Y Koordinate. Das heißt, die Message Box am ende gibt z.b. aus:
405 == 400
also sollte das Bild ja sogar ein bisschen drüber hinaus "fahren" aber sie bleibt immer ca. 20 Pixel vorher stehen
Das Bild ist auf einem Pannel:
Delphi-Quellcode:
tom:= TChar.Create(Form1);
tom.layer.Parent:= Form1.haus;
Die Create Funktion:
Delphi-Quellcode:
constructor Tchar.Create(AOwner: TComponent);
Begin
Inherited Create(AOwner);
//layer
layer:= TImage.Create(AOwner);
layer.Height:= 170;
layer.Width:= 100;
layer.Stretch:= true;
layer.Transparent:= false;
//stand
stand:= TImageList.Create(AOwner);
//walkLeft
walkLeft:= TImageList.Create(AOwner);
//walkRight
walkRigth:= TImageList.Create(AOwner);
//walkUP
walkUp:= TImageList.Create(AOwner);
//walkDown
walkDown:= TImageList.Create(AOwner);
//walkTimer
walkTimer:= TTimer.Create(AOwner);
walkTimer.OnTimer:= walkTimerRun;
walkTimer.Enabled:= false;
walkTimer.Interval:= 100;
//standTimer
standTimer:= TTimer.Create(AOwner);
standTimer.Enabled:= false;
end;
Die Koordinaten bekommen ich von der Mausposition:
Delphi-Quellcode:
self.walkTo(tom, Sender.ScreenToClient(Mouse.CursorPos).X, Sender.ScreenToClient(Mouse.CursorPos).X);
procedure TObjectControl.walkTo(objekt : TChar; posX, posY : integer);
begin
objekt.walkPos.X:= objekt.layer.Left;
objekt.walkPos.Y:= objekt.layer.Top;
objekt.finalPos.X:= posX;
objekt.finalPos.Y:= posY;
objekt.walkTimer.Enabled:= true;
end;
Hat jemand eine Ahnung was ich falsch gemacht habe oder wieso das so ist??
mfg. TitanNano