[gamedesign] 2D Collision response *

Pagina: 1
Acties:

  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Hey,

Ik ben bezig aan een klein mario-achtig spelletje. de levels bestaan uit blokken van bepaalde materie, en evt ook wat flags.
Een voorbeeld is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var level1=[
  ["name","Fill in"],
  ["width",800],
  ["height",320],
  ["Objects",[
    ["Object14",0,304,192,16,imgWall],
    ["player1",32,288,16,16,imgPlayer1,GO_DYNAMIC],
    ["player2",64,288,16,16,imgPlayer2,GO_DYNAMIC],
    ["Object13",192,288,32,32,imgWall],
    ["Object12",224,304,576,16,imgWall],
    ["Object11",256,160,16,16,imgWall],
    ["Object10",256,176,16,16,imgIce],
    ["Object09",256,192,16,16,imgWall],
    ["Object08",256,208,16,16,imgIce],
    ["Object07",256,224,16,16,imgWall],
    ["Object06",256,240,16,16,imgIce],
    ["Object05",256,256,16,16,imgWall],
    ["Object04",256,272,16,16,imgIce]
  ]]
];

Elk object bestaat uit: [id,x,y,width,height,image,flags]

Om collision van dynamische objecten te doen, doe ik het volgend:

For elk object
If (oude position was boven of gelijk aan posititie andere object en nieuwe position is in of onder positie andere object) {
//snelheid y=0, en y=positie zodat ie gelijk op andere object staat
} else if (oude position was links van.....) {
...
} else ...

Dit werkt op zich prima, maar bij sommige objecten geeft hij problemen :(
Als je bijvoorbeeld een rechtopstaande muur hebt die bestaat uit verschillende objecten, en je houdt pijltje naar rechts in dan gebeurt er dit:
Gravity gooit object naar beneden, pijltje drukt hem naar rechts (de muur in)
Als je dan bij een splitsing tussen twee objecten zit, waarvan het bovenste object later in de array van objecten zit, dan ziet eerst het onderste object dat hij eerste boven en nu onder zit -> stilzetten en terugzetten. Daarna pas wordt het object weer terug van de muur gedrukt.

Dit resulteert erin dat je een muur uit verschillende objecten op kan klimmen door je pijltje erin ingedrukt te houden, en af en toe op jump te drukken :(

Uiteraard is dit niet de bedoeling...

Nu de vraag:
Weet iemand een oplossing, of een andere manier om dit aan te pakken ?

Alvast bedankt,
TB

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Je zou een functie kunnen schrijven die aan elkaar ge-alignde objecten samenvoegt tot een virtueel object en vervolgens deze gebruiken om de collision te detecteren.

oprecht vertrouwen wordt nooit geschaad


  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Atgast schreef op maandag 26 december 2005 @ 14:44:
Je zou een functie kunnen schrijven die aan elkaar ge-alignde objecten samenvoegt tot een virtueel object en vervolgens deze gebruiken om de collision te detecteren.
Al aan gedacht, maar ik wil ook objecten naar beneden laten vallen door ineens de GO_DYNAMIC flag te zetten... En dan zou ik dat helemaal weer opnieuw moeten laten berekenen :(

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13:13
Of de objecten elkaar laten overlappen?

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

heel crappy zou je ook kunnen zeggen dat de toetscombi (> of <) + /\ niet mag wanneer mario tegen een object aan staat, /\ + (< of >) daarentegen weer wel.
Ik weet niet of je de mogelijkheid hebt om te registreren welke knop eerst werd ingedrukt.

oprecht vertrouwen wordt nooit geschaad


  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Mwja, ik kan de controls in-air wel uitzetten, maar dan is de hele game weer veeeel moeilijker :(

EDIT:
Om nog even duidelijk te maken wat ik bedoel heb ik hem maar ff online gezet:
http://www.stuffplug.com/MessengerQuest/

Spring tegen de muur van ijs en steen op, en houd je toets naar rechts ingedrukt...
De code waar de collision staat is in gameobjects.js in " this.Update=function() {" in de GameObject "class"

PS Game werkt tot nu toe alleen in IE :/

[ Voor 71% gewijzigd door TheBlasphemer op 26-12-2005 15:12 ]

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Zit het probleem niet gewoon in het feit dat het mannetje op een naastgelegen blokje staat?
Volgens mij moet je de 'sta-marge' van het poppetje gewoon met 1 verkleinen.

oprecht vertrouwen wordt nooit geschaad


  • EfBe
  • Registratie: Januari 2000
  • Niet online
het mannetje kan nooit ergens op staan als de positie onder hem leeg is. Ergens in je routine ga je kijken naar het blokje in de richting van de beweging, maar als daar dan uit volgt dat het poppetje niet beweegt (omdat ie met zn harses tegen een blok ijs knalt) dan neem je aan dat hij TOCH daarnaartoe verplaatst is. Dit klopt dus niet.

Het poppetje wordt dmv de cursor keys bewogen in een richting. Je gaat dan eerst bepalen of hij die richting op kan(dus of daar iets staat). Zo nee dan verplaats je het poppetje niet, zo ja dan verplaats je het poppetje wel.

Daarna moet je ALTIJD kijken of je poppetje in de huidige positie kan blijven staan, dus hier interpreteer je 'zwaartekracht' op je poppetje. Is er niets onder het poppetje, dan moet hij dus door de zwaartekracht worden verplaatst naar beneden. En dan begint het gehele feest weer opnieuw, want je bent aangeland bij het einde van je gameloop :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

* topictitel maar even gewijzigd, het gaat je namelijk niet om de detection maar om hoe je ermee om moet gaan :)

De fout die je maakt, zoals EfBe al zegt, is dat je al een respons gaat bedenken terwijl je nog helemaal niet weet of dat object wel als eerst aangeraakt wordt. Zoek eerst het object dat als eerst wordt aangeraakt. Beweeg je mario in die richting tot ie niet meer verder kan. Je houdt nu een beetje "energie" over, omdat ie minder ver in de x- en y-richting heeft bewogen dan z'n bewegingsvector aangeeft. Kijk welke kant je van het object raakt. Is dat bijvoorbeeld de onder- of bovenkant, dan kun je je hele colision routine nog een keer doen vanaf de plek waar hij nu staat, met als bewegingsvector dat gedeelte in de x-richting wat overblijft. Voor de zijkant van een object doe je dat met de y-richting.

Aangezien je altijd op het object reageerd dat je in je beweging als eerste aanraakt, kan een situatie zoals jij schetst niet voorkomen.

[ Voor 80% gewijzigd door .oisyn op 26-12-2005 16:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Collision response :)
Jullie zijn geweldig! na 1 google search op "response" ipv "detection" kwam ik op http://jnrdev.72dpiarmy.com/en/jnrdev1/ met een geweldige tip :)
Ik doe nu dus ipv snelheidx en snelheidy tegelijk toepassen en dan colliden eerst snelheidx toepassen en kijken of er dan collision is (en in geval van collision, object terugzetten en snelheid aanpassen), en daarna ditto voor de y-as :)

Bedankt :)

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat klopt niet, dan beweeg je om een hoekje als het ware.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • EfBe
  • Registratie: Januari 2000
  • Niet online
idd, je moet de echte vector bereken. dus als rechts EN omhoog ingedrukt zijn, is de vector naar rechtsboven, DAAR moet je dan kijken of je tegen een blokje aanrost.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • TheBlasphemer
  • Registratie: September 2004
  • Laatst online: 13-11-2025
Ssst :P
Dit ziet er prima uit, en is een STUK makkelijker ;)
Het is inderdaad niet precies zoals het hoort, maar het is ook maar een game-simulatie, niet een natuurkundig-experiment simulator :)

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]

Pagina: 1