GMOT
Nieuws:
 
*
Welkom, Gast. Alsjeblieft inloggen of registreren. 19 Mei 2019, 15:45:01


Login met gebruikersnaam, wachtwoord en sessielengte


Pagina's: [1]
  Print  
Advertenties


PJK
King of the hill
******

Berichten: 1.639


Bekijk profiel
« Gepost op: 02 November 2015, 21:47:45 »

Greetings,

Ik ben bezig met een 2d topdown game waarbij de speler door een doolhof van blokjes kan lopen.

Op dit moment weet de speler[1] wanneer hij een blokje aanraakt, en weten de blokjes hoe ze de speler uit zichzelf kunnen duwen wanneer de speler in een blokje terecht komt.
Elke frame houdt de speler zijn huidige x- en y-coördinaten bij als oldX en oldY en updatet hij de x en y wanneer de gebruiker op de pijltoetsen drukt.
Wanneer de speler in een blokje terecht komt, zal het blokje de speler zo ver wegzetten, dat er geen collision meer is, in de richting van de oude positie van de speler. Wanneer er maar één blokje is waarmee de speler in aanraking is, gaat alles goed.

Het probleem is wanneer er meerdere blokjes zijn waarmee de speler in aanraking is.

  • De gebruiker drukt zowel de rechter- als de bovenpijltoets in.
  • > De speler slaat zijn huidige positie op in oldX en oldY, hier voorgesteld als het groene vierkant
    > De speler gaat nu naar boven en naar rechts.
    > Het bovenste blokje zal de speler net zolang terugduwen richting de oude positie tot speler.y == zichzelf.y + zichzelf.height omdat de speler meer de onderkant aanraakt, dan de linkerkant.
    > Het onderste blokje zal de speler nog verder terugduwen tot speler.x == zichzelf.x - speler.width
En nu staat de speler weer terug waar hij vandaan kwam.

Puntje 3 geeft aan wat ik eigenlijk wil bereiken.

Ik heb al wat op internet gezocht, maar het enige advies dat ik tegenkwam was kijken naar de kant waar de speler het blokje benadert, en de speler dan in die richting (veelvouden van 90 graden) duwen. Het probleem is dan nog steeds hetzelfde (meerdere blokjes duwen hem de verkeerde kant op), met als extra probleem dat hij op een soort grid snapt.

Heeft iemand enig idee hoe ik dit op kan lossen?
Alvast bedankt!

[1]Met speler bedoel ik het personage in het spel zelf, niet degene die het spel speelt. Degene die het spel speelt noem ik hier even "de gebruiker".
Gelogd

ShroomProductions
Pretty addicted
*******

Berichten: 3.213



Bekijk profiel
« Antwoord #1 Gepost op: 02 November 2015, 22:10:22 »

Kun je niet in plaats van de speler uit de blokjes duwen van te voren kijken of je bij een verplaatsing in een blokje terecht komt (per pixel dat je verplaatst) en zo ja de verplaatsing dan niet uitvoeren? Of is het de bedoeling dat je wel in de blokjes terecht komt?

in gml zou het dan zo iets worden:
Code:
repeat(speed) {
    if ! place_meeting(x+xdir, y+ydir, blokje) {
        x+=xdir; y+=ydir;
    } else {
        break;
    };
};
« Laatste verandering: 02 November 2015, 22:16:18 door ShroomProductions » Gelogd


PJK
King of the hill
******

Berichten: 1.639


Bekijk profiel
« Antwoord #2 Gepost op: 02 November 2015, 22:16:34 »

Als ik een ghost op pad zou sturen, die door de blokjes weg laat duwen en dan de speler op dezelfde plaats zet als de ghost, zit je uiteindelijk toch met hetzelfde probleem?
Of begrijp ik je verkeerd?
Gelogd

ShroomProductions
Pretty addicted
*******

Berichten: 3.213



Bekijk profiel
« Antwoord #3 Gepost op: 02 November 2015, 22:24:55 »

Ik zal wel degene zijn die het niet goed begrijpt. Duw je de speler uit de blokjes om te voorkomen dat hij er in blijft hangen of is heeft het met de gameplay (of gewoon een fancy effect) te maken? In het eerste geval moet je zorgen dat de speler gewoon niet in de blokjes terecht kan komen, in het tweede geval zou je misschien bij collision met meerdere blokjes slechts één blokje (tegelijk) kunnen laten duwen, maar ik denk dat je ook moet kijken naar de positie zodat je hem niet weer in een ander blokje duwt. Lastig
Gelogd


chiel99
Just the few of us
*****

Berichten: 917


Bekijk profiel WWW
« Antwoord #4 Gepost op: 02 November 2015, 22:36:48 »

Gewoon checken of de positie waar de speler heen wil (x, y) niet bezet is met een block. Zoja dan verplaats je de speler niet. Zonee dan verplaats je de speler.
Gelogd

@-wout
Administrator
Approaching infinity
*********

Berichten: 9.429



Bekijk profiel WWW
« Antwoord #5 Gepost op: 02 November 2015, 22:42:16 »

Aaa, basic collision detection. Wat je 'verkeerd' doet is dat je eerst loopt en dan kijkt of hij moet worden weggeduwt. Het beste kun je een x_new en y_new berekenen (bijv x+speed en y+speed). Vervolgens kijk bij de blokjes in de buurt of de speler x_new+width/2 groter is dan blokje_x-width/2 (ervanuitgaand dat de x in het midden van het blokje zit).

Als blijkt dat de nieuwe positie van de speler in een blok zit, zorg je er voor dat de x_new zo wordt aangepast dat het perfect past (dus bijv speler.new_x = self.x-self.width/2 vanuit het blokje). Als je dit voor de vier richtingen doet heb je een foutloze collision.
Gelogd

kaas1
Infinity
*********

Berichten: 19.940


LeesMij.txt


Bekijk profiel
« Antwoord #6 Gepost op: 03 November 2015, 00:50:23 »

Je kan ook x en y om de beurt doen. Als ik het goed begrijp doe je nu:
X + Y bewegen
X + Y terugduwen

dat kan worden:
X bewegen
X terugduwen
Y bewegen
Y terugduwen
Gelogd


Tommy9119
Approaching infinity
********

Berichten: 6.160


It's going to be yuge.


Bekijk profiel
« Antwoord #7 Gepost op: 03 November 2015, 08:18:53 »

Kan je niet gewoon collision detection aanzetten op je sprites.
Gelogd

Lord Tommy of Sealand.

chiel99
Just the few of us
*****

Berichten: 917


Bekijk profiel WWW
« Antwoord #8 Gepost op: 03 November 2015, 08:36:06 »

Ik denk niet dat het om Gamemaker gaat. Maarja dan kun je het collisionevent gebruiken ja.
Gelogd

Maarten
Approaching infinity
********

Berichten: 8.274



Bekijk profiel
« Antwoord #9 Gepost op: 03 November 2015, 08:42:50 »

Dit topic moet naar gevorderden!
Gelogd

SLiV
King of the hill
******

Berichten: 1.521



Bekijk profiel
« Antwoord #10 Gepost op: 03 November 2015, 12:17:49 »

Ah dit probleem heb ik ook al meerdere keren opnieuw moeten oplossen. Er is niet echt een unieke consistente oplossing, want als je schuin op een hoek afloopt, moet je dan naar boven of naar onder?

Je kan om en om een pixel verplaatsen, maar dat is al snel heel traag. Je kan ook eerst X en dan Y doen, maar dat geeft andere resultaten dan eerst Y en dan X; bovendien heeft dit het probleem in engines met variabele framerates (i.e. beweging is afhankelijk van de lengte van de frame) dat een beweging (3 naar rechts, 100 naar beneden) ervoor zorgt dat je blijft haken op een muurtje en dus niet naar beneden beweegt. Een betere oplossing is misschien om in stapjes van 10 pixels te bewegen, en steeds de grootste te nemen.
Gelogd

PJK
King of the hill
******

Berichten: 1.639


Bekijk profiel
« Antwoord #11 Gepost op: 03 November 2015, 13:35:07 »

Ik gebruik nu de methode die Kaas1 gegeven heeft. Het werkt snel en was eenvoudig te implementeren.

Je kan ook eerst X en dan Y doen, maar dat geeft andere resultaten dan eerst Y en dan X; bovendien heeft dit het probleem in engines met variabele framerates (i.e. beweging is afhankelijk van de lengte van de frame) dat een beweging (3 naar rechts, 100 naar beneden) ervoor zorgt dat je blijft haken op een muurtje en dus niet naar beneden beweegt.
Een betere oplossing is misschien om in stapjes van 10 pixels te bewegen, en steeds de grootste te nemen.
Die laatste zin begrijp ik niet helemaal, wat bedoel je precies?
Gelogd

Goudewup
Pretty addicted
*******

Berichten: 4.529


Viva la resistance!


Bekijk profiel
« Antwoord #12 Gepost op: 03 November 2015, 13:38:31 »

Wouter's methode is best methode.
Heil unsere diktator!
Gelogd



Advertenties
Pagina's: [1]
  Print  

 
Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines | Smartphoneversie bekijken

Dilber MC Theme by HarzeM