Gör ett match-3-spel i Construct 2 Grunderna

Välkommen till en ny serie av tutorials där jag ska visa dig hur man bygger ett Match-3 pusselspel från början, i Construct 2. I den här första delen kommer vi att lägga grunden för spelet och få det grundläggande pusselätet på skärm.


Introduktion

Ett Match-3-spel är ett blockbaserat pussel där du flyttar block runt i spelområdet för att skapa grupper om tre eller flera som delar en gemensam egenskap (som en färg eller en form). I de flesta match-3-spel får spelaren också bonusar för att matcha mer än tre kvarter samtidigt.

De flesta match-3-pusselspel är konkurrenskraftiga i naturen, och spelarens mål är i allmänhet bara att få högsta poäng de kan innan tiden går ut eller om något annat förlustförhållande är uppfyllt. Några exempel på match-3-spel är Pokemon Puzzle League, Bejeweled och den nyligen slagna Candy Crush Saga.


Spelet vi ska göra

Jag bestämde mig för att basera match-3-spelet som vi kommer att göra på Pokemon Puzzle League:


Klicka och dra åtliggande block för att byta dem. Försök att matcha tre i rad eller kolumn. Låt inte blocken nå toppen!

Om du aldrig har spelat det tidigare är PPL en ganska enkel match-3 där blocken stiger från undersidan av spelskärmen och spelaren måste skapa matcher för att förhindra att skärmen fylls på. Om blocken når toppen, förlorar spelaren och tvingas börja om igen.

Här är en demonstration av spelet vi kommer att arbeta mot i hela serien:



I den här första artikeln kommer vi att fokusera på att lägga grunden för vårt spel. Denna artikel kommer att fokusera specifikt på att ställa in projektet och gyta ett rutnät av slumpmässiga block för spelaren.


Innan vi börjar

Innan du börjar med denna handledning bör du se till att installera den senaste versionen av Construct 2 (C2). När jag byggde den ursprungliga versionen av spelet använder jag Release 122, så länge du har en nyare version än det borde du ha det bra. Om du aldrig har använt C2 innan du bör kolla in den här handboken, vilka detaljer beskriver grunderna för att använda C2 och hur man gör de flesta objekttyperna.

Du bör också ladda ner grafikpaketet jag skapade för denna handledning. Medan du självklart kan använda vilken grafik du vill, kommer jag att ge specifik positionering för många saker i dessa handledning, och dessa positioner är baserade på de bilder jag använde. Om du använder annan grafik måste du redogöra för eventuella storleksskillnader i grafiken när du följer dessa handledning.

När du har allt satt upp och har en bra förståelse för C2, läs vidare!


Ställa in projektet

Innan vi faktiskt bygger hela spelningen måste vi ställa in själva projektet. Ladda C2 och följ dessa steg:

  1. Starta ett nytt projekt.
  2. I Projektegenskaper, Ställ in Fönsterstorlek till 600x600.
  3. Fyll i namn och Författare fält.
  4. Gå till Skikten panel och lägg till två nya lager.
  5. Byt namn på det lägsta lagret till Bakgrund, mittlagret till Blocks, och toppskiktet till Spelfält.
  6. Gå in i Layout 1 och sätt in a Sida vid sida objekt.
    1. För Sida vid sida objekt, använd BG Bilder / StandardBGTile.bmp från grafikpaketet.
    2. Gå till objektets egenskaper och byt namn på den GameBG.
    3. Ange objektets Lager till Bakgrund.
    4. Ange objektets Storlek att vara 650, 650.
    5. Placera objektet så att det fyller hela synligt område i layouten och ser ut som det här:
  7. Skapa nu en annan Sida vid sida objekt.
    1. Använd bilden Spelfält Bilder / GameFieldBorder.bmp.
    2. Namn objektet GameFieldBorder.
    3. Ställ in Placera till 9, -12.
    4. Ställ in Storlek till 16, 732.
    5. Ställ in Lager till Spelfält.
  8. Skapa en kopia av  GameFieldBorder objekt.
    1. Ställ in Placera av kopian till  368, -12 .
  9. Skapa sedan en Sprite objekt.
    1. Använd bilden Spelfält Bilder / GameFieldBottom.png.
    2. Namnge det GameFieldBottom.
    3. Ställ in Placera till 197, 625.
    4. Ställ in Storlek till 344, 150.
    5. Ställ in Lager till Spelfält.
  10. Gör en kopia av GameFieldBottom objekt.
    1. Ställ in Placera till 196, -30.
    2. Ställ in Vinkel till 180.

Det sista vi behöver göra är att skapa en bakgrund för det faktiska området blocken kommer att dyka upp i.

  1. Skapa en ny Sprite objekt.
    1. Gå till Färgväljare och ställa in Röd, Grön, och Blå till 0, och den Alfa till 200.
    2. Använd Målarfärgsburk att fylla hela bilden med den här färgen.
    3. Stäng animeringsredigeraren.
    4. Ställ in Storlek till 359, 570.
    5. Ställ in Placera till 195.294.
    6. Ställ in Lager till Bakgrund

Spelfältet är nu färdigt, men vi måste fortfarande göra en Sprite som kan användas för blocken. 

  1. Gör en ny Sprite objekt.
    1. Med animeringsredigeraren öppen högerklickar du i Animationsramar fönster och välj "Importera ramar ... ".
    2. Välj varje bild i Blocks mapp från grafikpaketet och importera dem alla.
    3. Ta bort ram 0, så att den grå blockbilden är Ram 0 och det finns ingen blank ram.
    4. Kontrollera att dina ramar är i samma ordning som mina block i bilden nedan:

Innan vi går framåt skulle jag vilja förklara blockbilderna. Det grå blocket finns där för att representera ett "inaktivt" block, vilket kommer att implementeras i en kommande handledning. De återstående bilderna grupperas i grupper om tre för varje block: den första ramen är för när blocket inte används, den andra är för när spelaren manipulerar blocket och den tredje är för när blocket är matchat till en grupp.

Slutligen ta det block vi har gjort och placera det någonstans i layouten som förhindrar att spelaren ser det under ett aktuellt spel. Ställ in blockets storlek till 40, 40.

Vi har nu tagit in alla bilder vi behöver för den här artikeln och kan gå vidare för att faktiskt göra spelet.


Spawning a Random Block Grid

I den sista versionen av spelet kommer blocken att gå upp hela tiden, och nya block kommer att trycka på skärmen från botten. För närvarande måste vi dock få de grundläggande mekanikerna att fungera, så vi ska bara kasta ett 8x8 rutnät av block och lämna den där.

Gå till Event Sheet 1 och lägg till dessa globala variabler för att definiera Blocks initiala gösposition:

 Global Variabel: SPAWNX Värde = 49 Konstant = Sann Global Variabel: SPAWNY Värde = 526 Konstant = Sann

Vi måste också göra en annan sak innan vi gör den första händelsen: vi måste skapa en instansvariabel för blocket som berättar blocket vilken färg det är.

Skapa en ny instansvariabel för Block-objektet, namnge det Färg och ändra inga andra inställningar.

Nu ska vi göra vår första händelse. Målet med denna händelse är att skapa ett statiskt rutnät av block för teständamål:

 Händelse: Skick: System> Vid start av layout Skick: System> För namn: "Y" Startindex = 0 Slutindex = 7 Underhändelse: System> För namn: "X" Startindex = 0 Slutindex = 7 Åtgärd: Systemet> Skapa objektobjekt: Block X = (SPAWNX + (loopIndex ("X")) * (Block.Width + 2)) Y = (SPAWNY - (loopIndex ("Y")) * (Block.Width + 2) )

Båda dessa formler säger i princip samma sak. Först lägger vi till 2 i blockbredden så att varje block har en 2px buffert mellan den och dess grannar för att förhindra falska positiva när kollisionsdetektering används. Sedan multiplicerar vi det numret med det aktuella indexet i loop och lägger till det i startpositionen X eller Y. Vi subtraherar också från Y-värdet, eftersom i 0-talet är 0-punkten på Y-axeln högst upp på spelskärmen, så genom att sänka Y-positionsvärdet lägger vi ett objekt närmare skärmens övre del.

Så vad gör detta? Detta betyder att när X- och Y-looparna itereras och värdena för X och Y ökar, ändras positionen som varje ställe sätter in, vilket resulterar så småningom i ett kvadratiskt rutnät:

Om du kör spelet vid denna tidpunkt kommer du att ha ett rutnät av block - men i stället för att vara olika färger, kommer de bara att cykla igenom varje blockbild i följd.

För att fixa detta måste vi göra två saker.

Först måste vi tilldela varje block ett färgvärde med hjälp av förekomstvariabeln som vi gjort tidigare. För att göra detta lägger du till en annan åtgärd:

 Åtgärd: Block> Ange värde Färg = golv (Slumpmässig (1,7))

Detta kommer att tilldela blocket ett slumpmässigt färgvärde från 1 till 6. (Anledningen till att den inte är från 1 till 7 förklaras i förklaringen av Slumpmässig fungera.)

Din funktion ska nu se ut så här:

Vi måste också lägga till ett system som ändrar bilden av ett block baserat på dess värde. För att göra detta, börja med att lägga till en ny instansvariabel till blockobjektet:

 Instansvariabel för blocknamn: "IsMatched" Type: Boolean initialvärde = false

Lägg nu till en ny händelse:

 Händelse: System> Varje tick-åtgärd: Blockera> Ange ramvärde = (Block.Color-1) * 3 + 1

Denna formel subtraherar först 1 från blockens färgvärde för att beräkna det faktum att värdena börjar vid 1 snarare än 0. Då multiplicerar det det med 3 för att ta hänsyn till det faktum att varje block har 3 animationsramar. Slutligen lägger det till 1 till det värdet eftersom standardbilden av ett block är den första bilden i uppsättningen bilder.

Låt oss titta på ett snabbt exempel med ett block som har ett färgvärde på 4, för att se vilken animationsram den ska använda. För det första subtraherar du 1 från färgvärdet för att få 3. Därefter multipliceras det antalet med 3 för att göra 9. Slutligen lägger det 1 till det värdet för att göra 10. Detta innebär att ett block med ett färgvärde på 4 kommer att använda ram 10 som dess standard animeringsram, och kommer att vara en lila / fyrkantig Block.

Om du kör ditt spel nu ser du att varje block har en annan färg, men vi har fortfarande inte implementerat animeringar för när musen svävar över blocket eller när den matchas. Detta kommer att behandlas i nästa handledning, tillsammans med hur man byter två närliggande block.

Här är en liten demonstration av vad spelet ska se ut vid denna tidpunkt (ta tag i källan här):

Klicka för att ladda demo.

Om du vill fortsätta arbeta på egen hand, börja titta på att ändra Blockens animeringsram baserat på en "Mus> Markör är över objekt" -händelse. Du kan också börja titta på "Drag & Drop" -beteendet för att manipulera blocket och överväga hur man bestämmer vad spelaren försöker göra med blocket när de börjar dra det eller när de släpper det.


Slutsats

Tack för att du läste denna del av handledningen där vi satte grunden för vårt Match-3-spel. Kom tillbaka snart igen för nästa del av serien! Du kan hålla dig uppdaterad via Facebook, Twitter, Google+, RSS eller e-post.