Pętla for dobrze zauważa, ale źle reaguje na kolizje

0

Cześć, napisałem taką pętlę for, która sprawdza obszra wokół postaci czy jest w kolizji, z którymś z wybranych kafelków. Działa to mniej więcej na zasadzie, że gdy chcemy pzresunąć postać do przodu to wpierw sprawdza czy po przesunięciu będzie kolizja , jeżeli nie to ustawia nowe współrzędne postaci, jeżeli tak to wtedy pozostaje na wcześniejszym miejscu.
Pętla dobrze zauważa kolizje ale nie reaguje na nie w każdym przypadku jak powinna. Gdy naprzykład idzie się do góry, to kolizje widzi tak jak powinna czyli na styku postaci, a kafli, ale reaguje na nie czyli zatrzymuje się dopiero gdy pojade dalej do góry i dolna krawędź zauważy kafel.

int t1=0;
		int t2=0;
		
		if(bohater.dy>0)t2+=2;
		if(bohater.dy<0)t2-=2;
		
		if(bohater.dx>0)t1+=2;
		if(bohater.dx<0)t1-=2;
			
		double s1=bohater.getX();
		double s2=bohater.getY();

		double nastepny_x=bohater.getX()+t1;
		double nastepny_y=bohater.getY()+t2;
		
		double pierwszy_x=Math.max((nastepny_x/64)-1,0);
		double ostatni_x=Math.min((nastepny_x/64)+(bohater.getWidth()/64)+1,mapa.szerokosc_mapy());
		
		double pierwszy_y=Math.max((nastepny_y/64)-1,0);
		double ostatni_y=Math.min((nastepny_y/64)+(bohater.getHeight()/64)+1,mapa.wysokosc_mapy());

		for (double y=pierwszy_y;y<ostatni_y;y++)
		{
			for(double x=pierwszy_x;x<ostatni_x;x++)
			{
	
					Kostka kostka = mapa.zwroc_plytke((int)x,(int)y);
					if(kostka.intersects(nastepny_x,nastepny_y,128,128) && kostka.zwroc_indeks_grafiki()==1) 
					{
						

						bohater.ustaw(s1,s2);
	
						
					}
					else if(!kostka.intersects(nastepny_x,nastepny_y,128,128) && kostka.zwroc_indeks_grafiki()!=1)  bohater.ustaw(nastepny_x,nastepny_y);
			
				
				
			}
		}

Gdzie jest błąd, którego nie widze, a którego usunięcie naprawiło by działanie tej metody ?

0

Nie dziwię się, że nic nie widzisz bo jest to bardzo nieczytelny kod. Mi też trudno w nim dostrzec cokolwiek.

Po pierwsze napisz skąd wzięły się magiczne liczby 64, 128 oraz 1 (przy indeksie grafiki). Czym jest kostka? Czy kształt bohatera kolizyjnego to prostokąt, kwadrat, czy zupełnie inny? Czym jest mapa i jaki może mieć kształt oraz rozmiar?
Po drugie podaj algorytm wg którego zamierzałeś wykryć kolizję i później zareagować. Bo albo jest on zły, albo kod go nie realizuje.
Bez tych dodatkowych informacji trudno będzie Ci pomóc bo szukanie błędu w nieczytelnym kodzie o którym nie wie się w pełni co ma robić, to raczej kiepska sprawa.

I tak na koniec tego posta dwie uwagi. Dzielenie przez 64, to to samo co przesunięcie bitowe o 6 bitów w prawo. Różnica to 50 razy mniej czasu zmarnowanego na obliczenia (choćby renderowanie). Szukanie minimów i maksimów w sytuacji gdy jeden z argumentów jest zawsze zerem jest raczej mało sensowne.

0

Przede wszystkim, dlaczego w pętli używasz doubli?
Masz dużo gorszą wydajność, a i tak musisz rzutować na inty.

Co do problemu, to założę się, że gdzieś robisz "if (double1 == double2) ..." co jest nieprawne ze względu na błędy zaokrągleń.

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