Nederlandse Game Maker Community

Werken met Game Maker => Tutorials en Uitbreidingen => Topic gestart door: lambiory op 25 Mei 2013, 23:41:24



Titel: [exa] Grid-Based Collisions voor 2D games (GBC)
Bericht door: lambiory op 25 Mei 2013, 23:41:24
Grid-Based Collisions voor 2D games (GBC)

GM-versie: :gm8:, :gmstudio:; exa is in :gm8:
Pro vereist: Nee
Niveau: Gemiddeld/Gevorderd

Inleiding:
Deze example bevat een collisionsysteem dat gebruikt kan worden voor 2D games waarin er strikt alleen maar collisions met in-grid solid objecten plaatsvinden. Het is bedoeld als vervanging voor systemen als de standaard Game Maker collision engine, SAT en Extremephysics, die allen werken met objecten die niet in-grid staan. Hierdoor moeten er soms zeer ingewikkelde en intensieve berekeningen gedaan worden voordat de gewenste collision wordt gevonden. En zelfs dan kan het soms nog fout gaan.

Als echter alles waarmee een collision gevormd moet worden in een netjes grid staat, maakt dat de zaak een stuk overzichtelijker. Er kan met een paar (relatief) simpele/snelle berekeningen bepaald worden of er een botsing voorkomt. Dit is de kracht van Grid-Based Collisions, kortaf GBC. Onder normale omstandigheden kan met dit script in Game Maker een framerate van ruim 1000 gehaald worden.

GBC is dus alleen bedoeld voor collisions van een bewegende rechthoekige vorm/mask (zoals de speler) met blokken die in een grid staan.

Download:
Grid-Based Collisions Example V1.01 (http://g2f.nl/0hga7b9) .gmk; ~21KB

Gebruik:
Ik zal niet ingaan op hoe de wiskunde van het systeem werkt, maar ik zal wel een kleine handleiding geven:
In de example heb ik hiernaast ook aanwijzingen in comments gezet (in Engels).

Alle scripts in het mapje GBC worden gebruikt voor het systeem, het is dus zaak om ze zorgvuldig over te nemen naar een eigen project.
De scripts die beginnen met _gbc_ hoeven nooit door de gebruiker aangeroepen te worden (met 2 halve uitzonderingen, zie beneden), dus daar hoef je je geen zorgen over te maken. De scripts die beginnen met gbc_ kunnen wel aangeroepen worden door de gebruiker. Al deze scripts zal ik langsgaan:

  - gbc_create_new_gameworld(gameworld_width, gameworld_height, gridsize); Dit script initiŽert een gamewereld met door de gebruiker aangegeven eigenschappen hoogte, breedte van de wereld en de grootte van het grid. De grootte van het grid moet een geheel getal groter dan 0 zijn.
  - gbc_solid_add(x,y); Dit script laat aan het systeem weten dat er op de locatie x,y een solid object bevindt. Er zullen hier vervolgens collisions mee plaats kunnen vinden (dit script moet apart voor elk in-grid solid vakje uitgevoerd worden).
  - gbc_solid_destroy(x,y); Dit script doet het tegenovergestelde van gbc_solid_add, het zorgt dat er geen collisions meer plaatsvinden met het in-grid vakje rond x,y.
  - gbc_solid_get(x,y); Returnt false of true, waarbij false betekent dat het vakje rond x,y niet solid is, en true betekent dat het vakje rond x,y wel solid is.
  - gbc_update_collisions(); Zorgt dat de xspeed en yspeed van het aanroepende object aangepast worden indien er met deze snelheden in dit frame een collision plaats zal vinden met in-grid solids.

  - _gbc_errors_init(); Wordt aangeroepen in create event van obj_gbc_control.
  - _gbc_update(); Wordt aangeroepen in update event van obj_gbc_control.

obj_gbc_control is essentiŽel voor GBC om te werken, omdat in dit object de 2D-array van de solid objecten bijgehouden wordt.
Een object dat gebruik maakt van collisions moet de variabelen xspeed, yspeed, breedte w en hoogte h hebben. Met deze waardes kan gbc_update_collisions aangeroepen worden. Nadat dit aangeroepen is moeten de xspeed en de yspeed bij de x- en de y-waarden van het object opgeteld worden. (zie obj_player in exa)
obj_solid wordt in de exa gebruikt, maar is niet verplicht. Dit is wel de manier die ik zou aanraden om te werk te gaan: In de room editor alle obj_solids plaatsen om vervolgens voor alle obj_solids het script gbc_solid_add(x,y) uit te voeren (dit wordt ook gedaan in de exa)

Compact overzicht van het gebruik:
- Maak ťťn obj_gbc_control aan
- Voer gbc_create_new_gameworld uit met gewenste waardes waardoor er een lege gameworld wordt aangemaakt
- Gebruik gbc_solid_add om solid objecten toe te voegen aan de gameworld (pas nadat die gameworld aangemaakt is)
- CreŽer een bewegend object met variabelen xspeed, yspeed, w en h
- Voer gbc_update_collisions uit in de step-event van elk bewegende object, waarna de x en de y aangepast moeten worden
- Voer gbc_create_new_gameworld uit op elk gewenst moment om een nieuwe, lege gameworld aan te maken met desgewenst nieuwe afmetingen

Om gebruikersgemak nog extra te verbeteren, is er een klein errorsysteem ingebouwd waardoor de gebruiker meldingen krijgt wanneer er iets misgaat.

GBC is niet gebaseerd op een beproefd wiskundig algoritme, maar op mijn eigen inzichten. Voor zover ik heb getest is het een waterdicht systeem, maar als dit niet het geval is hoor ik dat heel graag.


www.game-maker.nl © 2003, 2007 Nederlandse Game Maker Community