• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Udoskonalenie kolizji

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
363 wizyt
pytanie zadane 2 września 2017 w JavaScript przez DODO Bywalec (2,950 p.)
zamknięte 4 września 2017 przez DODO

Witam.

Napisałem sobie kolizje w grze typu topdown (grę widzimy z góry) w canvasie i jak najbardziej działają, ale ściany wydają się lepkie (jeśli tak to można ująć).

Mianowicie, gdy wciskamy klawisze góra i prawo, a po prawej jest ściana, to nie ruszamy się ani w prawo ani w górę.

tu wstawię kod:

	  for(x=0; x<12; x++){
		for(y=0; y<15; y++){
			if(mapTiles[x][y]==0){
				
				var rect1 = {x: this.x+this.xVel-(this.sideLenght/2), y: this.y+this.yVel-(this.sideLenght/2), width: this.sideLenght, height: this.sideLenght}
				var rect2 = {x: y*60, y: x*60, width: 60, height: 60}

				if (rect1.x < rect2.x + rect2.width &&
				   rect1.x + rect1.width > rect2.x &&
				   rect1.y < rect2.y + rect2.height &&
				   rect1.height + rect1.y > rect2.y) {
					           
					this.yVel = 0;
					this.xVel = 0;
					
				}
				
			}
		}
	  }

Kod w skrócie, jeśli jest kolizja to się nie ruszaj ani w górę ani w prawo, ani w dół, ani w lewo.

Jak zrobić to tak, aby w sytuacji opisanej w 3 linijce poruszać się w górę?

komentarz zamknięcia: Znalezienie rozwiązania
komentarz 2 września 2017 przez Alex.Ironside Stary wyjadacz (14,920 p.)
Nie bardzo rozumiem kod ale z fragmentu "Kod w skrocie" Wynika ze jezeli bedzie kolizja to nie mozesz sie ruszyc. Stad zgadywalbym efekt lepkiej sciany
komentarz 3 września 2017 przez DODO Bywalec (2,950 p.)

var mapTiles = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],         //1 = trawa, 0 = ściana
				[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
				[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
				];
.
.
.
.
.

class Player {
  constructor(x, y) {
    this.x = x;
    this.y = y;
	this.speed = 1;
	this.xVel = 0;
	this.yVel = 0;
	this.rotate = 0;
	this.radius = 20;
	this.sideLenght = 50;
	
	this.img = document.getElementById("player");
  }
.
.
.
update() {
for(x=0; x<12; x++){
		for(y=0; y<15; y++){
			if(mapTiles[x][y]==0){
				
				var rect1 = {x: this.x+this.xVel-(this.sideLenght/2), y: this.y+this.yVel-(this.sideLenght/2), width: this.sideLenght, height: this.sideLenght}
				var rect2 = {x: y*60, y: x*60, width: 60, height: 60}

				if (rect1.x < rect2.x + rect2.width &&
				   rect1.x + rect1.width > rect2.x &&
				   rect1.y < rect2.y + rect2.height &&
				   rect1.height + rect1.y > rect2.y) {
					
					this.yVel = 0;
					this.xVel = 0;
					
				}
				
			}
		}
	  }
}
}
komentarz 3 września 2017 przez Alex.Ironside Stary wyjadacz (14,920 p.)
Wybacz ale nic mi to nie mowi

1 odpowiedź

0 głosów
odpowiedź 4 września 2017 przez DODO Bywalec (2,950 p.)
 
Najlepsza

Dobrze, znalazłem już odpowiedź, może to nikomu nic nie powie ale zgodnie z regulaminem:

3. Najlepsze​​odpowiedzi,​​głosowanie,​​zgłoszenia,​​ukrywanie

[...]

3.1.1. W razie znalezienia odpowiedzi w sposób inny niż poprzez pytanie zadane na forum, Pasjonat ma obowiązek podania źródła, z którego uzyskał odpowiedź lub wytłumaczenie, jak do niej doszedł.

 Muszę podać rozwiązanie.

Więc zamiast kodu:

for(x=0; x<12; x++){
  for(y=0; y<15; y++){
      if(mapTiles[x][y]==0){
           
          var rect1 = {x: this.x+this.xVel-(this.sideLenght/2), y: this.y+this.yVel-(this.sideLenght/2), width: this.sideLenght, height: this.sideLenght}
          var rect2 = {x: y*60, y: x*60, width: 60, height: 60}
 
          if (rect1.x < rect2.x + rect2.width &&
             rect1.x + rect1.width > rect2.x &&
             rect1.y < rect2.y + rect2.height &&
             rect1.height + rect1.y > rect2.y) {
                          
              this.yVel = 0;
              this.xVel = 0;
               
          }
           
      }
  }
}

Napisałem:

	  for(x=0; x<mapSizeY; x++){
		for(y=0; y<mapSizeX; y++){
			if(mapTiles[x][y]==0){
				
				var rect1 = {x: this.x+this.xVel-(this.sideLenght/2), y: this.y-(this.sideLenght/2), width: this.sideLenght, height: this.sideLenght}
				var rect2 = {x: y*60, y: x*60, width: 60, height: 60}

				if (rect1.x < rect2.x + rect2.width &&
				   rect1.x + rect1.width > rect2.x &&
				   rect1.y < rect2.y + rect2.height &&
				   rect1.height + rect1.y > rect2.y) {
					
					this.xVel = 0;
					
				}
				var rect1 = {x: this.x-(this.sideLenght/2), y: this.y+this.yVel-(this.sideLenght/2), width: this.sideLenght, height: this.sideLenght}
				if (rect1.x < rect2.x + rect2.width &&
				   rect1.x + rect1.width > rect2.x &&
				   rect1.y < rect2.y + rect2.height &&
				   rect1.height + rect1.y > rect2.y) {
					
					this.yVel = 0;
					
				}
				
			}
		}
	  }

Zamiast sprawdzać kolizji ogólnie sprawdziłem ją w osi x i y oddzielnie.

Wątek zamykam.

Podobne pytania

0 głosów
1 odpowiedź 1,115 wizyt
pytanie zadane 22 października 2019 w C# przez niezalogowany
0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez CPP_Newbie Użytkownik (770 p.)
0 głosów
1 odpowiedź 313 wizyt
pytanie zadane 29 lutego 2016 w JavaScript przez rucin96 Użytkownik (500 p.)

93,430 zapytań

142,427 odpowiedzi

322,652 komentarzy

62,792 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...