Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Drganie obiektów gry podczas przemieszczania

Ostatnio zmodyfikowano 2013-07-15 18:37
Autor Wiadomość
ison
» 2013-07-11 14:57:47
Dlaczego przesuwasz pozycję o stałą wartość? To jest pętla stałokrokowa? To normalne, że jeśli coś będziesz przesuwał o 4 piksele na klatkę a coś innego o 3 to będziesz widział drgania.
Set smooth w tym przypadku nie pomoże, bo on interpoluje tekstury gdy są wyświetlane na niecałkowitych pozycjach pikseli (tzn. zapobiega przeskokowi z 1 piksela na kolejny), co w Twoim przypadku nie ma nigdy miejsca.
P-87538
Wicon
Temat założony przez niniejszego użytkownika
» 2013-07-11 19:59:12
Rozumiem. Dzięki za wskazówkę, na pewno zmodyfikuję teraz kod, tak aby obiekty przesuwały się o 1 piksel co przebieg pętli. Dzięki.
P-87581
ison
» 2013-07-11 23:51:13
Nie przesuwaj o 1 piksel jeśli nie masz pętli stałokrokowej. Przesuwaj o v*delta gdzie v to jakaś prędkość przesuwania a delta to czas, który upłynął od poprzedniej klatki. No i nie trzymaj takiej pozycji w zmiennej przechowującej liczby całkowite.
P-87617
Wicon
Temat założony przez niniejszego użytkownika
» 2013-07-14 13:41:50
No ok zmodyfikowałem wszystko tak, aby przesuwać obiekt zgodnie z prawem fizyki, czyli droga = prędkość razy czas. Czas to czas w jakim wykonuje się jedna pętla, ale czy aby nie będzie tak, że na szybszym komputerze jedna pętla wykona się szybciej a na wolniejszym wolniej, co poskutkowało by tym, że na każdym komputerze obiekty będą się przemieszczać z inną prędkością. No chyba, że synchronizacja pionowa jest od tego, żeby takiemu procederowi zapobiec. (Bo w sumie ustawia częstotliwość odświeżania na 60), czyli moja pętla będzie się wykonywać 60 razy na sekundę niezależnie od komponentów komputera.
No i jeszcze tak swoją drogą, to jak zwiększę v, czyli prędkość (stałą dla wszystkich obiektów) to obiekty i tak drgają, więc to wciąż nie rozwiązuje mojego problemu. Przy mniejszych prędkościach drgają, ale nie tak mocno, co jest zresztą oczywiste.

Czy nie ma możliwości, aby interfejs użytkownika był wyświetlany nie na współrzędnych całego świata, tylko na współrzędnych samego okna. Tzn. lokuję go w konkretnym miejscu okna i nie ma potrzeby przesuwania go.
P-87843
Mrovqa
» 2013-07-14 14:01:29
@Wicon
Masz dwie możliwości zaprogramowania logiki, jeśli chodzi o przesuwanie elementu - wykorzystać pętlę stałokrokową (którą rekomenduję) albo "renderować ile się da". Wada tego drugiego jest taka, iż zużywa sporo zasobów (czas procesora i karty graficznej) i nieco ciężej się wylicza fizykę gry (bo masz różne czasy do zasymulowania), natomiast w drugiej łatwiej się przesuwa elementy (zawsze o stałą ilość), ale wadą jest, iż jeśli nie osiągniesz tych 60 FPSów (czy ile założyłeś) to gra zwalnia - oczywiście i temu da się zapobiec, ale na razie się tym przejmuj - nie będziesz pisał wymagających gier i uruchamiał ich na starym komputerze :)

W sprawie Twojego interfejsu - po co wyświetlać to na współrzędnych globalnych? Widać, coś kiepsko napisałeś przesuwanie mapy :) UI wyświetlaj normalnie na określonych, stałych pozycjach, natomiast obiekty gry, jak gracz, przeciwnicy, itp. wyświetlaj na pozycji [pozycja_obiektu - pozycja_górnego_lewego_kąta_okna].
P-87845
Wicon
Temat założony przez niniejszego użytkownika
» 2013-07-14 14:30:33
No tak, oczywiście obiekty typu drzewa, patyczki i inne designowe obiekty będą wyświetlane na konkretnej pozycji, ich przesuwać nie będę musiał. Ale jeśli pasek HP wyświetlę na stałej pozycji, to jak będę przemieszczał naszego bohatera to wtedy pasek HP będzie się przesuwaj z lewa na prawo aż w końcu zniknie.

A co do pętli stałokrokowej, to poproszę o podanie jakiegoś linka gdzie jest ona opisana.
P-87847
pekfos
» 2013-07-14 18:38:39
A co do pętli stałokrokowej, to poproszę o podanie jakiegoś linka gdzie jest ona opisana.
Prosz..
P-87854
Mrovqa
» 2013-07-14 20:15:04
Ale jeśli pasek HP wyświetlę na stałej pozycji, to jak będę przemieszczał naszego bohatera to wtedy pasek HP będzie się przesuwaj z lewa na prawo aż w końcu zniknie.
Nie zrozumiałeś mnie. Przeczytaj dokładnie to co napisałem. Obiekty gry albo rysujesz na ich globalnej pozycji i korzystasz sf::View, albo rysujesz na pozycji [obj_pos - cam_pos], gdzie cam_pos to globalne współrzędne górnego lewego rogu okna. Natomiast przy rysowaniu interfejsu musisz ustawić domyślny widok albo - w zależności od metody - nie odejmować cam_pos, w celu stałej pozycji. Rozumiesz?
P-87863
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona