(tworzenie gry) Przesylanie parametrów

0

Witam, chciałbym zrobić metodę która będzie miała za zadanie wykrywać kolizje obiektów z postacią sterowaną. Wygląda póki co tak:

public boolean Kolizja()
	{
		
		if(X1positionMan > box.leftSide || XpositionMan <box.rightSide || box.topSide < Y1positionMan || box.bottomSide > YpositionMan)
		{
			return true;
		}
		
		 	return false;
		
	}

To jest klasa Textury która wygląda tak:

public class Textury 
{
	
	
	public int rightSide;
	public int leftSide;
	public int topSide;
	public int bottomSide;
	
	public Textury(int r, int l, int t, int b)
	{
		 rightSide = r;
		 leftSide = l;
		 topSide = t;
		 bottomSide = b;
	}
}

Konstruktor tej klasy ma ustawiac parametry textury, którą nazwałem box.
Teraz moje pytanie: w jaki sposób do metody kolizja() przeslac te dane z konstruktora?
Probowalem cos takiego :

kolizja(int XpositionMan, box.leftSide, ...)

niestety nie działa :/

0

Utwórz obiekt klasy Textura, a następnie przekaż go jako argument metody kolizja.

public boolean Kolizja(Textura mojaTextura)

Poza tym jak widzę takie coś...

if(X1positionMan > box.leftSide || XpositionMan <box.rightSide || box.topSide < Y1positionMan || box.bottomSide > YpositionMan)
        {
            return true;
        }

            return false;

    }

...to mnie oczy bolą. Czy wiesz, że napisałeś if(true) return true else false? Te wyrażenie warunkowe jest w ogóle niepotrzebne wystarczy napisać tak:

return (X1positionMan > box.leftSide || XpositionMan <box.rightSide || box.topSide < Y1positionMan || box.bottomSide > YpositionMan);

Poza tym przydałoby się te porównania zamknąć w jakieś metody, żeby ten kod coś mówił, sam się dokumentował. Na razie trzeba się domyślać co to robi i jak zajrzysz za miesiąc do tego kodu, to będziesz niepotrzebnie tracił czas na zastanawianie się co ten kod robił.

0

Ja stworzył bym metodę statyczną która sprawdza czy dwa obiekty się dotykają co sprawi że metoda będzie uniwersalna a klasa która implementuje IPosition mędzie implementowała metode która ustawia wymiary postaci, obiektu.

public static boolean kolizja(IPosition obj1, IPosition obj2){
return (obj1.Xleft > obj2.leftSide || obj1.Xright < obj2.rightSide || obj2.topSide < obj1.Yup || obj2.bottomSide > obj1.Ybottom);
}
0

Próbuje wszystkiego i ciągle wynik jest True. Tak na marginesie nie mozna porównać lewego boku postaci z lewym bokiem box. Ale poszedłem za twoja radą i stworzylem klase postać( wczesniej mialem tylko klase textury). Moja funkcja wyglada tak:

public static boolean Kolizja(Postać postać, Textury box)
	{
		
		return(postać.LeftSide < box.rightSide || postać.RightSide > box.leftSide || postać.TopSide < box.bottomSide || postać.BottomSide > box.topSide);
	
	}
	

Czemu zawsze jest true ? Bo np gdy gracz bedzie z lewej strony boxa to (postać.LeftSide < box.rightSide) jest true zawsze.

Ale sprobowalem napisać funkcje w ten sposób :

public static boolean Kolizja(Postać postać, Textury box)
	{
		
		return(postać.LeftSide < box.rightSide && postać.RightSide > box.leftSide && postać.TopSide < box.bottomSide && postać.BottomSide > box.topSide);
		
	
	}

I o dziwo prawie działa to znaczy jesli z prawej, lewej strony oraz od góry gdy wchodze na przeszkodę to zmienia sie na true, ale przechodząc od dołu zawsze jest true, tzn tak jakby przeszkoda była od dołu do górnej jej granicy.
Ktos ma jakis pomysł ?

0

if (a.x + a.w < b.x || a.y + a.h < b.y || a.x > b.x + b.w || a.y > b.y + b.h) { return false; // No collision } return true;

0
public static boolean kolizja(ObiektFizyczny obj1, ObiektFizyczny obj2){
return (obj1.X +obj1.XWidth < obj2.X || obj1.Y + obj1.Yheight < obj2.Y || obj1.X > obj2.X + obj2.XWidth || obj1.Y > obj2.Y + obj2.YHeight)

}

Wydaje mi się że dobrym pomysłem było by stworzenie Klasy abstrakcyjnej np ObiektFizyczny gdzie reszta klas które mają fizyczną reprezentacje i można sprawdzać kolizje będą po niej dziedziczyły

0

Udało mi się jakoś napisać tę funkcję choć nie wiem jak to wgl działa, ale działa
funkcja wygląda tak:

public static boolean Kolizja(Postać postać, Textury box)
{
return(postać.LeftSide < box.rightSide && postać.RightSide > box.leftSide && postać.BottomSide > box.topSide &&  postać.TopSide <= box.bottomSide);
}

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