La oss prototype et spill Trainpunk

Å lage raske, enkle prototypespill er en fin måte å teste ut nye spillforslag raskt, uten å forplikte seg til å skape et fullblåst spill. Jeg liker å bruke Game Maker for dette, og i dette innlegget vil jeg dele et slikt spill med deg: Trainpunk, et togbasert strategispill.

Redaktørens merknad: Dette er en ny type post vi ikke har prøvd før. Gi oss beskjed om hva du synes, og om du vil se lignende innlegg i fremtiden!


Konsept og Gameplay Demo

Her er en video av meg som skisserer opp det opprinnelige konseptet for spillet, og da spiller jeg selve prototypespillet:

Jeg vil vise meg selv å tegne kunsten også, men det er så enkelt at det ikke er noen grunn til å.

I det siste spillet prøver to lag med tog å angripe fiendens base mens de skyves på tårn. Du spiller ved å bruke oppgraderinger ved hjelp av knappene nederst.

Vennligst last ned det siste spillet (pluss kildekoden og sprites) og tweak spillet så mye du vil! Du trenger en kopi av Game Maker 8.


Bygg spillet

Her er en grov oversikt over trinnene jeg tok for å bygge spillet. Du kan følge med fra bunnen av, eller bruk dette for å bedre forstå den fulle kilden.

Trinn 1

Last ned Game Maker 8, og åpne den.

Steg 2

Lage en ny SPILL objekt, med disse egenskapene:

  • Sprite: "Ingen sprite"
  • Fast: falsk
  • Synlig: ekte
  • Dybde: -999
  • vedvarende: ekte
  • Parent: (ingen foreldre)
  • Maske: (samme som sprite)

Gi det disse hendelsene:

 #Create Event: kjør kode: alarm [0] = 150; # Alarm Alarm for alarm 0: Kjør kode: Alarm [0] = 150; global.points + = 1; global.pointsB + = 1,25; #Step Event: Kjør kode: hvis! Instance_exists (oUpgradeHP) hvis! Global.points = 0 global.points - = 1; instance_activate_object (oUpgradeHP); instance_activate_object (oUpgradeRA); instance_activate_object (oUpgradeSS); instance_activate_object (oUpgradeAS);  hvis! global.pointsB = 0 ID = velg (1,2,3,4); // hvis ID = 1 global.hp2 + = 1; hvis ID = 2 global.ra2 + = 4; hvis ID = 3 global.ss2 + = 1; hvis ID = 4 global.as2 = global.as2 / 1.1; // global.pointsB - = 1;  hvis! instance_exists (oTurretA) instance_deactivate_all (true); søvn (500); game_restart ();  hvis! instance_exists (oTurretB) instance_deactivate_all (true); søvn (500); game_restart ();  #Andre hendelse: Spill Start: Kjør kode: // Tren Team A global.hp1 = 5; // Helsepoeng global.ra1 = 64; // Range global.ss1 = 6; // Skytfart global.as1 = 30; // Attack Speed ​​// Tren Team B global.hp2 = 5; // Helsepoeng global.ra2 = 64; // Range global.ss2 = 6; // Skytfart global.as2 = 30; // Attack Speed ​​global.points = 1; global.pointsB = 1; room_goto_next (); #Draw Event: kjør kode: draw_set_color (c_black); draw_set_font (font0); // draw_text (x + 4, y + 4, "TEAM [PLAYER] - HP =" + streng (global.hp1) + "- RA =" + streng (global.ra1) + "- SS =" + streng global.ss1) + "- AS =" + streng (global.as1)); draw_text (x + 4, y + 18, "TEAM [ENEMY_] - HP =" + streng (global.hp2) + "- RA =" + streng (global.ra2) + "- SS =" + streng ss2) + "- AS =" + streng (global.as2));

Trinn 3

Lag et nytt objekt, _Blokkere, og gjør det solidt. Det er bare for utseende - det gjør ikke mye selv.

Trinn 4

Opprett enda et nytt objekt, kalt _BaseA, med disse egenskapene:

  • Sprite: _BaseA
  • Fast: ekte
  • Synlig: ekte
  • Dybde: -1
  • vedvarende: falsk
  • Parent: (ingen)
  • Maske: (ingen)
  • Sprite er bare en 16x16 blokk. Nå, gi det disse hendelsene:

     #Create Event: kjør kode: hp = 100; #Step Event: Kjør kode: hvis hk < 0.9 instance_destroy();

    Trinn 5

    Her er et bilde av det endelige spillet, som referanse:

    Denne gangen oppretter du et nytt objekt som representerer en av spillernes tog (et hvitt rektangel på sporene). Kall det _TrainA og gi den disse egenskapene:

    • Sprite: _TrainA
    • Fast: falsk
    • Synlig: ekte
    • Dybde: 0
    • vedvarende: falsk
    • Parent: Gjør det til foreldrene til _BaseA
    • Maske: (ingen)

    Sprite skal være et 16x16 tog, vendt mot høyre. Gi objektet disse hendelsene:

     #Create Event: kjør kode: // Tren Team A // Angir statistikk til globale variabler bestemt av oppgraderinger. hp = global.hp1; // Helsepoeng ra = global.ra1; // Range ss = global.ss1; // Skytfart som = global.as1; // angrep hastighet retning = 360; hastighet = 2; #Alarm Hendelse for alarm 0: avslutt denne hendelsen #Step Hendelse: Kjør kode: n = instance_nearest (x, y, oBaseB); hvis 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 */

    Trinn 6

    Vi lager spillerens tårn nå. Opprett et nytt objekt som heter _TurretA, og gi den disse egenskapene:

    • Sprite: _TrainA
    • Fast: falsk
    • Synlig: ekte
    • Dybde: 0
    • vedvarende: falsk
    • Parent: oBaseA
    • Maske: (ingen)

    Jeg brukte samme sprite som for spillernes tog, her, men vær så snill å bytte den til et faktisk tårn. Det skal være 16x16px. Legg til hendelsene:

     #Create Event: kjør kode: hp = 25; // Helsepoeng ra = 128; // Range ss = 15; // Skytfart som = 20; // Angrepshastighet #Alarm Hendelse for alarm 0: avslutt denne hendelsen #Step Hendelse: Kjør kode: n = instance_nearest (x, y, oBaseB); hvis 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();

    Trinn 7

    Tårnene må skyte kuler, så opprett et nytt objekt som representerer disse. Kall det oBulletA, og gi den disse egenskapene:

  • Sprite: _BulletA // En tynn
  • Fast: falsk
  • Synlig: ekte
  • Dybde: 1
  • vedvarende: falsk
  • Parent: (ingen foreldre)
  • Maske: (samme som sprite)
  • Sprite skal være en tynn kule (1px høy med 16px bred, innenfor en 16x16px gjennomsiktig firkant), vendt mot høyre. Her er hendelsene:

     #Create Event: kjør kode: n = instance_nearest (x, y, oBaseB); retning = punkt_direksjon (x, y, n.x, n.y); #Step Event: Kjør kode: image_angle = retning; #Collision Event med objekt o_Block: ødelegge forekomsten #Collision Event med objekt oBaseB: Kjør kode: #instance_destroy (); other.hp - = 1;  

    8. Lag et nytt objekt (oSpawnerA)
    Informasjon om objektet: oSpawnerA Sprite: _TrainA // Fortsatt å bruke togsprite Solid: false Synlig: false Dybde: 0 Persistent: false Foreldre: Maske: Opprett hendelse: Kjør kode: alarm [0] = 180; instance_create (x, y, oTrainA); Alarmhendelse for alarm 0: Utfør kode: alarm [0] = 180; instance_create (x, y, oTrainA);

    Trinn 9

    Når spilleren kan oppdatere sin HP, lyser den aktuelle knappen:

    Vi lager denne knappen nå. Opprett et nytt objekt som heter oUpgradeHP, og gi den disse egenskapene:

    • Sprite: _UpgradeHP
    • Fast: falsk
    • Synlig: ekte
    • Dybde: -99
    • vedvarende: falsk
    • Parent: (ingen foreldre)
    • Maske: (samme som sprite)

    Gi det også disse hendelsene:

     #Create Event: kjør kode: image_alpha = 0.5; Mouse Event for Left Released: Kjør kode: global.hp1 + = 1; instance_deactivate_object (oUpgradeHP); instance_deactivate_object (oUpgradeRA); instance_deactivate_object (oUpgradeSS); instance_deactivate_object (oUpgradeAS); Mus Event for Mouse Enter: Kjør kode: image_alpha = 1; Mouse Event for Mouse Leave: Kjør kode: image_alpha = 0.5;

    Trinn 10

    Duplisere oUpgradeHP tre ganger så du har fire objekter - en knapp hver for oppgradering av HP, RA, SS og AS. (oUpgradeHP, oUpgradeRA, oUpgradeSS, oUpgradeAS).

    Endre Venstre utgitt Hendelses kode for hver:

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

    Trinn 11

    Duplisere oBaseA, oTrainA, oTurretA, oSpawnerA og oBulletA å lage oBaseB, oTrainB, oTurretB, oSpawnerB og oBulletB.

    Endre foreldrene sine (fra "A" til "B") og endre all sin kode fra:

     n = instance_nearest (x, y, oBaseB);

    … til:

     n = instance_nearest (x, y, oBaseA);

    … som kreves.

    Også satt oTrainB å ha retning = 180; i opprettelsesarrangementet, i stedet for retning = 360;. Sist, velg venstre-sprites sprites for hver, der det er aktuelt.

    Trinn 12

    Legg til alle dine fliser, sprites, kunst og så videre og opprett to nye rom: ett er rm_intro, hvor du bare burde sette obj_Game, og den andre er hovedrommet (rm_main).

    Bygg din rm_main som så:

    1. Plasser baser på hver side.
    2. Plasser togspor som løper fra basene (du kan bruke flisene i kilde nedlasting).
    3. Plasser tårn for å forsvare; når alle tårnene er døde, vinner det andre laget.
    4. Plasser spawners, som gyter nye tog med intervaller.
    5. Plasser de fire oppgraderingsknappene.

    Du kan prøve å gjøre rommet symmetrisk, slik at det blir noe rettferdig, eller plassere flere tårn på Enemy-siden for vanskeligere spill. Det er opp til deg - hele poenget med en prototype er å teste ting!

    Spill nå spillet. Når du spiller, vurder hva som må skiftes. Skal togene bli raskere eller tregere? Skal oppgraderinger komme oftere? Skal datamaskinen ha en urettferdig fordel? Bør spilleren ha mer innspilling enn bare å bruke oppgraderinger? Tweak unna!

    Jeg håper du har lært litt om å lage spill - men enda viktigere, håper jeg at du lærte hvordan ideer raskt kan knuses sammen i en prototype.

    Redaktørens merknad: Dette er en ny type post vi ikke har prøvd før. Gi oss beskjed om hva du synes! Er det noe du vil se oss gjøre annerledes med formatet i fremtiden? Vil du ha mer detaljer i videoen, eller et mer omfattende sett med instruksjoner for å faktisk bygge spillet?