Szarpanie ruchu (trochę to dziwnie brzmi, ale problem jes

0

Korzystam z DelphiX-a i D7P. Mam problem. Piszę grę :) Jak mam zrobić ruch jakiegoś obiektu (chociażby jednego pixla), aby był on płynny? Co prawda, jak dam procedurę przesuwania tegoż pixla w DXTimer-ze i ustawię Interval na 0 lub 1 to ruch jest płynny, ale miejscami zacina się, "szarpie". Jest to znikome, ale dręczące. Da się jakoś wykorzystać akcelerator karty graficznej w DelphiX-ie? A może ktoś ma inny pomysł? Próbawałem także dawać większe Intervale, np.33, ale wtedy szybki ruch jest skokowy. To na pewno nie jest wina mojego komputera, bo próbowałem na kilku innych i było to samo. Tak jest też gdy robię to bez DelphiX-a ale na zwykłym Timerze lub chociażby w zwykłej pętli. Czarna rozpacz. Application.Destroy :P

0

Może problem w tym że poruszanie się obiektu nie jest zsynchronizowane z wyświetlaniem obrazu? Załóżmy że masz monitor ustawiony na 75Hz, a Twój obiekt porusza sie 80 razy na sekunde - bedzie kilka takich momentów, że obiekt sie przesunie o pixel, narysiuje sie na monitorze PÓŁ obrazui tego obiektu a on sie znowu przesunie (drugie pół jest rysowane już w innym miejscu) - i ruch robi się poszarpany.

0

zrób tak :

  1. weź DXTimer (nie zwykły!)
  2. zrobimy sobie nowa klasę :
TAnimek = Class(TObject);
   x, y, aX, aY : real;  // x i y to połorzenie, aX, aY to przyspieszenie w pionie i poziomie..
   procedure rysuj(plotno : TCanvas); // rysujemy na wybranym canvasie
end;
  1. dalej deklaracja zmiennych globalnych :
var
  animek : TAnimek;
  1. W OnCreate formy :
animek := TAnimek.Create;
with animek do begin
  x := 0;
  y := 0; 
  aX := 0.2; // zauważ że to typ zmiennoprzecinkowy, co da nam ruch superpłynny :)
  aY := 0.7; 
end;
  1. Tworzymy procedurę rysującą :
procedure TAnimek.Rysuj(plotno : TCanvas);
begin
   x := x + aX;
   y := y + aY;  
   plotno.pixels[round(x),round(y)] := clWhite;
end;
  1. W onDxTimer :
animek.rysuj(DXDraw1.Surface.Canvas);
  1. Przydało by się jeszcze czyszczenie tła, ale to sobie sam zrobisz..

musi działać (choć to z głowy)
pozdr.

0

Może problem w tym że poruszanie się obiektu nie jest zsynchronizowane z wyświetlaniem obrazu? Załóżmy że masz monitor ustawiony na 75Hz, a Twój obiekt porusza sie 80 razy na sekunde - bedzie kilka takich momentów, że obiekt sie przesunie o pixel, narysiuje sie na monitorze PÓŁ obrazui tego obiektu a on sie znowu przesunie (drugie pół jest rysowane już w innym miejscu) - i ruch robi się poszarpany.

A jak to zrobić???

0

zrób tak :

  1. weź DXTimer (nie zwykły!)
  2. zrobimy sobie nowa klasę :
TAnimek = Class(TObject);
   x, y, aX, aY : real;  // x i y to połorzenie, aX, aY to przyspieszenie w pionie i poziomie..
   procedure rysuj(plotno : TCanvas); // rysujemy na wybranym canvasie
end;
  1. dalej deklaracja zmiennych globalnych :
var
  animek : TAnimek;
  1. W OnCreate formy :
animek := TAnimek.Create;
with animek do begin
  x := 0;
  y := 0; 
  aX := 0.2; // zauważ że to typ zmiennoprzecinkowy, co da nam ruch superpłynny :)
  aY := 0.7; 
end;
  1. Tworzymy procedurę rysującą :
procedure TAnimek.Rysuj(plotno : TCanvas);
begin
   x := x + aX;
   y := y + aY;  
   plotno.pixels[round(x),round(y)] := clWhite;
end;
  1. W onDxTimer :
animek.rysuj(DXDraw1.Surface.Canvas);
  1. Przydało by się jeszcze czyszczenie tła, ale to sobie sam zrobisz..

musi działać (choć to z głowy)
pozdr.

Robiłem tak wiele razy i to nic nie daje.

0

Nie chodzi mi o płynność tego ruchu, ale o to, że miejscami "szarpie" się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1