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
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.
zrób tak :
- weź DXTimer (nie zwykły!)
- 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;
- dalej deklaracja zmiennych globalnych :
var
animek : TAnimek;
- 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;
- Tworzymy procedurę rysującą :
procedure TAnimek.Rysuj(plotno : TCanvas);
begin
x := x + aX;
y := y + aY;
plotno.pixels[round(x),round(y)] := clWhite;
end;
- W onDxTimer :
animek.rysuj(DXDraw1.Surface.Canvas);
- Przydało by się jeszcze czyszczenie tła, ale to sobie sam zrobisz..
musi działać (choć to z głowy)
pozdr.
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ć???
zrób tak :
- weź DXTimer (nie zwykły!)
- 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;
- dalej deklaracja zmiennych globalnych :
var
animek : TAnimek;
- 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;
- Tworzymy procedurę rysującą :
procedure TAnimek.Rysuj(plotno : TCanvas);
begin
x := x + aX;
y := y + aY;
plotno.pixels[round(x),round(y)] := clWhite;
end;
- W onDxTimer :
animek.rysuj(DXDraw1.Surface.Canvas);
- 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.
Nie chodzi mi o płynność tego ruchu, ale o to, że miejscami "szarpie" się.