Starten met 3d, alles wat je moet weten!Versie:

,

en

Registratie: Ja, dit is vereist
Moeilijkheid: Gevorderden(kennis van gml is vereist)
LET OP: De Beginners Guide betekent niet dat het voor beginners is. Het is voor gevorderde gm gebruikers geschreven. Als je bijv niet weet wat een argument is, ga dan niet verder.Waarom heb ik deze tut gemaakt :
Ik vond dat
http://www.game-maker.nl/forums/topic,6253.0teveel tekst en weinig code was.
0. IntroductieDeze Tut gaat over 3d games. Ik zie de laatste tijd veel 3d vragen. Hiermee hoop ik ze allemaal te beantwoorden. Het is wel een lange tutorial, maar laat je niet afschrikken door de hoeveelheid text Bijna alles in deze tutorial kun je kopiëren en plakken. Ik raad je echter af dat te doen omdat je er dan minder van leert. Het beste is dat je de tekst zelf overtypt. Zo leer je er het meest van.
1. Beginnen met 3dBij een 3d spel in gm moet je altijd eerst 3d initialiseren(laden). Dus maak een object met de naam "obj_player". In het create event zet je:
d3d_start() ;
Deze functie begint 3d. Hierna ga je alle parameters(variabelen) van je 3d wijzigen. Dit doe je door :
d3d_set_hidden(true) ;
d3d_set_lighting(false) ;
d3d_set_shading(true) ;
d3d_set_culling(false) ;
d3d_set_fog(true,c_white,100,1000) ;
texture_set_interpolation(true) ;
wat doet dit nou allemaal:
- d3d_start() ;
Initialiseert de 3d functie. Zonder dit geen 3d. - d3d_set_hidden() ;
Zorgt dat nabije vlakken worden gedrawd voor verdere vlakken. - d3d_set_lighting() ;
Zet lighting aan of uit. Bij uit is je game overal hetzelfde belicht. - d3d_set_shading() ;
Zet smooth shading aan of uit. Dit is alleen relevant bij lighting - d3d_set_culling() ;
Zorgt ervoor dat de achterkant van een vlak niet wordt gedrawd. - d3d_set_fog() ;
Maakt fog/mist. Maakt zicht minder en geeft een goed effect. - texture_set_interpolation() ;
Zorgt dat textures van verderweg beter uitkomen.
als het goed is heb je nu in het create event van je "obj_player" :
d3d_start() ;
d3d_set_hidden(true) ;
d3d_set_lighting(false) ;
d3d_set_shading(true) ;
d3d_set_culling(false) ;
d3d_set_fog(true,c_white,100,1000) ;
texture_set_interpolation(true) ;
draw_set_color(c_white) ;
Het laatste zorgt ervoor dat je niet in zwart drawt. Als je dit wel doet zie je alleen maar zwarte vormen.
Je kunt deze code letterlijk kopiëren en plakken. We gaan hem straks nog zelf veranderen.
2. De extra AsAls je al een tijdje met gamemaker hebt gewerkt dan weet je dat de positie van een object wordt aangegeven met x en y. dit zijn coördinaten. X is de breedte. Y is de hoogte. In 3d krijg je daar nog een extra letter bij. De z coördinaat. deze geeft de diepte aan.
dus:

Z is geen geen GM variabel, zoals x en y. De z moet je zelf definiëren.
Dus achter je eerste code in het create event van "obj_player" zet je :
z = 16 ;
Dit kun je later altijd nog veranderen. Maar voor nu zetten we hem op 16.
3. De projection instellen.Bij 3d in gm moet je de projection instellen. De projection kun je zien als een camera.
De projection intstellen doe je met de functie:
d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup)
Bij de projection werk je met "from" en "to", "van" en "naar". "from" Is het punt waar de camera zich bevind. "to" Is het punt waar de camera naar kijkt.
###
Voor een First-Person-Shooter ###
- "from" Is makkelijk in te stellen bij een fps. Het is het punt waar de camera zich bevind. Dat is dus de player positie. De X, Y en Z(heb je net ingesteld) van de player. "to" Is het punt waar de camera heen kijkt. Deze is iets moeilijker in te stellen. Hierbij werk je met :
x+lengthdir_x(len,dir) ;
y+lengthdir_y(len,dir) ;
Deze functies geven de x/y + een vector in de richting van "dir" met een lengte van "len".
Je gaat nu beginnen met je projection code. Zet in je draw event:
d3d_set_projection(x,y,z,
x+lengthdir_x(8,direction),y+lengthdir_y(8,direction),z,0,0,1) ;
Deze code zorgt ervoor dat je kijkt in de direction van obj_player.
###
voor een Third-Person-Shooter ###
- Bij een third person shooter is de "to" heel gemakkelijk in te stellen. Dit is de positie van de player. De camera draait daar omheen. Dus de "from"(de positie van de camera) is nu moeilijker in te stellen. Hierbij gebruiken we ook weer :
x+lengthdir_x(len,dir) ;
y+lengthdir_y(len,dir) ;
Het enige verschil is dat je nu achter de player wilt staan met de camera. Dus je doet nu de direction+180. De lengte is nu ook belangrijk. "len" moet je daarom veranderen in hoever je van je camera af wilt staan. Ik kies zelf voor een afstand van 64. Je moet ook rekening houden met de z. Experimenteer een beetje met de Zfrom. Zo kun je een mooie camera hoek instellen. Zet dit in het draw event van "obj_player" :
d3d_set_projection(x+lengthdir_x(64,direction+180),
y+lengthdir_y(64,direction+180),
64,x,y,z,0,0,1) ;
Nu heb je een camera die achter je player staat.
Maak een room en zet daarin je "obj_player". Je kunt nu nog niet bewegen.
4. BesturingEr zijn eigenlijk 2 soorten besturing in 3d.
- Pijltjes of WASD
- Mouselook
###
Pijltjes of WASD ###
- Pijltjes :
Bij het sturen met de pijltjestoetsen kun je ook alles in een step event plaatsen. Plaats deze code in het step event van je "obj_player" :
direction+=keyboard_check(vk_left)-keyboard_check(vk_right)*2
Die 2 aan het eind betekent hoe snel je draait. Verander deze zoals je het zelf wil. Om de speed te controleren kun je precies hetzelfde doen. Zet achter je laatste code in het step event:
speed = keyboard_check(vk_up)-keyboard_check(vk_down)*2
Ook hier betekent die laatste 2 hoe snel je loopt. - WASD :
Hier is het precies hetzelfde. Je veranderd alleen de vk_up door W, De vk_down door S enz.
Dit doe je met ord() ;. Deze functie gebruik je door de letter die je wilt gebruiken tussen "" te zetten. Dus:
direction+=keyboard_check(ord("A"))-keyboard_check(ord("D"))*2 ;
speed = keyboard_check(ord("W"))-keyboard_check(ord("S"))*2 ;
###
Mouselook ###
Mouselook is iets moeilijker. Zet in het step event van je "obj_player" :
direction+=round(((room_width/2)-mouse_x)/14) ;
Het meet de afstand tussen de muis en het midden van het scherm. dit heeft geen zin als de muis niet constant in het midden van het scherm is. daarom zet je achter de laatste code:
display_mouse_set(window_get_x()+(room_width/2),
window_get_y()+(room_height/2)) ;
hierdoor wordt de muis teruggezet naar het midden van je gamescherm.
Nu heb je een mouselook.
Je moet natuurlijk ook nog kunnen lopen bij mouselook. Dit bereik je met dit script:
speed = keyboard_check(ord("W"))-keyboard_check(ord("S"))*2 ;
Als je nu je game start, zie je nog helemaal niks. Dit komt omdat je nog helemaal niks hebt in je room. Het werkt hetzelfde met een echte camera. Als je niks is zie je ook niks. XD
We gaan nu de muren, de vloer en het plafond maken.
5. Een vloer en Plafond/luchtZonder iets in je room is een game nogal saai. We beginnen met een vloer. Maak eerst een background aan, maak hem 512 x 512 en maak een vloer naar keuze. Voorbeelden:
Noem deze background "tex_floor". tex staat voor texture. Dit is duidelijker bij het programmeren.
De code om een vloer te drawen is erg gemakkelijk:
d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) ;
dit werkt net als draw_rectangle. Je weet vast wel hoe draw_rectangle werkt. Alleen hierbij heb je ook nog de z1 en z2. Dit is geen probleem omdat deze allebei 0 moeten zijn. Dit is je basis. daarboven ga je alles plaatsen. Je hebt net "tex_floor" gemaakt. Dit is het materiaal van je vloer. Het argument "texid" is waar je je texture moet invullen. Maar je kun niet zomaar "tex_floor" typen. Je moet de id van de texture krijgen. Dit doe je door background_get_texture(tex_floor). Deze functie geeft de texture id van deze background terug. Hrepeat en Vrepeat geven aan hoeveel de texture horizontaal en verticaal wordt herhaald. Ook hiermee moet je een beetje experimenteren. Dus in het draw event van je "obj_player" zet je:
d3d_draw_floor(0,0,0,room_width,room_height,0,
background_get_texture(tex_floor),64,48) ;
Deze code drawt een vloer over de hele room. Als je nu je game start zul je zien dat je kunt rondlopen. Nog steeds is het wel een beetje saai. Laten we er ook nog even een lucht maken. Maak alweer een background van 512 x 512, en teken een texture voor de lucht, bijv: Wolken. Zorg dat de texture aansluit. Geef hem de naam "tex_sky". Nu zet je in het draw event van "obj_player":
d3d_draw_floor(0,0,128,room_width,room_heigth,128,
background_get_texture(tex_sky),64,48) ;
Nu heb je een lucht boven je level.
Toch is je game nog steeds erg leeg. We moeten wat objecten gaan toevoegen.
6. Objecten en murenNet als d3d_draw_floor zijn er nog meer vorm functies :
d3d_draw_block(x1,y1,z1,x2,y2,z2,texid,hherhaling,vherhaling) Tekent een blok in de huidige kleur met de aangegeven tegenoverliggende hoeken gebruikmakend van de aangegeven textuur. Gebruik -1 om geen textuur te gebruiken. hherhaling geeft aan hoe vaak de textuur moet worden herhaald langs de horizontale rand van elk oppervlak vherhaling doet hetzelfde voor de verticale rand.
d3d_draw_cylinder(x1,y1,z1,x2,y2,z2,texid,hherhaling,vherhaling,gesloten,stappen) Tekent een verticale cilinder in de huidige kleur in de aangegeven bounding box gebruikmakend van de aangegeven textuur. Gebruik -1 om geen textuur te gebruiken hherhaling geeft aan hoe vaak de textuur moet worden herhaald langs de horizontale rand van elk oppervlak vherhaling doet hetzelfde voor de verticale rand. gesloten geeft aan of de cilinder een gesloten onder- en bovenkant moet hebben. stappen geeft aan hoeveel draaistappen moeten worden genomen. Een typische waarde is 24.
d3d_draw_cone(x1,y1,z1,x2,y2,z2,texid,hherhaling,vherhaling,gesloten,stappen) Tekent een verticale conus in de huidige kleur in de aangegeven bounding box gebruikmakend van de aangegeven textuur. Gebruik -1 om geen textuur te gebruiken hherhaling geeft aan hoe vaak de textuur moet worden herhaald langs de horizontale rand van elk oppervlak vherhaling doet hetzelfde voor de verticale rand. gesloten geeft aan of de conus een gesloten onder- en bovenkant moet hebben. stappen geeft aan hoeveel draaistappen moeten worden genomen. Een typische waarde is 24.
d3d_draw_ellipsoid(x1,y1,z1,x2,y2,z2,texid,hherhaling,vherhaling,stappen) Tekent een ellipsoïde in de huidige kleur in de aangegeven bounding box gebruikmakend van de aangegeven textuur. Gebruik -1 om geen textuur te gebruiken hherhaling geeft aan hoe vaak de textuur moet worden herhaald langs de horizontale rand van elk oppervlak vherhaling doet hetzelfde voor de verticale rand. stappen geeft aan hoeveel draaistappen moeten worden genomen. Een typische waarde is 24.
d3d_draw_wall(x1,y1,z1,x2,y2,z2,texid,hherhaling,vherhaling) Tekent een verticale muur in de huidige kleur met de gegeven hoeken gebruikmakend van de aangegeven textuur. Gebruik -1 om geen textuur te gebruiken. hherhaling geeft aan hoe vaak de textuur moet worden herhaald langs de horizontale rand van elk oppervlak vherhaling doet hetzelfde voor de verticale rand.
d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,hherhaling,vherhaling) Tekent een (schuine) vloer in de huidige kleur met de gegeven hoeken gebruikmakend van de aangegeven textuur. Gebruik -1 om geen textuur te gebruiken. hherhaling geeft aan hoe vaak de textuur moet worden herhaald langs de horizontale rand van elk oppervlak vherhaling doet hetzelfde voor de verticale rand.
Dit is niet van mij. Het is gemaakt/vertaald door deze community.
Door deze dingen te combineren kun je mooie effecten krijgen.
7. ModellenVoor modellen maken gebruik ik meestal Model Creator. Het is een zeer handig programma gemaakt door matrebatre.
linkTutorials over dit programma kun je vinden op de site van model creator, te vinden in de link. Ik ga het nu hebben over het implementeren/invoegen van de models in je game. Maak een 3d model in Model creator, Sla m op met een logische naam, bijv: world_tree, player_arm, world_rock enz. Het model bestand moet in dezelfde map staan als je game bestand. Nu druk je op dit icoon:

Als beschrijving staat er "Generate GML" bij. Als je hierop klikt krijg je dit scherm:

Neem de opties precies over van deze screenshot ^^^^
Druk op OK en laat het volgende scherm staan. Ga naar je game file en maak een nieuw script met de naam "load_models". In dit script ga je alle models laden. Ga weer terug naar het model creator scherm. Je ziet nu 2 codes. Kopieer het bovenste stukje code en plak het in je "load_models" script. In het create event van "obj_player" zet je nu:
load_models() ;
Nu ga je het model drawen. Je maakt een object met de naam die jij wilt. bijv:
- Bij een boom model, obj_tree
- Bij een huis model, obj_house
Ga weer terug naar het model creator scherm. Kopieer nu het onderste stukje code, en plak het in het draw event van je nieuwe object. vervang nu :
- argument0 door "x"
- argument1 door "y"
- argument2 door "0"
- -1 door background_get_texture(JOU TEXTURE)
Als je nu een paar van deze objecten in je room plaatst, zul je zien dat het heel mooi wordt.
8. TransformationsAls je modellen wil draaien, moet je transformations gebruiken. Bij transformations kun je je modellen draaien, bewegen en schalen. Transformations gaan altijd vanuit het punt 0,0,0.
Een transformatie werkt met blokken. Deze blokken zien er ongeveer zo uit:
d3d_transform_set_identity() ;
//De rotatie
//De beweging
//Draw je model op 0,0,0
d3d_transform_set_identity() ;
Dus als je wil dat je model naar je direction staat gedraaid gebruik je :
d3d_transform_set_identity() ;
d3d_transform_add_rotation_z(direction) ;
d3d_transform_add_translation(x,y,0) ;
d3d_model_draw(global.model_player,0,0,0,background_get_texture(tex_player));
d3d_transform_set_identity() ;
Dus eerst de rotatie, dan de Beweging naar de x en y van de player, en dan Het drawen van het model op 0,0,0.
9. LightingOm licht in je game te gebruiken moet je lighting eerst aanzetten. Dit doe je door :
d3d_set_lighting(false) ;
te vervangen door
d3d_set_lighting(true) ;
Als je nu je game draait zie je alleen maar zwart. Dit is omdat je nog geen lichten hebt gedefinieerd. Je hebt in GM 2 soorten 3d lichten:
d3d_light_define_direction(ind,rx,ry,rz,col) ;
- ind = De id van het licht.
- rx = De x rotatie van de richting van het licht.
- ry = De y rotatie van de richting van het licht.
- rz = De z rotatie van de richting van het licht.
- col = De kleur van het licht
Deze functie Zorgt voor een licht over een bepaalde richting, net als de zon.d3d_light_define_point(ind,x,y,z,range,col) ;
- ind = De id van het licht.
- x = De x positie van het licht.
- y = De y positie van het licht.
- z = De z positie van het licht.
- range = Het bereik van het licht.
- col = De kleur van het licht.
Deze functie zorgt voor een licht op een bepaald punt, net als en gloeilamp.
Dan ben je er nog niet. Je moet eerst je licht nog aanzetten. Dit doe je met de functie:
Dus aan het create event van je "obj_player" voeg je nog toe:
d3d_light_define_direction(1,7.5,-7.5,-7,c_dkgray) ;
d3d_light_enable(1,true) ;
In meeste van mijn games gebruik ik deze angles voor het licht. Als je je game nu start zie je veel verschil, vooral met models.
10. SpringenMaar we zijn nog niet klaar. Als je dan een extra Z as hebt, waarom zou je er dan niks mee doen. Hier ga ik zorgen dat je kunt springen. Ik ga hier werken met sinus. Zoals meeste van jullie weten geeft sinus een sinus beweging zoals deze :

Dus bij 2 x pi is de sinus 1 keer heen en terug gegaan. We gaan dit heen en terug principe nu maken. Je gaat eerst naar het create event van je "obj_player". Daar zet je :
timer = 0 ;
"timer" word onze sinus timer. Nu zet je in het keyboard spacebar event :
if timer = 0 then timer = pi ;
Dus als "timer" 0 is(je staat op de grond) Dan zet je de timer op pi. Je ziet nu nog geen verschil. Je moet eerst de timer laten aflopen en vanuit daar de z positie bepalen. Plaats in het step event :
if timer > 0 then timer-=pi/20 ;
Dus als timer meer dan 0 is. Dan gaat er pi/20 af. Net zolang tot timer weer 0 is, en je dus weer kunt springen. De 20 aan het eind betekent in hoeveel steps je de sprong wil doen. Als je dit getal groter maakt, springt de player langzamer. Bij kleiner springt hij sneller. Nu zet je achter je laatste code :
z = 16+(sin(timer)*10)
De 10 aan het eind betekend hoe hoog je springt. Deze moet je zelf veranderen naar wat jij het prettigst vind. Als je je game nu start, zie je dat je kunt springen met de spacebar.
11. Deuren en bewegende objectenBij het maken van een deur die naar boven opengaat, moet je gebruik maken van transformations. Dit is naar mijn mening de makkelijkste manier. Begin met het maken van een "obj_door". Zet in het create event :
z = 0 ;
De z is dus hoe hoog de deur nu staat. Met 0 staat hij op de grond.
In het draw event zet je nu :
d3d_transform_set_identity() ;
d3d_transform_add_translation(x,y,z) ;
d3d_model_draw(//JOUW MODEL op 0,0,0) ;
d3d_transform_set_identity() ;
Nu wordt je deur gedrawd op de hoogte van de z. Maar deze is 0, dus moet je m veranderen. ik kies hierbij voor een systeem die de afstand tot de player meet. Als de player dichterbij dan 48 komt, gaat de deur open. Anders is hij dicht. Zet in het step event van je "obj_door" :
if point_distance(x,y,obj_player.x,obj_player.y) < 48 then{
if z < 32 then z+=2 ;
}else{
if z > 0 then z-=2 ;
} ;
Als je nu dichtbij komt gaat de deur open. En als je weer wegloopt gaat hij dicht.
12. BillboardsBillboards zijn objecten in 3d die altijd naar jou gericht zijn. Als je bijv een object hebt die aan elke kant hetzelfde is, kun je zorgen dat het een platte muur wordt, die altijd naar jou richt. Hier een voorbeeld :

Je ziet dus dat het geen model is, maar dat hij constant naar de camera gericht is. Dit doe je met transformations. Maak bijv een "obj_tree" en maak een texture van een boom van de zijkant. Je zet in je draw event :
d3d_transform_set_identity() ;
d3d_transform_add_rotation_z(point_direction(x,y,obj_player.x,obj_player.y)) ;
d3d_transform_add_translation(x,y,0) ;
d3d_draw_wall(0,-16,0,0,16,32,background_get_texture(tex_tree),1,1) ;
d3d_transform_set_identity() ;
Nu heb je een boom die met je meedraait. Dit is niet erg mooi, maar bespaard wel veel CPU. voor voorwerpen van veraf kun je dit heel efficiënt gebruiken.
13. Collision Checking in 2dIk ga hier geen tutorial over doen omdat het een script is van iemand anders. Het script wat ik vaak gebruik is van Matrebatre. Het zorgt ervoor dat als je tegen een muur loopt, je er langs glijd en niet direct stopt. Dit script moet geplaatst worden in het end step event :
var a,b;
a = place_free(x+hspeed,y);
b = place_free(x,y+vspeed);
if not a then x = xprevious;
if not b then y = yprevious;
if not place_free(x+hspeed,y+vspeed) {
x = xprevious;
y = yprevious;
}
14. Schieten in 3dIedereen weet nu al wel hoe je moet schieten in 2d. Maar in 3d is dit veel moeilijker. Zo moeilijk zelfs dat ik het stukje voor deze tutorial helemaal niet zelf heb geschreven. Het is meer een script dan een tutorial. Het is geschreven door Dmitri. Je moet hiervoor de euler notatie gebruiken met de projection. Meer hierover
hier !!! Hier is het stukje van Dmitri :
eindelijk...
LET OP: Ik moet je wel ff mededelen dat je met de projectie op basis van de euler notatie moet werken. Zie hier voor meer informatie.Zdirection speler:
display_h=display_get_height();
change_y=(display_mouse_get_y()-display_h/2)/12;
zdirection+=change_y
if zdirection<-90 then {zdirection=-90;} else if zdirection>90 then {zdirection=90;}
In de mouse event zet je
create_bullet().
create_bullet();i=instance_create(x+lengthdir_x(22,direction),y+lengthdir_y(22,direction),argument2);
i.superspeed=round(argument0/argument1); //dit moet een rond getal zijn
i.normalspeed=argument1;
i.zdirection=zdirection; //zidrection
i.z=z+player.cam_sin_z+120-22*tan(degtorad(zdirection)); //begin hoogte; +22 om tegen jezelf schieten voorkomen
i.dmg=argument3; //schade
i.direction=direction; //hmm.. wat zou dit betekenen??
i.alarm[0]=10; //na 10 stappen is de kogel foetsie xD
bullet OBJECT: 
instance_destroy();

bullet_step();

draw_set_color(c_black);
d3d_draw_block(x-1,y-1,z-1,x+1,y+1,z+1,-1,0,0);//draw a black block for the bullet, quite simple
draw_set_color(c_white);
bullet_step();for(i=0;i<superspeed;i+=1){ //loop
x+=lengthdir_x(normalspeed,direction) //skip space
y+=lengthdir_y(normalspeed,direction) //skip space
z+=-normalspeed*tan(degtorad(zdirection)); //skip space
/* Als hij onder het terrein komt, vernietigen
if(z>get_zpos()){instance_destroy();exit;}
*/
//----
//DE REST IS ALLEMAAL COLLISION CHECKING. GEEF VOOR ELK OBJECT EEN ZMAX EN GEEF HET EEN PARENT (PEOPLE PARENT, WALL PARENT)
//IN DEZE PARENTS HOEFT NIKS TE STAAN, MAAR GEEFT GEWOON AAN WAT ER MOET GEBEUREN MET DE KOGEL!
//ALS JE DIT NIET WILT GEBRUIKEN VERGEET DAN NIET DE LOOP AF TE SLUITEN!
//----
obj=instance_position(x,y,all)//find the object at your new position
if(obj=noone){continue;}//if there is no object at your position, then continue (skip to the next value of the loop)
if(z<obj.z){continue;}//there is an object! but if the bullet is below the object then continue!
if(z>obj.zmax){continue;}//there is an object! but if the bullet is above the object then continue!
//The object was hit!!!! and it is above ground
with(obj){//with the object that was just hit
//wall temp
if(object_is_ancestor(object_index,par_solid)=1){//check if it was an ancestor of the wall temp (wall temp is its parent)
with(other){instance_destroy()}//if it was, destroy the bullet so it will not continue on
sound_play(hit);
exit;//exit so the bullet will be instanly destroyed
}
//people temp
if(object_is_ancestor(object_index,par_solid)=0){//cehck if the object is an ancestor of the poeple temp (people temp is its parent)
hp-=other.dmg+random(other.dmg/2);//if it was, then minus its health by the bullets damage - because we went with(obj){}, we can use other becuase other is considered the bulelt
if(hp<=0){//if the objects health is less then 0
instance_destroy();//then destroy the hit target
}
with(other){instance_destroy();}//and also destroy the bullet
}
}
}
Zo, dat was het....
Let er wel op; hij is niet volmaakt. Door de tangens krijgt hij een beetje zeer hoge snelheid als je loodrecht omlaag schiet of als je loodrecht omhoog schiet.
M.v.G.
Dmitri
Ik dank Dmitri hiervoor. Help hem ook even met zijn spel :
Warzones 2kX Engine Alpha
15. SlotwoordAls je nog iets mist in mijn tutorial of je vind een fout. Post het dan hier, ik probeer het zo snel mogelijk toe te voegen of op te lossen.
Credits:
Matrebatre : Model creator 5.0
Thomasderoo : Voor deze tut XD
Dmitri : Voor het schieten in z
Ik heb deze tutorial in 1 hele dag gemaakt.Credit geven hoeft niet, mag wel, graag zelfs XD.
Als je een game gemaakt hebt met behulp van deze tut, post m hier. Dan kan ik hem ook bekijken, leuk

. Hier is een voorbeeld van een mooie 3d game, gemaakt door mij

:
ChuckEn door Dmitri :
Warzones 2kX Engine AlphaVragen welkom hieronder.
Mvg Thomas