Het maken van snelle, eenvoudige prototypen is een geweldige manier om snel nieuwe gameplay-ideeën uit te proberen, zonder zich te verplichten tot het creëren van een compleet spel. Ik gebruik graag Game Maker hiervoor, en in deze post deel ik zo'n spel met je: Trainpunk, een op treinen gebaseerd strategiespel.
Opmerking van de uitgever: Dit is een nieuw type bericht dat we nog niet eerder hebben geprobeerd. Laat ons weten wat u ervan vindt en of u in de toekomst soortgelijke berichten wilt zien!
Hier is een video waarin ik het oorspronkelijke concept voor de game heb geschetst en daarna dat ik het prototypespel zelf heb gespeeld:
Ik zou laten zien dat ik ook de kunst teken, maar het is zo eenvoudig dat er geen echte reden voor is.
In het laatste spel proberen twee teams treinen de vijandelijke basis aan te vallen terwijl ze door torentjes worden beschoten. Je speelt door upgrades toe te passen met de knoppen onderaan.
Download het laatste spel (plus de broncode en sprites) en pas het spel zo vaak aan als je wilt! U hebt een exemplaar van Game Maker 8 nodig.
Hier volgt een ruwe schets van de stappen die ik heb genomen om het spel te bouwen. Je zou vanaf het begin kunnen volgen, of dit gebruiken om de volledige bron beter te begrijpen.
Download Game Maker 8 en open het.
Maak een nieuw SPEL
object, met deze eigenschappen:
"Geen sprite"
vals
waar
-999
waar
(geen ouder)
(hetzelfde als sprite)
Geef het deze gebeurtenissen:
#Create Event: code uitvoeren: alarm [0] = 150; #Alarm-gebeurtenis voor alarm 0: voer code uit: alarm [0] = 150; global.points + = 1; global.pointsB + = 1,25; #Step Event: code uitvoeren: if! Instance_exists (oUpgradeHP) if! Global.points = 0 global.points - = 1; instance_activate_object (oUpgradeHP); instance_activate_object (oUpgradeRA); instance_activate_object (oUpgradeSS); instance_activate_object (oUpgradeAS); if! global.pointsB = 0 ID = choose (1,2,3,4); // if ID = 1 global.hp2 + = 1; als ID = 2 global.ra2 + = 4; als ID = 3 global.ss2 + = 1; als ID = 4 global.as2 = global.as2 / 1.1; // global.pointsB - = 1; if! instance_exists (oTurretA) instance_deactivate_all (true); slaap (500); game_restart (); if! instance_exists (oTurretB) instance_deactivate_all (true); slaap (500); game_restart (); #Andere gebeurtenis: Start van het spel: voer code uit: // Train Team A global.hp1 = 5; // Gezondheidspunten global.ra1 = 64; // Range global.ss1 = 6; // Shoot Speed global.as1 = 30; // Aanvalssnelheid // Treinteam B global.hp2 = 5; // Gezondheidspunten global.ra2 = 64; // Bereik global.ss2 = 6; // Shoot Speed global.as2 = 30; // Aanvalssnelheid global.points = 1; global.pointsB = 1; room_goto_next (); #Draw Event: code uitvoeren: draw_set_color (c_black); draw_set_font (font0); // draw_text (x + 4, y + 4, "TEAM [PLAYER] - HP =" + string (global.hp1) + "- RA =" + string (global.ra1) + "- SS =" + string ( global.ss1) + "- AS =" + string (global.as1)); draw_text (x + 4, y + 18, "TEAM [ENEMY_] - HP =" + string (global.hp2) + "- RA =" + string (global.ra2) + "- SS =" + string (global. ss2) + "- AS =" + string (global.as2));
Maak nog een nieuw object, _Blok
, en maak het solide. Het is alleen voor het uiterlijk - het doet niet veel zelf.
Maak nog een nieuw object, genaamd _BaseA
, met deze eigenschappen:
_BaseA
waar
waar
-1
vals
(geen)
(geen)
De sprite is slechts een blok van 16x16. Geef het nu deze gebeurtenissen:
#Create Event: code uitvoeren: hp = 100; #Step Event: code uitvoeren: als hp < 0.9 instance_destroy();
Hier is een afbeelding van het uiteindelijke spel, ter referentie:
Maak deze keer een nieuw object om een van de treinen van de speler te vertegenwoordigen (een witte rechthoek op de sporen). Noem het _TrainA
en geef het deze eigenschappen:
_TrainA
vals
waar
0
vals
_BaseA
(geen)
De sprite moet een 16x16 trein zijn, met zijn gezicht naar rechts. Geef het object deze gebeurtenissen:
#Create Event: code uitvoeren: // Train Team A // Stats instellen op globale variabelen, bepaald door upgrades. hp = global.hp1; // Gezondheidspunten ra = global.ra1; // Bereik ss = global.ss1; // Shoot Speed as = global.as1; // Aanval Snelheidsrichting = 360; snelheid = 2; #Alarm Event voor alarm 0: sluit deze gebeurtenis af #Step Event: voer code uit: n = instance_nearest (x, y, oBaseB); if distance_to_point (n.x, n.y) < ra if alarm[0] < 1 i=instance_create(x,y,oBulletA); i.speed = ss; alarm[0] = as; speed = 0; else speed = 2; if hp < 0.9 instance_destroy(); /* hp = global.hp1; // Health Points ra = global.ra1; // Range ss = global.ss1; // Shoot Speed as = global.as1; // Attack Speed */
We zullen nu de torentjes van de speler maken. Maak een nieuw object met de naam _TurretA
, en geef het deze eigenschappen:
_TrainA
vals
waar
0
vals
oBaseA
(geen)
Ik gebruikte hier dezelfde sprite als voor de trein van de speler, maar voel je vrij om het te veranderen in een echt torentje. Het moet 16x16px zijn. Voeg de evenementen toe:
#Create Event: code uitvoeren: hp = 25; // Gezondheidspunten ra = 128; // Bereik ss = 15; // Shoot Speed as = 20; // Attack Speed #Alarm Event voor alarm 0: sluit deze gebeurtenis af #Step Event: voer code uit: n = instance_nearest (x, y, oBaseB); if distance_to_point (n.x, n.y) < ra if alarm[0] < 1 i=instance_create(x,y,oBulletA); i.speed = ss; alarm[0] = as; if hp < 0.9 instance_destroy();
De torentjes moeten kogels schieten, dus maak een nieuw object om deze te vertegenwoordigen. Noem het oBulletA
, en geef het deze eigenschappen:
_BulletA // Een dun
vals
waar
1
vals
(geen ouder)
(hetzelfde als sprite)
De sprite moet een dunne kogel zijn (1px hoog bij 16px breed, binnen een vierkant vierkant van 16x16px), met zijn gezicht naar rechts. Dit zijn de evenementen:
#Create Event: code uitvoeren: n = instance_nearest (x, y, oBaseB); direction = point_direction (x, y, n.x, n.y); #Step Event: code uitvoeren: image_angle = richting; #Collision Event met object o_Block: vernietig de instantie #Collision Event met object oBaseB: voer code uit: #instance_destroy (); other.hp - = 1;8. Maak een nieuw object (oSpawnerA)
Informatie over object: oSpawnerA Sprite: _TrainA // Nog steeds met behulp van de treinscript Solid: false Zichtbaar: false Depth: 0 Persistent: false Ouder:Masker: Gebeurtenis creëren: voer code uit: alarm [0] = 180; instance_create (x, y, oTrainA); Alarmgebeurtenis voor alarm 0: voer code uit: alarm [0] = 180; instance_create (x, y, oTrainA);
Wanneer de speler zijn HP kan updaten, gaat de betreffende knop branden:
We maken deze knop nu. Maak een nieuw object met de naam oUpgradeHP
, en geef het deze eigenschappen:
_UpgradeHP
vals
waar
-99
vals
(geen ouder)
(hetzelfde als sprite)
Geef het ook deze gebeurtenissen:
#Create Event: code uitvoeren: image_alpha = 0,5; Mouse Event voor Left Released: voer code uit: global.hp1 + = 1; instance_deactivate_object (oUpgradeHP); instance_deactivate_object (oUpgradeRA); instance_deactivate_object (oUpgradeSS); instance_deactivate_object (oUpgradeAS); Mouse Event for Mouse Enter: code uitvoeren: image_alpha = 1; Muisgebeurtenis voor muisverlaten: voer code uit: image_alpha = 0,5;
Duplicaat oUpgradeHP
drie keer dus je hebt vier objecten - één knop per stuk voor het upgraden van HP, RA, SS en AS. (oUpgradeHP
, oUpgradeRA
, oUpgradeSS
, oUpgradeAS
).
Verander de Links vrijgegeven
de code van elk evenement:
oUpgradeHP -> global.hp1 + = 1; oUpgradeRA -> global.ra1 + = 4; oUpgradeSS -> global.ss1 + = 1; oUpgradeAS -> global.as1 = global.as1 / 1.1;
Duplicaat oBaseA
, oTrainA
, oTurretA
, oSpawnerA
en oBulletA
maken oBaseB
, oTrainB
, oTurretB
, oSpawnerB
en oBulletB
.
Verander hun ouders (van "A" naar "B") en verander al hun code van:
n = instance_nearest (x, y, oBaseB);
… naar:
n = instance_nearest (x, y, oBaseA);
… zoals gevraagd.
Stel ook oTrainB in om te hebben richting = 180;
in de gebeurtenis create, in plaats van richting = 360;
. Kies tenslotte voor elk naar links gerichte sprites, waar van toepassing.
Voeg al je tilesets, sprites, kunst enzovoort toe en maak twee nieuwe kamers: één is rm_intro
, waar je alleen de obj_Game
, en de andere is de hoofdruimte (rm_main
).
Bouw je rm_main
zoals zo:
Je zou kunnen proberen de kamer symmetrisch te maken, zodat het enigszins rechtvaardig is, of plaats meer torentjes aan de vijandige kant voor een hardere gameplay. Het is aan jou - het hele doel van een prototype is om dingen te testen!
Speel nu het spel. Denk tijdens het spelen na over wat er moet veranderen. Moeten de treinen sneller of langzamer zijn? Moeten upgrades vaker voorkomen? Moet de computer een oneerlijk voordeel hebben? Moet de speler meer inbreng hebben dan alleen het toepassen van upgrades? Tweak weg!
Ik hoop dat je iets hebt geleerd over het maken van games - maar wat nog belangrijker is, ik hoop dat je hebt geleerd hoe elk idee snel samen kan worden gesmeten tot een prototype.
Opmerking van de uitgever: Dit is een nieuw type bericht dat we nog niet eerder hebben geprobeerd. Laat ons weten wat je ervan vindt! Is er iets dat je wilt dat we het in de toekomst anders doen met het formaat? Wil je meer informatie in de video, of een uitgebreidere reeks instructies voor het daadwerkelijk bouwen van de game?