game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
De activerings e-mail gemist?
+  Forums
|-+  Werken met Game Maker
| |-+  Experts (Moderator: Simon Donkers)
| | |-+  Ideale platform slope-movement
Pagina's: [1]
« vorige volgende »
Print
Advertenties

Pallas
Gebruiker


Offline Offline

Berichten: 797

Carpe Diem!


« Gepost op: 3 Januari 2009, 17:32:17 »

In erg veel platformspellen is het mogelijk om niet alleen over volledig horizontale of over gelijkmatig oplopende oppervlakken te lopen, maar ook over ongelijkmatige oppervlakken ('slopes').
Nu valt het mij op dat veel engines die dit mogelijk maken, nogal wat fouten bevatten (ook de mijne in Ninjamboree).

Ik ben al enige tijd bezig met een engine die dit wél correct doet en daarnaast de image_angle van het poppetje aanpast aan de helling van het terrein én zwaartekracht in een willekeurige richting ondersteunt.
Om dit voor elkaar te krijgen heb ik eerst een werkende engine nodig voor het gewone slope-movement zonder aanpassende image_angle en met zwaartekracht in één richting.
Nu lijkt dit niet moeilijk, maar ik zal de problematiek die hier bij komt kijken laten zien.

Een bekend stukje code die hiervoor gebruikt wordt is de volgende, waarbij argument0 de gewenste horizontale verplaatsing is (bijvoorbeeld 5 pixels) en argument1 de maximale stijlheid waarmee verplaatst mag worden:
GML:
for (i=0;i<argument1;i+=1)
   {
   if place_free(x+argument0,y-i)
       {
       x += argument0;
       y -= i;
       exit;
       }
   }
Mijn bezwaren:
  • De code kijkt alleen maar of een plaats op een bepaalde horizontale afstand (bijvoorbeeld 5 pixels) vrij is en probeert daar een vrije y-positie te vinden. Maar omdat er dus niet gekeken wordt of er iets tussen de huidige x-positie en de nieuwe zit, kan het zijn dat je door een obstakel heen gaat.
    Behalve dat je door een obstakel heen zou kunnen gaan, zou het je ook kunnen tegenhouden. Stel je een hobbel voor in het terrein waar je niet over kan met een horizontale snelheid van 3. Als je die zelfde hobbel nadert met een snelheid van 15, zou je er wél over kunnen, omdat er dan zo'n eind verder op wordt gezocht naar een passende y-positie (15 pixels verder) kan het dus zo zijn dat in dat geval het hobbeltje wordt genegeerd.
    Dit levert rare situaties op. Je kan met een lage snelheid ergens niet overheen, maar met een hoge wel. Je moet dan steeds een aanloop nemen en dat speelt helemaal niet lekker.
  • Stel je hebt een obstakel dat je met een snelheid van 20 tegemoet gaat. Je bent op een horizontale afstand van 19 pixels. Met deze code blijf je dan op die afstand staan (er is geen vrije y-positie op afstand 20). Pas als de snelheid afneemt, kan je het obstakel naderen...
  • Het volgende probleem leg ik uit met een afbeelding:
    http://img246.imageshack.us/my.php?image=probleemslopemovement1cv4.png
    Stel je voor dat je naar het linkerbovenhoekje loopt (waar je de pijl ziet). Het groene gedeelte is transparant. Met bovenstaande code kan je wel in het hoekje komen, maar niet eruit. Dit komt omdat de code alleen maar naar vrije y-pixels naar boven zoekt, en niet naar onder. Hierdoor kan je dus wél naar dat hoekje toelopen, maar er niet meer vandaan. Daarom zou je kunnen denken dat je in plaats van bij i=0; begint, beter bij i=-10; zou kunnen beginnen. Dan zoek je namelijk ook naar beneden. Het nadeel dat hierbij hoort is dat als je in de lucht naar beneden valt, en dan naar rechts beweegt, je extra hard naar beneden gaat (de loop begint dan namelijk naar een vrije y-positie 10 pixels onder het mannetje te kijken, welke vrij kan zijn tijdens een val).

Ik hoor graag jullie ideeën over een juiste methode, al dan niet in pseudo-code. Ik zal ook nog mijn methode posten (die ik jullie nog even bespaar na zo'n verhaal), die enkele bovenstaande problemen wegwerkt maar voor nieuwe zorgt.

« Laatste verandering: 3 Januari 2009, 17:35:09 door Pallas »

- Voltooid -
Ninjamboree
Het Geheime Wapen
- In ontwikkeling -
Carpe Diem - 80 %
Naar boven Gelogd

TrevoriuS
Gebruiker

Offline Offline

Berichten: 1687


« Antwoord #1 Gepost op: 4 Januari 2009, 01:14:24 »

met collision line kan je testen of je iets tegenkomt
zoja, gebruik een while loop om je snelheid te laten afnemen tot het punt waarop je door kan
daarnaast doet het laatste probleem zich niet voor als je naar een lagere y positie zoekt, als je zorgt dat je de y alleen laat afnemen. je hoeft niet de y te verhogen als je een helling afloopt, want daar heb je de gravity al voor.


Naar boven Gelogd

blackhawk
Gebruiker

Offline Offline

Berichten: 1318

NumNumNum ^,^


WWW
« Antwoord #2 Gepost op: 4 Januari 2009, 01:21:07 »

met collision line kan je testen of je iets tegenkomt
zoja, gebruik een while loop om je snelheid te laten afnemen tot het punt waarop je door kan
daarnaast doet het laatste probleem zich niet voor als je naar een lagere y positie zoekt, als je zorgt dat je de y alleen laat afnemen. je hoeft niet de y te verhogen als je een helling afloopt, want daar heb je de gravity al voor.
die gravity.. die Y is wel handig als je wilt dat hij niet steeds 2 pixels naar links gaat, dan 2 pixels naar beneden valt etc. je wil dat hij
/
zo gaat en niet
_
|/

waarin het rode het pad is van de speler en het zwarte de slope.


Nieuwe server!
Naar boven Gelogd

tidob1
Gebruiker


Offline Offline

Berichten: 2607


« Antwoord #3 Gepost op: 4 Januari 2009, 10:51:41 »

Je moet ook rekening houden met springen wat niet vanuit de lucht mogelijk is (alleen met 'grond' onder je), want als je zoals blackhawk zegt naar beneden gaat, kun je dan bijna niet springen, omdat je telkens in de lucht zit. Je moet dan eerst stil gaan staan, dan wachten tot je naar beneden bent gevallen, en dan pas springen.

Oja, en om het vallen niet sneller te laten gaan met die i=-10, moet je gewoon kijken of dat je valt, of dat je een schuine helling af loopt, lijkt me niet zo heel moeilijk.

Naar boven Gelogd

TrevoriuS
Gebruiker

Offline Offline

Berichten: 1687


« Antwoord #4 Gepost op: 4 Januari 2009, 11:11:33 »

die gravity.. die Y is wel handig als je wilt dat hij niet steeds 2 pixels naar links gaat, dan 2 pixels naar beneden valt etc. je wil dat hij
/
zo gaat en niet
_
|/

waarin het rode het pad is van de speler en het zwarte de slope.
Als je gravity accuraat werkt dan heb je dat probleem niet, je valt namelijk na het berekenen van je nieuwe x positie, en voor het tekenen van je nieuwe totaalpositie.


Naar boven Gelogd

Pallas
Gebruiker


Offline Offline

Berichten: 797

Carpe Diem!


« Antwoord #5 Gepost op: 4 Januari 2009, 21:32:09 »

Citaat
met collision line kan je testen of je iets tegenkomt
Omdat collision_line maar één lijntje checkt, kan het alsnog zijn dat hij een obstakel niet opmerkt. Ik probeer juist iets pixelperfects te krijgen.
Citaat
zoja, gebruik een while loop om je snelheid te laten afnemen tot het punt waarop je door kan
daarnaast doet het laatste probleem zich niet voor als je naar een lagere y positie zoekt, als je zorgt dat je de y alleen laat afnemen. je hoeft niet de y te verhogen als je een helling afloopt, want daar heb je de gravity al voor.
Hoe wil je daarvoor zorgen? In mijn voorbeeld kan dat bijvoorbeeld niet als je in dat hoekje zit; omdat je niet door die helling heen kan. En over je laatste zin: hoe maak ik onderscheid tussen naar beneden gaan om uit dat hoekje bij het voorbeeld te komen, of om naar beneden te gaan van een helling?

Citaat
die gravity.. die Y is wel handig als je wilt dat hij niet steeds 2 pixels naar links gaat, dan 2 pixels naar beneden valt etc. je wil dat hij
/
zo gaat en niet
_
|/

waarin het rode het pad is van de speler en het zwarte de slope.
Dat klopt. Echter, als je het volgens de onderste methode doet, en daarna de y juist corrigeert, zie je daar niet(s)/ (veel) van. Dat geeft TrevoriuS ook aan.

Citaat
Je moet ook rekening houden met springen wat niet vanuit de lucht mogelijk is (alleen met 'grond' onder je), want als je zoals blackhawk zegt naar beneden gaat, kun je dan bijna niet springen, omdat je telkens in de lucht zit. Je moet dan eerst stil gaan staan, dan wachten tot je naar beneden bent gevallen, en dan pas springen.
Maar wanneer je het volgens die tweede methode van blackhawk doet en zorgt dat die y-correctie gebeurt ná het horizontaal bewegen, eindig je dus wel op de grond. Het is inderdaad wel een punt; je moet zorgen voor een zodanige zwaartekracht dat je niet hoeft te wachten tot je naar beneden bent gevallen, zoals jij aangeeft.  Razz

Citaat
Oja, en om het vallen niet sneller te laten gaan met die i=-10, moet je gewoon kijken of dat je valt, of dat je een schuine helling af loopt, lijkt me niet zo heel moeilijk.
Tja... Feitelijk is het van zo'n schuine helling aflopen net zoiets als vallen alleen dan korter.


Ik heb nu deze code:
GML:
var i,stop,found;
stop=0;
repeat(abs(h_speed))
    {
    for (i=0; i<5; i+=1;)
        {
        if place_free(x+sign(h_speed),y-i)
            {
            x+=sign(h_speed);
            y-=i;
            found=1;
            break;
            }
        else
            {
            if i=4
                found=0;
            }
        }
    if found=0
        {
        for (i=0; i<5; i+=1;)
            {
            if place_free(x+sign(h_speed),y+i)
                {
                x+=sign(h_speed);
                y+=i;
                break;
                }
            else
                {
                if i=4
                    {
                    h_speed=0;
                    stop=1;
                    }
                }
            }
        if stop
            break;
        }
    }
Ik beweeg dus elke pixel afzonderlijk, zodat je geen obstakels over het hoofd ziet en zodat je niet op een bepaalde afstand van een obstakel blijft staan bij een hoge snelheid.
Verder geeft h_speed de horizontale snelheid weer (positief is beweging naar rechts, negatief naar links). Ik heb het probleem opgelost met het bij i=-10; beginnen door eerst te kijken of we naar boven kunnen, indien niet (found=0;) dan kijken we of we naar beneden kunnen. Zo los ik het probleem op dat je vast kan komen te zitten.
Die stop-variabele is ervoor, zodat op het moment dat je én niet naar boven én niet naar beneden een vrije y-positie kan vinden, de repeat-loop stopt. Als het immers één keer niet kan dan kan het de hele tijd natuurlijk niet.
Nadeel aan deze code is, dat per horizontale pixel, er wel 5 verticale pixels bewogen kunnen worden. Dit zorgt ervoor dat je een stuk sneller gaat op heel stijle hellingen dan op horizontaal terrein...


- Voltooid -
Ninjamboree
Het Geheime Wapen
- In ontwikkeling -
Carpe Diem - 80 %
Naar boven Gelogd

Simon Donkers
Forumbeheerder


Offline Offline

Berichten: 3754


WWW
« Antwoord #6 Gepost op: 5 Januari 2009, 18:55:56 »

Dit topic is verplaatst naar het Experts forum.

Merk op dat het Experts forum er niet om draait om een werkende code te vinden maar om ideeen en technieken met elkaar te delen. Mocht iemand moeite hebben met de implementatie dan kan deze hiervoor hulp vragen in het Beginners / Gevorderden forum.

* Verplaatst *


Beheerder

[ Eo GDC ] [ nl ] [ games ] [ GM ] [ GM.Info ] [ GMOT ]

Naar boven Gelogd

mag men
Gebruiker


Offline Offline

Berichten: 68


« Antwoord #7 Gepost op: 12 Maart 2009, 10:07:37 »

ik denk dat je het op zo'n manier het meest realistische zwaartekracht krijgt



- eerst checkt de bal op 2 punten onder hem hoever er onder hem land ligt
- daarna trekt hij tussen die punten als het ware een lijn en loodrecht op die lijn maakt hij
  een vector. Dit kan denk ik het best met motion_add.

door die vector en de zwaartekracht moet hij wel naar beneden rollen.

als je een niet al te vreemd landschap heb kan dit misschien wel eens werken

grzz mag men

« Laatste verandering: 12 Maart 2009, 19:43:30 door mag men »

Naar boven Gelogd

Matrebatre
Lokale Moderator


Offline Offline

Berichten: 3373

Gelieve quote te gebruiken als je PMs beantwoordt.


WWW
« Antwoord #8 Gepost op: 12 Maart 2009, 16:47:15 »

Hij vraagt niet om een simulatie maar om een handige besturing voor een platformer. Het is niet bepaald handig (en ook niet realistisch) als de speler voortdurend wegschuift op de hellingen.

De for-loop op -10 laten beginnen is inderdaad niet echt een goed idee. Ik zou redeneren dat als de speler er niet meer uit geraakt, hij er eigenlijk niet in had mogen raken. Je zou dus beter de engine zo aanpassen dat hij bij het lopen kijkt of hij er wel weer uit zal kunnen, door ook 'place_free(x,y-i)' te testen in de loop.


Work in progress:

Model Creator v6
|||||||||||||||||||| 10%
Games: Land of Monsters - Armadillo Race - Land of Monsters II - The Machine
Andere: Model Creator v5 - ExtremePhysics
Naar boven Gelogd

Freekyboy
Gebruiker


Offline Offline

Berichten: 984

Utere vehiculum cum duobus rotis!


WWW
« Antwoord #9 Gepost op: 8 Februari 2010, 21:09:24 »

Ik bump dit topic maar even, omdat het denk ik nog steeds interessante discussies op kan leveren.

Zelf heb ik gemerkt dat als je gaat checken of je ook naar beneden kan lopen, dat als je dan springt en loopt je ook naar beneden gaat, omdat die positie vrij is. Hierdoor werd het voor mij onmogelijk om een systeem te maken waarbij je schuin naar beneden kan lopen (ipv lopen-vallen-lopen-vallen-...). Als je zwaartekracht toe gaat voegen wordt het nog veel ingewikkelder. Als je de manier van mag men toepast moet je in iedergeval de richtingscoëfficiënt weten van het blokje onder je, en je moet nog bedenken wat je gaat doen als je twee of drie blokjes tegelijk raakt, om van het draaien van het object nog maar te zwijgen.



Ja, dat is even wat anders dan een servertje naast de deur Razz.
Naar boven Gelogd

Compor
Gebruiker


Offline Offline

Berichten: 1998


« Antwoord #10 Gepost op: 3 Maart 2010, 20:34:16 »

Bij iemands platform example zag ik het volgende idee:

Eerst gaat de speler 5 pixels omhoog (tenzij het plafond te laag is), dan gaat hij hspeed pixels op zij, en dan weer omlaag, is dat wat?

Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1]
Print


Topic Informatie
0 geregistreerde leden en 1 gast bekijken dit topic.

Ga naar:  

Powered by SMF 1.1.11 | SMF © 2006-2007, Simple Machines LLC
www.game-maker.nl © 2003-2010 Nederlandse Game Maker Community