Låt oss prototyper ett spel Trainpunk

Att göra snabba, enkla prototypspel är ett utmärkt sätt att testa ut nya gameplay-idéer snabbt, utan att begå sig för att skapa ett fullblåst spel. Jag gillar att använda Game Maker för detta, och i det här inlägget delar jag ett sådant spel med dig: Trainpunk, ett tågbaserat strategispel.

Redaktörens anmärkning: Det här är en ny typ av inlägg som vi inte har försökt tidigare. Vänligen meddela vad du tycker, och om du vill se liknande inlägg i framtiden!


Concept and Gameplay Demo

Här är en video av mig som skissar ut det ursprungliga konceptet för spelet, och sedan spelade jag själva prototypspelet:

Jag skulle visa mig själv att dra tecknet också, men det är så enkelt att det inte finns någon riktig anledning att.

I sista matchen försöker två lag av tåg attackera fiendens bas samtidigt som de skjuts på torn. Du spelar genom att tillämpa uppgraderingar med knapparna längst ner.

Vänligen ladda ner det sista spelet (plus källkoden och sprites) och tweak gameplayen så mycket du vill! Du behöver en kopia av Game Maker 8.


Bygga spelet

Här är en grov skiss över de steg jag tog för att bygga spelet. Du kan följa med från början, eller använd det här för att bättre förstå den fulla källan.

Steg 1

Ladda ner Game Maker 8 och öppna den.

Steg 2

Skapa en ny SPEL objekt med dessa egenskaper:

  • Sprite: "Ingen sprite"
  • Fast: falsk
  • Synlig: Sann
  • Djup: -999
  • Beständig: Sann
  • Förälder: (ingen förälder)
  • Mask: (samma som sprite)

Ge det här händelserna:

 #Create Event: execute code: alarm [0] = 150; #Alarmhändelse för alarm 0: exekvera kod: alarm [0] = 150; global.points + = 1; global.pointsB + = 1,25; #Step Event: exekvera kod: om! Instance_exists (oUpgradeHP) om! Global.points = 0 global.points - = 1; instance_activate_object (oUpgradeHP); instance_activate_object (oUpgradeRA); instance_activate_object (oUpgradeSS); instance_activate_object (oUpgradeAS);  om! global.pointsB = 0 ID = välj (1,2,3,4); // om ID = 1 global.hp2 + = 1; om ID = 2 global.ra2 + = 4; om ID = 3 global.ss2 + = 1; om ID = 4 global.as2 = global.as2 / 1.1; // global.pointsB - = 1;  om! instance_exists (oTurretA) instance_deactivate_all (true); sömn (500); game_restart ();  om! instance_exists (oTurretB) instance_deactivate_all (true); sömn (500); game_restart ();  #Andra händelse: Spel Start: kör kod: // Trä Team A global.hp1 = 5; // Hälsopoäng globalt.ra1 = 64; // Område global.ss1 = 6; // Skjuthastighet global.as1 = 30; // Attack Speed ​​// Train Team B global.hp2 = 5; // Health Points global.ra2 = 64; // Område global.ss2 = 6; // Skjuthastighet global.as2 = 30; // Attack Speed ​​global.points = 1; global.pointsB = 1; room_goto_next (); #Draw Event: kör kod: draw_set_color (c_black); draw_set_font (font0); // draw_text (x + 4, y + 4, "TEAM [PLAYER] - HP =" + sträng (global.hp1) + "- RA =" + sträng (global.ra1) + "- SS =" + sträng global.ss1) + "- AS =" + sträng (global.as1)); draw_text (x + 4, y + 18, "TEAM [ENEMY_] - HP =" + sträng (global.hp2) + "- RA =" + sträng (global.ra2) + "- SS =" + sträng ss2) + "- AS =" + sträng (global.as2));

Steg 3

Skapa ett nytt nytt objekt, _Blockera, och gör det solidt. Det är bara för utseende - det gör inte mycket själv.

Steg 4

Skapa ännu ett nytt objekt, kallat _BaseA, med dessa egenskaper:

  • Sprite: _BaseA
  • Fast: Sann
  • Synlig: Sann
  • Djup: -1
  • Beständig: falsk
  • Förälder: (ingen)
  • Mask: (ingen)
  • Sprite är bara ett 16x16 block. Nu, ge det dessa händelser:

     #Create Event: exekvera kod: hp = 100; #Step Event: exekvera kod: om hk < 0.9 instance_destroy();

    Steg 5

    Här är en bild av det slutliga spelet, som referens:

    Denna gång skapar du ett nytt objekt som representerar en av spelarens tåg (en vit rektangel på spåren). Kalla det _TrainA och ge den dessa egenskaper:

    • Sprite: _TrainA
    • Fast: falsk
    • Synlig: Sann
    • Djup: 0
    • Beständig: falsk
    • Förälder: Gör det förälder till _BaseA
    • Mask: (ingen)

    Sprite ska vara ett 16x16 tåg, vänd mot höger. Ge objektet dessa händelser:

     #Create Event: execute code: // Trä Team A // Ställer in statistik för globala variabler bestämda av uppgraderingar. hp = global.hp1; // Health Points ra = global.ra1; // Range ss = global.ss1; // Skjuthastighet som = global.as1; // Attack Hastighetsriktning = 360; hastighet = 2; #Alarm Händelse för alarm 0: avsluta den här händelsen #Step Händelse: exekvera kod: n = instance_nearest (x, y, oBaseB); om 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 */

    Steg 6

    Vi gör nu spelarens torn. Skapa ett nytt objekt som heter _TurretA, och ge den dessa egenskaper:

    • Sprite: _TrainA
    • Fast: falsk
    • Synlig: Sann
    • Djup: 0
    • Beständig: falsk
    • Förälder: oBaseA
    • Mask: (ingen)

    Jag använde samma sprite som för spelarens tåg, här, men gärna byta till ett verkligt torn. Det ska vara 16x16px. Lägg till händelserna:

     #Create Event: kör kod: hp = 25; // Hälsopoäng ra = 128; // Räckvidd ss = 15; // Skjuthastighet som = 20; // Attack Speed ​​#Alarm Händelse för alarm 0: avsluta den här händelsen #Step Event: exekvera kod: n = instance_nearest (x, y, oBaseB); om 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();

    Steg 7

    Tornen måste skjuta kulor, så skapa ett nytt objekt för att representera dessa. Kalla det oBulletA, och ge den dessa egenskaper:

  • Sprite: _BulletA // En tunn
  • Fast: falsk
  • Synlig: Sann
  • Djup: 1
  • Beständig: falsk
  • Förälder: (ingen förälder)
  • Mask: (samma som sprite)
  • Sprite ska vara en tunn kula (1px lång med 16px bred, inom en 16x16px transparent kvadrat), vänd mot höger. Här är dess händelser:

     #Create Event: kör kod: n = instance_nearest (x, y, oBaseB); direction = point_direction (x, y, n.x, n.y); #Step Event: exekvera kod: image_angle = direction; #Collision Händelse med objekt o_Block: förstör förekomsten #Collision Händelse med objekt oBaseB: exekvera kod: #instance_destroy (); other.hp - = 1;  

    8. Skapa ett nytt objekt (oSpawnerA)
    Information om objekt: oSpawnerA Sprite: _TrainA // Fortfarande använder tågsprite Solid: false Synligt: ​​false Djup: 0 Persistent: false Förälder: Mask: Skapa händelse: kör kod: alarm [0] = 180; instance_create (x, y, oTrainA); Larmhändelse för larm 0: exekvera kod: larm [0] = 180; instance_create (x, y, oTrainA);

    Steg 9

    När spelaren kan uppdatera sin HP, tänds den relevanta knappen:

    Vi skapar den här knappen nu. Skapa ett nytt objekt som heter oUpgradeHP, och ge den dessa egenskaper:

    • Sprite: _UpgradeHP
    • Fast: falsk
    • Synlig: Sann
    • Djup: -99
    • Beständig: falsk
    • Förälder: (ingen förälder)
    • Mask: (samma som sprite)

    Ge det även dessa händelser:

     #Create Event: kör kod: image_alpha = 0.5; Mushändelse för vänster frisläppt: kör kod: global.hp1 + = 1; instance_deactivate_object (oUpgradeHP); instance_deactivate_object (oUpgradeRA); instance_deactivate_object (oUpgradeSS); instance_deactivate_object (oUpgradeAS); Mushändelse för mus Ange: kör kod: image_alpha = 1; Mushändelse för muslåt: kör kod: image_alpha = 0.5;

    Steg 10

    Duplicera oUpgradeHP tre gånger så du har fyra objekt - en knapp vardera för att uppgradera HP, RA, SS och AS. (oUpgradeHP, oUpgradeRA, oUpgradeSS, oUpgradeAS).

    Ändra Vänster Released händelsekod för varje:

     oUpgradeHP -> global.hp1 + = 1; oUpgradeRA -> global.ra1 + = 4; oUpgradeSS -> global.ss1 + = 1; oUpgradeAS -> global.as1 = global.as1 / 1.1;

    Steg 11

    Duplicera oBaseA, oTrainA, oTurretA, oSpawnerA och oBulletA att skapa oBaseB, oTrainB, oTurretB, oSpawnerB och oBulletB.

    Ändra sina föräldrar (från "A" till "B") och ändra all kod från:

     n = instance_nearest (x, y, oBaseB);

    ... till:

     n = instance_nearest (x, y, oBaseA);

    … såsom krävs.

    Ställ också in oTrainB att ha riktning = 180; i skapa händelsen, istället för riktning = 360;. Sist, välj vänster vända sprites för varje, där det är lämpligt.

    Steg 12

    Lägg till alla dina kakel, sprites, konst och så vidare och skapa två nya rum: en är rm_intro, där du bara bör sätta obj_Game, och den andra är huvudrummet (rm_main).

    Bygg din rm_main såhär:

    1. Placera baser på vardera sidan.
    2. Placera tågspår som går från baserna (du kan använda kakelstenen i källkodsladdningen).
    3. Placera torn för att försvara; när alla torn är döda vinner det andra laget.
    4. Placera spawners, som krossar nya tåg med intervaller.
    5. Placera de fyra uppgraderingsknapparna.

    Du kan försöka göra rummet symmetriskt så det blir något rättvist, eller placera fler torn på Enemy-sidan för svårare spel. Det är upp till dig - hela punkten i en prototyp är att testa saker!

    Spela nu spelet. När du spelar, fundera över vad som behöver ändras. Ska tågen bli snabbare eller långsammare? Ska uppgraderingar komma oftare? Ska datorn ha en orättvis fördel? Skulle spelaren ha mer inmatning än att bara tillämpa uppgraderingar? Tweak bort!

    Jag hoppas att du lärde dig lite om att göra spel - men ännu viktigare hoppas jag att du lärde dig hur någon idé snabbt kan krossas i en prototyp.

    Redaktörens anmärkning: Det här är en ny typ av inlägg som vi inte har försökt tidigare. Vänligen meddela oss vad du tycker! Är det något du vill se oss göra annorlunda med formatet i framtiden? Vill du ha mer detaljer i videon eller en mer komplett uppsättning instruktioner för att faktiskt bygga spelet?