Laten we een spel prototypen Trainpunk

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!


Concept- en gameplay-demo

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.


Het spel bouwen

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.

Stap 1

Download Game Maker 8 en open het.

Stap 2

Maak een nieuw SPEL object, met deze eigenschappen:

  • sprite: "Geen sprite"
  • Solide: vals
  • Zichtbaar: waar
  • Diepte: -999
  • Aanhoudend: waar
  • Ouder: (geen ouder)
  • Masker: (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));

Stap 3

Maak nog een nieuw object, _Blok, en maak het solide. Het is alleen voor het uiterlijk - het doet niet veel zelf.

Stap 4

Maak nog een nieuw object, genaamd _BaseA, met deze eigenschappen:

  • sprite: _BaseA
  • Solide: waar
  • Zichtbaar: waar
  • Diepte: -1
  • Aanhoudend: vals
  • Ouder: (geen)
  • Masker: (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();

    Stap 5

    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:

    • sprite: _TrainA
    • Solide: vals
    • Zichtbaar: waar
    • Diepte: 0
    • Aanhoudend: vals
    • Ouder: Maak er de ouder van _BaseA
    • Masker: (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 */

    Stap 6

    We zullen nu de torentjes van de speler maken. Maak een nieuw object met de naam _TurretA, en geef het deze eigenschappen:

    • sprite: _TrainA
    • Solide: vals
    • Zichtbaar: waar
    • Diepte: 0
    • Aanhoudend: vals
    • Ouder: oBaseA
    • Masker: (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();

    Stap 7

    De torentjes moeten kogels schieten, dus maak een nieuw object om deze te vertegenwoordigen. Noem het oBulletA, en geef het deze eigenschappen:

  • sprite: _BulletA // Een dun
  • Solide: vals
  • Zichtbaar: waar
  • Diepte: 1
  • Aanhoudend: vals
  • Ouder: (geen ouder)
  • Masker: (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);

    Stap 9

    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:

    • sprite: _UpgradeHP
    • Solide: vals
    • Zichtbaar: waar
    • Diepte: -99
    • Aanhoudend: vals
    • Ouder: (geen ouder)
    • Masker: (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;

    Stap 10

    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;

    Stap 11

    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.

    Stap 12

    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:

    1. Plaats bases aan beide kanten.
    2. Plaats treinrails vanaf de basissen (je kunt de tileset gebruiken in de brondownload).
    3. Plaats torentjes om te verdedigen; wanneer alle torentjes dood zijn wint het andere team.
    4. Plaats spawners, die met tussenpozen nieuwe treinen spawnen.
    5. Plaats de vier Upgrade-knoppen.

    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?