Javascript Kolizje w grze platformowej

0

Witam, jestem w trakcie tworzenia prostej gry platformowej na podstawie skryptu Allegro.js. Mój problem polega na wykrywaniu kolizji, napisałem taki kod

Player.prototype.groundCollision = function(Ground)
{
	if((this.y + this.height> Ground.y) && (this.x + this.width > Ground.x) && (this.x < Ground.x + Ground.width))
	{
		this.y = Ground.y - this.height;
		this.xMove -= Ground.xMove/10;
		this.isOnGround = true;
	}
}

Jak powinienem poprawić ten kod, aby kolizja działała wyłącznie gdy gracz jest nad platformą? W tym momencie, gdy gracz znajdzie się pod platformą albo najedzie na nią dokładnie z boku, jest przenoszony na jej poziom.

Dziękuję za wszystkie wskazówki

1

Zgaduję, że gdy gracz jest nad platformą, to jego this.y + this.height jest mniejsze od Ground.y :P
Gdy gracz spada na platformę, to jego prędkość wertykalna jest dodatnia - to się może u Ciebie sprawdzić.

Protip: wszelkie wątpliwości związane z fizyką możesz sobie narysować na kartce, zaznaczając wszystkie krawędzie, kąty etc. oraz opisując przykładowymi liczbami - wtedy w oczy rzucają się rzeczy mniej oczywiste ;)

0

Dzięki za odpowiedź. Prędkości gracza raczej nie wykorzystam, bo problem pojawia się także, gdy gracz się nie porusza, a porusza się sama platforma i to ona najeżdzając na gracza przenosi go "na siebie". Każde rozwiązanie, które w pewnym sensie na kartce wygląda dobrze, w praktyce powoduje totalnie niespodziewane zachowania gracza, dalekie od oczekiwanych.

2

Jeżeli posiadasz położenie oraz prędkość obu obiektów to po prostu je zsumuj. Wtedy dowiesz się jaka jest różnica położeń obu obiektów czyli w zasadzie zmiana położenia obiektów względem siebie, a nie względem świata.

Wtedy jeżeli zmiana położenia jest taka, że gracz zbliża się do platformy oraz jest poniżej jej - to powinno przepuścić taki ruch.

0

Dziękuję za pomoc, okazało się, że zapewne źle sformuowałem problem. Rozwiązanie było bliżej niż przypuszczłem.

if((this.y + this.height > Ground.y) && 
(this.y + this.height < Ground.y + Ground.height) &&     // Zabrakło tej linii
(this.x + this.width > Ground.x) && 
(this.x < Ground.x + Ground.width))
	{
		this.y = Ground.y - this.height;
		this.xMove -= Ground.xMove/10;
		this.isOnGround = true;
	}

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