game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
De activerings e-mail gemist?
+  Forums
|-+  Werken met Game Maker
| |-+  Tutorials en Uitbreidingen (Moderator: Maarten Baert)
| | |-+  [Dll+Exa+Gex]isometric depthsorting dll
Pagina's: [1]
« vorige volgende »
Print
Advertenties

vincentS
Gebruiker

Offline Offline

Berichten: 2


« Gepost op: 27 Augustus 2016, 10:43:31 »

GM-versie: GameMaker 8 Game Maker Studio
Pro vereist:
Ja
Niveau: Gevorderd - Expert

Met deze DLL kan je de correcte volgorde voor het tekenen van objecten in een isometrische ruimte berekenen. Je voert de objecten in met hun co÷rdinaten in 3d. Hiermee berekend het algoritme wat een correcte volgorde is om deze te tekenen.

Download:
http://lucb1e.com/gm/tuts/static_upload/isometricDepthSorting.zip
De download bevat:
-Een gamemaker project met een demo
-De Dll
-Een Gamemaker extension met de Dll
-De c++ code van de Dll
Filehosting met dank aan lucb1e. Gemoedelijk

Hoe werkt het?
Elk object wordt voorgesteld als een balk, met een x-, y- en z-co÷rdinaat en een breedte, hoogte en diepte. De DLL kijkt voor alle objecten of hun 2d projectie op het scherm overlapt. In afbeelding 1 zie je twee balken waarvan de 2d-projectie op het scherm overlapt, namelijk het oranje gebied. Als er overlap is wordt op basis van de 3d-co÷rdinaten van de objecten bepaald welke voor en welke achter zit. Als de relaties tussen alle objecten bekend is wordt er een topologische sortering uitgevoerd om een correcte tekenvolgorde te vinden.

Afbeelding 1: Twee overlappende balken

Functies
De DLL bestaat uit de volgende functies:
depthsorting_initiate(): Start de DLL
depthsorting_add_object(x, breedte, y, diepte, z, hoogte, dynamisch, reactie): Voegt een nieuw object toe met de aangegeven co÷rdinaten en afmetingen, markeert het als dynamisch of statisch en stelt een reactie bij 3d-overlap in. Returnt het id-nummer van het toegevoegde object.
depthsorting_move_object(id, x, breedte, y, diepte, z, hoogte): Stelt nieuwe positie en afmetingen in voor het object met id-nummer id. Dit kan alleen als het object een dynamisch object is.
depthsorting_perform_sort(): Berekend een mogelijke tekenvolgorde voor de objecten. De gevonden volgorde wordt gereturnd in de vorm van een string.
depthsorting_close(): Maakt het gebruikte geheugen vrij. Roep deze functie altijd aan voor je je spel afsluit!

Hoe gebruik ik het?
Het definiŰren van de functies, initialiseren en opruimen hoef je niet zelf te doen als je de extensie gebruikt. Zo niet, dan moet het als volgt.
Inialiseren en objecten toevoegen
Als eerste moeten de functies als volgt gedefinieerd worden:
GML:
DLLdepthsorting_initiate = external_define("isometricDepthsorting.dll", "depthsorting_initiate", dll_stdcall, ty_real, 0);

DLLdepthsorting_add_object = external_define("isometricDepthsorting.dll", "depthsorting_add_object", dll_stdcall, ty_real, 8, ty_real, ty_real, ty_real, ty_real, ty_real, ty_real, ty_real, ty_real);

DLLdepthsorting_move_object = external_define("isometricDepthsorting.dll", "depthsorting_move_object", dll_stdcall, ty_real, 7, ty_real, ty_real, ty_real, ty_real, ty_real, ty_real, ty_real);

DLLdepthsorting_perform_sort = external_define("isometricDepthsorting.dll", "depthsorting_perform_sort", dll_stdcall, ty_string, 0);

DLLdepthsorting_close = external_define("isometricDepthsorting.dll", "depthsorting_close", dll_stdcall, ty_real, 0);

Daarna moet de dll opgestart worden door depthsorting_initiate() aan te roepen. Wanneer dit gebeurt is kunnen de objecten toegevoegd worden met de functie depthsorting_add_object().
Met de co÷rdinaten en afmetingen bepaal je een balk in 3d. De functie returnt een nummer om het toegevoegde object te kunnen identificeren.
In de praktijk wil je waarschijnlijk niet alleen balken maar ook andere vormen sorteren, bijvoorbeeld personages. Om dat te doen voer je een balk in waar het personage in past (afbeelding 2).

Afbeelding 2: Een balk waar het personage in past
Bij het toevoegen van een object moet aangegeven worden voor elk object of het dynamisch is of niet. Voor dynamische objecten, objecten die bewegen, moet elke keer opnieuw bepaald worden met welke andere objecten ze overlappen. Het sorteren wordt hierdoor meer werk voor de computer als er meer dynamische objecten zijn. Voeg dus niet meer dynamische objecten toe dan nodig.

Als laatste moet de overlap reactie ingevoerd worden. Wanneer twee balken in 3d door elkaar heen steken is het niet te zeggen welke eerst getekend moet worden. Omdat er situaties denkbaar zijn waarin je toch wil dat objecten door elkaar heen kunnen schuiven kan je met de overlap reactie instellen wat er in dat geval moet gebeuren:
0 betekend: Geen voorkeur, plaats een willekeurige voor
1 betekend: Plaats dit object achter als het door een ander heen steekt
2 betekend: Plaats dit object voor als het door een ander heen steekt
3-5 betekend: Bepaal wie er voor is door te kijken wiens middelpunt het meest dichtbij is in de x-, y- of z-richting.
Voor deze waardes zijn constanten toegevoegd in de extensie (R_NONE, R_PLACE_BEHIND...)

Sorteren
Met de functie depthsorting_perform_sort() kan je hierna een volgorde berekenen. De functie returnt de gevonden volgorde in de vorm van een string waarin elk object wordt aangegeven met twee tekens die samen voor het id-nummer van het object staan. Deze string kan als volgt gelezen worden.

GML:
drawOrder = depthsorting_perform_sort();

//Ontcijfer de gevonden string

for(i = 1; i <= string_length(drawOrder); i+=2){

    var C1, C2, SORTID;
    C1 = ord(string_char_at(drawOrder,i));//Lees het eerste teken
    C2 = ord(string_char_at(drawOrder,i+1));//Lees het tweede teken
    
    //Bepaal voor welk id-nummer de twee tekens stonden
    SORTID = (C1-1)+((C2-1)<<8);
}

Een voorbeeld van hoe dit gebruikt kan worden om alles in volgorde te tekenen zie je in de example in de download.

Opruimen
Als je klaar bent met de objecten die je hebt ingevoerd moet de dll weer netjes afgesloten worden met depthsorting_close().

Iets om op te letten
-De Dll vindt altijd een correcte oplossing als die er is. Let wel, als de objecten op bepaalde manieren gekozen worden kan het dat er geen oplossing is. In de situatie in afbeelding 3 bijvoorbeeld. Blauw moet voor rood getekend worden, rood voor groen en groen voor blauw. Gelukkig kunnen dit soort cycli voorkomen worden door objecten op te splitsen.

Afbeelding 3: Hier bestaat geen goede volgorde


« Laatste verandering: 4 Oktober 2016, 02:14:00 door vincentS »
Naar boven Gelogd

lucb1e
Gebruiker


Offline Offline

Berichten: 4554


WWW
« Antwoord #1 Gepost op: 25 September 2016, 19:08:56 »

Dat is een nieuw record: de links werken nu al niet meer Knipoog

Kun je ze misschien e-mailen naar ngmctopic85719@lucb1e.com? Of ergens anders uploaden waar ik ze van kan downloaden. Dan upload ik de bestanden op mijn server, waar (zoals je kan zien) al een heel archief staat: http://lucb1e.com/gm/tuts/static_upload/

Edit: let op: dit e-mailadres werkt niet meer. Er kwam net een spam-e-mail op binnen, dus het adres is geblokkeerd.

« Laatste verandering: 5 Oktober 2016, 21:37:36 door lucb1e »

Naar boven Gelogd

bones22
Gebruiker

Offline Offline

Berichten: 34


« Antwoord #2 Gepost op: 26 September 2016, 17:09:13 »

Dat probleem met die balken...
toeval dat ik net een z-buffer heb geupload.

Naar boven Gelogd

vincentS
Gebruiker

Offline Offline

Berichten: 2


« Antwoord #3 Gepost op: 3 Oktober 2016, 11:17:33 »

Ik heb het topic geupdate. Er is een nieuwe link en ik heb een paar aanpassingen en toevoegingen gedaan. Kan iedereen nu bij de bestanden?

Naar boven Gelogd

equinox1
Gebruiker

Offline Offline

Berichten: 2


« Antwoord #4 Gepost op: 7 December 2017, 08:23:31 »

Good morning,

VINCENT: are you still there?

Moderator (Eric): We're a Dutch forum, so please communicate in Dutch. Wij zijn een Nederlands forum, dus gelieve in het Nederlands te communiceren.

« Laatste verandering: 14 December 2017, 21:36:29 door ericlegomeer »
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.21 | SMF © 2006-2007, Simple Machines
www.game-maker.nl © 2003-2019 Nederlandse Game Maker Community