Skocz do zawartości

Wykrywanie kolizji


Reveres

Recommended Posts

Witam.

Mam taki kod: 

public boolean isCollised(){
		for(Collision c1:MyGdxGame.collisionManager.getCollisionList()){
			if(!c1.equals(this)){
				if(c1.overlaps(this)){
					return true;
				}
			}
		}
		return false;
	}
	
	public boolean isCollOnRight(){
		for(Collision c1:MyGdxGame.collisionManager.getCollisionList()){
			if(!c1.equals(this)){
				return (this.isCollised() && (this.x < c1.x) && (c1.x < this.x + this.width));
			}
		}
		return false;
	}
	public boolean isCollOnLeft(){
		for(Collision c1:MyGdxGame.collisionManager.getCollisionList()){
			if(!c1.equals(this)){
				return (this.isCollised() && (c1.x < this.x) && (this.x < c1.x + c1.width));
			}
		}
		return false;
	}
	public boolean isCollOnTop(){
		for(Collision c1:MyGdxGame.collisionManager.getCollisionList()){
			if(!c1.equals(this)){
				return (this.isCollised() && (c1.y < this.y + this.height) && (this.y + this.height < c1.y));
			}
		}
		return false;
	}
	public boolean isCollOnBottom(){
		for(Collision c1:MyGdxGame.collisionManager.getCollisionList()){
			if(!c1.equals(this)){
				return (this.isCollised() && (this.y < c1.y + c1.height) && (c1.y + c1.height < this.y + this.height));
			}
		}
		return false;
	}

I mam  problem otóż taki:

Piszę grę 2D RPG("style") i chcę wykryć kolizje tylko z jednej strony, aby zablokować ruch w danym kierunku.

Napisałem taki kod, wzorowany na tutorialu z kolizji ale w C++, i kolizja dział w następujący sposób:

-Po uderzeniu gracza w obiekt z prawej storny, powyżej niż połowa tego obiektu, wykrywa że zderzenie gracza nastąpiło z góry i prawej strony, gdy jest gracz poniżej połowy obiektu to wykrywa jako zderzenie gracza od dołu i prawej strony.

-Po uderzeniu gracza w obiekt z lewej storny, powyżej niż połowa tego obiektu, wykrywa że zderzenie gracza nastąpiło z lewej i prawej strony, gdy jest gracz poniżej połowy obiektu to wykrywa jako zderzenie gracza od dołu i lewej strony.

-Po uderzeniu gracza w obiekt od dołu, powyżej niż połowa szerokości tego obiektu, wykrywa że zderzenie gracza nastąpiło z góry i prawej strony, gdy jest gracz poniżej połowy szerokości obiektu to wykrywa jako zderzenie gracza od dołu i prawej strony.

-Po uderzeniu gracza w obiekt od góry, powyżej niż połowa szerokości tego obiektu, wykrywa że zderzenie gracza nastąpiło z dołu i prawej strony, gdy jest gracz poniżej połowy szerokości obiektu to wykrywa jako zderzenie gracza od dołu i prawej strony.

 

Jak wyeliminować, aby zwracało tylko jedną kolizje w danym momencie, a dokładniej jak uderzę graczem o obiekt z lewej strony to wykrywa kolizje z prawej strony względem gracza jak napisałem to powyżej.

PS.: Dodam że w libGDX kordy 0,0 zaczynają się w lewym dolnym rogu, a nie jak standardowo lewy górny róg.

Proszę o pomoc i dziękuję za nią.

Edytowano przez Reveres
Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Ten kod jest troszkę źle napisany, bo po co tworzyć wiele metod, które będą sprawdzać kolizje, Lepiej użyć wzorca projektowego typu Obserwator do klasy odpowiedzialnej od kolizji. Dodatkowo by nie robić wielu porównań wykorzystaj do optymalizacji algorytmu od zamiatania: http://jitter-physics.com/wordpress/?tag=sweep-and-prune

 

  • Upvote 1
Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...