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

Kolizja w js, jak wykryć?

Object Storage Arubacloud
0 głosów
1,070 wizyt
pytanie zadane 31 stycznia 2016 w JavaScript przez michal Mądrala (5,560 p.)

Próbuję napisać grę w js w której będzie się strzelać na bramkę. Mam problem z napisaniem kodu który wykryje mi kolizję piłki z bramkarzem. Może ktoś coś doradzi ?

KOD:

$(document).ready(function(){

var documentHeight = document.documentElement.clientHeight;

var margintop = (documentHeight/2)-230;

function checkKey(e) {
		// Wykrywanie kolizji:
		var rect1 = {x: parseInt(getComputedStyle($('#pilka')).left, 10), y: parseInt(getComputedStyle($('#pilka')).top, 10), width: parseInt(getComputedStyle($('#pilka')).width, 10), height: parseInt(getComputedStyle($('#pilka')).height, 10)};
		var rect2 = {x: parseInt(getComputedStyle($('#bramkarz')).left, 10), y: parseInt(getComputedStyle($('#bramkarz')).top, 10), width: parseInt(getComputedStyle($('#bramkarz')).width, 10), height: parseInt(getComputedStyle($('#bramkarz')).height, 10)};
		
		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) {
			$('body').append(" GOOOOOOOL ");
			}
}

$('#container').css("margin-top", margintop);

$('#bramka'). click(function(){
	var x = Math.floor(Math.random() * 220 +1);
	var y = Math.floor(Math.random() * 40 +1);
	var str = Math.floor(Math.random() * 2 +1);
	
	if (str == 1)
	{
		x = x-(x*2);
	}
	$(this).html('<div id="bramkarz" style="left:'+x+'px; top:'+y+'px;"><img src="bramkarz.png" width="100" height="100" /></div>');
	var pos_x = event.offsetX?(event.offsetX):event.pageX-document.getElementById("container").offsetLeft;
	var pos_y = event.offsetY?(event.offsetY):event.pageY-document.getElementById("container").offsetTop;
	$('body').append(pos_x+" "+pos_y+" | ");
	
	if (pos_x < 278)
	{
		pos_new_x = (278 - pos_x);
		pos_x = pos_new_x;
		pos_x = pos_x-(pos_x*2);
	}
	else
	{
		pos_x = pos_x - 278;
	}
	
	pos_y = pos_y - 145;
	
	$('#pilka').animate(
		{
			'position' : 'fixed',
			'left' : pos_x,
			'top' : pos_y,
			'width' : '50px',
			'height' : '50px'
		}, 500);
		
	checkKey;	
	
	
	setTimeout(function(){
		$('#pilka').css({
			'position' : 'relative',
			'left' : '0',
			'top' : '135px',
			'width' : '100px',
			'height' : '100px'
		});
		$('#bramka').html('<div id="bramkarz"style="left:0px; top:40px;"><img src="bramkarz.png" width="100" height="100" /></div>');
	}, 1500);
});

	
});

 

2 odpowiedzi

+1 głos
odpowiedź 31 stycznia 2016 przez jpacanowski VIP (101,940 p.)

W sieci znalazłem taki artykuł. Może będzie przydatny.
http://jsdn.pl/tworzenie-gier-w-javascript-kolizje-czesc-pierwsza/

komentarz 31 stycznia 2016 przez michal Mądrala (5,560 p.)
Widziałem to i właśnie na podstawie tego próbowałem napisać kod, ale nie działa. Myślę że problem tkwi w tym ze tam jest to jakoś do obiektów zastosowane, a u mnie muszę wykryć kolizję dwóch div`ów.
komentarz 31 stycznia 2016 przez Greeborox Użytkownik (660 p.)
Zdefiniuj jeszcze width tych divow. Czyli ich szerokość. Jest potrzebna przy wykryciu kolizji. Może to pomoże? Albo w funkcji gdzie wykrywasz kolizje, zmień 'rect.width' na wartość szerokości.

Rozumiem, że sprawdzanie kolizji następuje po każdym ruchu, tak? Pojawiają Ci się jakieś błędy w konsoli?
+1 głos
odpowiedź 31 stycznia 2016 przez Comandeer Guru (601,590 p.)
var rect1 = {x: parseInt(getComputedStyle($('#pilka')).left, 10), y: parseInt(getComputedStyle($('#pilka')).top, 10), width: parseInt(getComputedStyle($('#pilka')).width, 10), height: parseInt(getComputedStyle($('#pilka')).height, 10)};
        var rect2 = {x: parseInt(getComputedStyle($('#bramkarz')).left, 10), y: parseInt(getComputedStyle($('#bramkarz')).top, 10), width: parseInt(getComputedStyle($('#bramkarz')).width, 10), height: parseInt(getComputedStyle($('#bramkarz')).height, 10)};

Polecam popatrzeć na $.fn.offset – to zdecydowanie ułatwi obliczenia ;)

komentarz 31 stycznia 2016 przez michal Mądrala (5,560 p.)
Heh widze że to nie takie proste, nie mogę się w tym ogarnąć.
komentarz 31 stycznia 2016 przez Comandeer Guru (601,590 p.)
Dzięki tej metodzie uzyskasz odległość elementu od lewego i górnego brzegu ekranu. Dodając do tego wymiary elementu otrzymasz obszar, jaki zajmuje. Więc wystarczy porównać z obszarem innego elementu, by wiedzieć, czy się stykają.
komentarz 1 lutego 2016 przez michal Mądrala (5,560 p.)

Załapałem o co chodzi, tylko teraz mam problem z ustaleniem pozycji piłki po oddaniu strzału. offset() podaje mi cały czas pozycje piłki przed strzałem ;/

Zmieniłem tak kod:


$(document).ready(function(){

var documentHeight = document.documentElement.clientHeight;

var margintop = (documentHeight/2)-230;

$('#container').css("margin-top", margintop);

$('#bramka'). click(function(){
    var x = Math.floor(Math.random() * 220 +1);
    var y = Math.floor(Math.random() * 40 +1);
    var str = Math.floor(Math.random() * 2 +1);
    
    if (str == 1)
    {
        x = x-(x*2);
    }
    $(this).html('<div id="bramkarz" style="left:'+x+'px; top:'+y+'px;"><img src="bramkarz.png" width="100" height="100" /></div>');
    var pos_x = event.offsetX?(event.offsetX):event.pageX-document.getElementById("container").offsetLeft;
    var pos_y = event.offsetY?(event.offsetY):event.pageY-document.getElementById("container").offsetTop;
    //$('body').append(pos_x+" "+pos_y+" | ");
    
    if (pos_x < 278)
    {
        pos_new_x = (278 - pos_x);
        pos_new_x = pos_new_x-(pos_new_x*2);
    }
    else
    {
        pos_new_x = pos_x - 278;
    }
    
    pos_y = pos_y - 145;
    
    $('#pilka').animate(
        {
            'position' : 'absolute',
            'left' : pos_new_x,
            'top' : pos_y,
            'width' : '50px',
            'height' : '50px'
        }, 300);
    
    
    
    //checkKey;    
    
    var pilka =  $('#pilka').offset();
    $('body').append("Pilka: "+pilka.left + " "+pilka.top+ " | ");
    var bramkarz = $('#bramkarz').offset();
    $('body').append("bramkarz: " + bramkarz.left + " " + bramkarz.top + " | ");
    
    
    setTimeout(function(){
        $('#pilka').css({
            'position' : 'relative',
            'left' : '0',
            'top' : '135px',
            'width' : '100px',
            'height' : '100px'
        });
        $('#bramka').html('<div id="bramkarz"style="left:0px; top:40px;"><img src="bramkarz.png" width="100" height="100" /></div>');
    }, 1500);
});

    
})



Stronkę wrzuciłem na mp66.linuxpl.info/osagol

Podobne pytania

0 głosów
0 odpowiedzi 363 wizyt
pytanie zadane 28 października 2016 w JavaScript przez Miki Bywalec (2,480 p.)
0 głosów
1 odpowiedź 477 wizyt
0 głosów
1 odpowiedź 133 wizyt
pytanie zadane 28 listopada 2019 w JavaScript przez BorkBork Początkujący (290 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...