Vinnaren i pepparkakshustävlingen!
2017-12-15, 14:34
  #1
Medlem
Jag tycker att denna artikel har en jättebra beskrivning av problemet:
https://stackoverflow.com/questions/...on-corners-fix

För er som inte vet vad response är, det betyder helt enkelt att objektet inte ska kunna gå igenom annat objekt. Nu till problemet, när A befinner sig ovanför B och kolliderar med B vid hörnet, så triggas annan istället för den korrekta sidan, toppen av B. Jag tror att det beror på att velocityn Y är lite för hög och hoppar över efter frame. Hur löser man detta?

Här kan ni testa live och förstå hur jag menar, håll ner piltangenten ner tills du kolliderar:
https://codepen.io/anon/pen/mpJNOV?editors=0010
Citera
2017-12-15, 14:47
  #2
Medlem
edm4lifes avatar
Kollade lite snabbt och det jag kan komma på är att du kör b0.update() innan själva kollisionsdetekteringen. Vad händer om du gör det i motsatt ordning, finns buggen kvar då? Du får nog refaktorera din kod lite för att iallafall jag ska orka gå in och fixa det.
Citera
2017-12-15, 15:11
  #3
Medlem
Citat:
Ursprungligen postat av edm4life
Kollade lite snabbt och det jag kan komma på är att du kör b0.update() innan själva kollisionsdetekteringen. Vad händer om du gör det i motsatt ordning, finns buggen kvar då? Du får nog refaktorera din kod lite för att iallafall jag ska orka gå in och fixa det.
Vad jag har förstått så är regeln att detekteringen ska köras efter update, men oavsett var så finns buggen kvar ändå. Gissningsvis är det så att när kollideringen sker så är b0s height större än width innanför b1, därför skjuts b0 på fel sida. Man kanske ska jämföra b0s gamla positioner före frame, men vet inte riktigt hur och får det inte att fungera. Kanske lite överkurs detta.

Nu har jag snyggat till koden lite och kommenterat:
https://codepen.io/anon/pen/mpJNOV?editors=0010
__________________
Senast redigerad av zyxos 2017-12-15 kl. 15:27.
Citera
2017-12-15, 16:30
  #4
Medlem
edm4lifes avatar
Citat:
Ursprungligen postat av zyxos
Vad jag har förstått så är regeln att detekteringen ska köras efter update, men oavsett var så finns buggen kvar ändå. Gissningsvis är det så att när kollideringen sker så är b0s height större än width innanför b1, därför skjuts b0 på fel sida. Man kanske ska jämföra b0s gamla positioner före frame, men vet inte riktigt hur och får det inte att fungera. Kanske lite överkurs detta.

Nu har jag snyggat till koden lite och kommenterat:
https://codepen.io/anon/pen/mpJNOV?editors=0010

Alltså problemet är ju ganska uppenbart. Om du ändrar 5 till 1 så försvinner buggen. Har bara kollat lite snabbt men du verkar inte ta med velocityn i beräkningen när du kollar om objekten kommer kollidera.
Citera
2017-12-15, 16:52
  #5
Medlem
edm4lifes avatar
Det verkar lite ologiskt att du uppdaterar boxens x/y position innan du ens har kollat om den kommer kollidera eller ej. vx och vy sätter du bara baserat på att knappen är nedtryckt, sedan kör du update direkt vilket uppdaterar boxens x och y koordinater utan att ta hänsyn till kollision, eller har jag missat något?
Citera
2017-12-15, 17:00
  #6
Medlem
edm4lifes avatar
https://gamedevelopment.tutsplus.com...m--gamedev-169
Citera
2017-12-15, 17:40
  #7
Medlem
Citat:
Ursprungligen postat av edm4life
https://gamedevelopment.tutsplus.com...m--gamedev-169
Den har jag läst och ska testa deras metod, men skulle lösningen på denna vara så att man ändrar p0s positioner till det minsta overlap, typ 1px, innan? Hur gör man det? AABB innan själva detekteringen?
Citera
2017-12-15, 18:31
  #8
Medlem
edm4lifes avatar
Citat:
Ursprungligen postat av zyxos
Den har jag läst och ska testa deras metod, men skulle lösningen på denna vara så att man ändrar p0s positioner till det minsta overlap, typ 1px, innan? Hur gör man det? AABB innan själva detekteringen?

Detta kanske kan ge en liten hint iallafall. Om du loggar i konsolen innanför din if-sats för kollisionsdetektion ser du att den är true för kollision även när problemet uppstår.

Problemet verkar vara att den kolliderar på fel axel relativt till velocityn.
__________________
Senast redigerad av edm4life 2017-12-15 kl. 18:54.
Citera
2017-12-16, 21:53
  #9
Medlem
Citat:
Ursprungligen postat av edm4life
Detta kanske kan ge en liten hint iallafall. Om du loggar i konsolen innanför din if-sats för kollisionsdetektion ser du att den är true för kollision även när problemet uppstår.

Problemet verkar vara att den kolliderar på fel axel relativt till velocityn.
Ja, men jag vet inte riktigt hur ekvationen ser ut för att hindra detta. Har sökt massor utan framgång.

https://gamedev.stackexchange.com/qu...2d/18589#18589
__________________
Senast redigerad av zyxos 2017-12-16 kl. 22:25.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback