Цитата:
Сообщение от angvelem
Подправил как обещал, с учётом использования таймера.
|
"Подправил" - хм. Как по мне так там большая часть переделанная.
Не в обиду сказано, но вы его пробовали в действии? Персонаж двигается с задержкой в 1000 мс. (хотя в таймере указанно 100 мс. мистика однако), один шаг занимает 4 сек в место 400 мс. Явно где-то скрытый баг висит.
Код я не разбирал, как-то мне он замудреным кажется, но это наверно потому что я еще плохо знаюсь в Delphi.
Вот мой вариант движения через таймер. Работает отлично!
Код:
// ---------- Движение персонажа ---------- //
procedure TForm1.TimerUpP(Sender: TObject);
begin
if TimerN = 1 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(16, 16, 32, 32));
Player.Top:=Player.Top-8;
TimerN := 2;
Exit;
end;
if TimerN = 2 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(0, 16, 16, 32));
Player.Top:=Player.Top-8;
TimerN := 3;
Exit;
end;
if TimerN = 3 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(32, 16, 48, 32));
Player.Top:=Player.Top-8;
TimerN := 4;
Exit;
end;
if TimerN = 4 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(0, 16, 16, 32));
Player.Top:=Player.Top-8;
TimerMove.Enabled := False;
Up.Enabled := True;
Down.Enabled := True;
Left.Enabled := True;
Right.Enabled := True;
Exit;
end;
end;
// ---------- Движение персонажа и карты ---------- //
procedure TForm1.TimerUpPM(Sender: TObject);
begin
if TimerN = 1 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(16, 16, 32, 32));
Player.Top := Player.Top - 8;
Panel_Game.Top := Panel_Game.Top + 8;
TimerN := 2;
Exit;
end;
if TimerN = 2 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(0, 16, 16, 32));
Player.Top := Player.Top - 8;
Panel_Game.Top := Panel_Game.Top + 8;
TimerN := 3;
Exit;
end;
if TimerN = 3 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(32, 16, 48, 32));
Player.Top := Player.Top - 8;
Panel_Game.Top := Panel_Game.Top + 8;
TimerN := 4;
Exit;
end;
if TimerN = 4 then
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(0, 16, 16, 32));
Player.Top := Player.Top - 8;
Panel_Game.Top := Panel_Game.Top + 8;
TimerMove.Enabled := False;
Up.Enabled := True;
Down.Enabled := True;
Left.Enabled := True;
Right.Enabled := True;
Exit;
end;
end;
// ---------- Процедура запуска движения ---------- //
procedure TForm1.UpExecute(Sender: TObject);
var u: string;
begin
Up.Enabled := False;
Down.Enabled := False;
Left.Enabled := False;
Right.Enabled := False;
if PD = pdUp then
begin
u := Map.Strings[StrToInt(PlayerY)-1][StrToInt(PlayerX)];
if (u = '0') or (u = '2') or (u = '3') or (u = '5') then
begin
if (Player.Top < 244) or (Player.Top >= 544) then
begin
PlayerY := IntToStr(StrToInt(PlayerY)-1);
TimerN := 1;
TimerMove.OnTimer := TimerUpP;
TimerMove.Enabled := True;
end
else
begin
PlayerY := IntToStr(StrToInt(PlayerY)-1);
TimerN := 1;
TimerMove.OnTimer := TimerUpPM;
TimerMove.Enabled := True;
end;
end
else
begin
Up.Enabled := True;
Down.Enabled := True;
Left.Enabled := True;
Right.Enabled := True;
end;
end
else
begin
Player.Canvas.CopyRect(Rect(0, 0, 32, 32), PlayerBit.Canvas, Rect(0, 16, 16, 32));
PD := pdUp;
Up.Enabled := True;
Down.Enabled := True;
Left.Enabled := True;
Right.Enabled := True;
end;
end;
Вот попробуй как у меня получилось. Правда вкинул в оригинальный проект, ну да ладно, просто жми New Game и тестируй 
|