【发布时间】:2013-11-24 06:27:36
【问题描述】:
目前我有一个 TCard (TGraphicControl),我将 x 小步向上移动。但我不知道如何将其移回。
我以
开头 TCardMover.Slide(card,point(card.Left,card.Top -10),CARD_SLIDE_TIME,Animation);
在这里面 {这将给予攻击 amimation}
procedure TGameData.AnimateAttack(slot: Integer;card: TCard); //add value as integer ,
var
i : integer;
begin
i:=0;
if slot = 1 then
begin
//TCardMover.Slide(card,point(card.Left,card.Top -10),CARD_SLIDE_TIME,Animation,nil);
TCardMover.Slide(Card,point(Card.Left,Card.Top -10),CARD_SLIDE_TIME,Animation,TerminateCall);
end;
if slot = 2 then
begin
TCardMover.Slide(card,point(card.Left,card.Top -10),CARD_SLIDE_TIME,Animation,TerminateCall); // DMc Just to test card movement
end;
if slot = 3 then
begin
TCardMover.Slide(card,point(card.Left,card.Top -10),CARD_SLIDE_TIME,Animation,TerminateCall); // DMc Just to test card movement
end;
end;
然后我就这样称呼它
procedure TGameData.attack;
begin
animateAttack(1,fgame.Slot1);
end;
如果我像这样在动画攻击中像这样运行 tCardMover.slide。
TCardMover.Slide(card,point(card.Left,card.Top -10),CARD_SLIDE_TIME,Animation);
TCardMover.Slide(card,point(card.Left,card.Top +10),CARD_SLIDE_TIME,Animation);
它尝试两者都做,我假设由于移动是一个单独的线程?我该如何解决这个问题,以便我可以移出 -10,然后在卡完成移动 -10 后移动 +10?
这里是 TCardMover。
{ TCardMover }
function TCardMover.Arrived: boolean;
begin
Result := (FPosNow.X = FPosDest.X) and (FPosNow.Y = FPosDest.Y);
end;
procedure TCardMover.CalculateNextStop;
var
Elapsed : integer;
begin
while FTickNext < GetTickCount do // When is next re-draw due?
FTicknext := FTickNext + CARD_MOVE_INTERVAL;
if FTickNext >= FTickEnd then // Are we there yet Dad?
begin // If the journey has taken long enough, move
FTickNext := FTickEnd; // to our destination without further delay,
FPosNow := FPosDest; // then bail.
end
else
begin
// If we get here we are still en route so calculate where to re-draw.
Elapsed := GetTickCount - FTickStart; // How much time will journey have taken at next re-draw?
FPosNow.X := FPosStart.X + round((Elapsed/FTickJourney)*FJourney.X); // Where will card be at next re-draw?
FPosNow.Y := FPosStart.Y + round((Elapsed/FTickJourney)*FJourney.Y);
end;
end;
procedure TCardMover.Execute;
begin
while not terminated and not Arrived do
begin
CalculateNextStop;
WaitTillDue;
Synchronize(NotifyHost);
end;
end;
class procedure TCardMover.Slide(aCard: TCard; aDestination: TPoint; aJourneyTime: cardinal; DrawProc : TNotifyEvent);
begin
with TCardMover.Create(START_IMMEDIATELY) do
begin
FTickStart := GetTickCount;
FTickNext := FTickStart;
FTickEnd := FTickStart + aJourneyTime;
FPosStart := Point(aCard.Left,aCard.Top);
FCard := aCard;
FPosDest := aDestination;
FTickJourney := aJourneyTime;
FreeOnTerminate := TRUE;
FOnMove := DrawProc;
FJourney.X := FPosDest.X - FPosStart.X;
FJourney.Y := FPosDest.Y - FPosStart.Y;
end;
end;
procedure TCardMover.NotifyHost;
begin
if assigned(FOnMove) then
FOnMove(Self);
end;
procedure TCardMover.WaitTillDue;
var
TicksNow : cardinal;
begin
TicksNow := GetTickCount;
if TicksNow < FTickNext then
SleepEx(FTickNext-TicksNow,DO_NOT_QUIT_EARLY);
end;
【问题讨论】:
-
你的线程只有一个等待部分和一个同步移动部分。您可以在表单上使用简单的 TTimer 来处理此问题
标签: delphi delphi-xe2