Показать сообщение отдельно
  #32  
Старый 23.01.2012, 22:26
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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 и тестируй
Вложения
Тип файла: rar Upload.rar (196.5 Кбайт, 5 просмотров)
Ответить с цитированием