Etikettarkiv: 5SD033

Healthbar och Damage animation

Hejsan! Sista blogginlägget idag, skönt att bli av med det här om jag ska vara helt ärlig. Så de artefakterna jag tänkte skriva om idag är hur jag gjorde skadeanimationen och ”Healthbar animationen”. Så vad exakt har jag gjort? När man tar skada så vill man gärna veta att man tar skada, man vill alltså ha feedback på det, så att man inte går helt ostört och helt plötsligt är man död och inte vet varför. Därför har skapade vi en ”damge animation” när spelaren tar skada, skulle inte riktigt kalla det en animation för det jag gör är egentligen bara ritar ut en enstaka bild lite snabbt. Samma anledning är varför vi skapade en ”healthbar” för spelaren, för spelaren ska ha koll på hur mycket liv spelaren ha kvar i spelet.

Innan i spelet hade vi ett värdet för spelaren som kallades ”marketvalue” som skulle representera spelaren liv. Detta bytte vi nu till att ha en mer visuell representation för spelarensliv för att göra det klara för spelaren. Just nu så visas ”healthbaren” som en jordglob som töms en 1/10 varje gång spelaren tar skada från fienderna, innan så var det bara en text och siffror som det stod ”marketvaule” på som började på 1000 och sedan gick ner med 100 varje gång spelaren tog skada. Detta fick vi väldigt mycket kritik på så vi bytte till att använda oss utav ett mer visuell representation för ”healthbaren” för spelaren.

Hur har jag gjort det? Eftersom min kunskap inom programmering är väldigt låg så gjorde jag det väldigt lätt för mig. Jag hade 10 olika bilder med en jordglob som var olika mycket fyllda. Så i koden använder jag mig utav ”if sats” som säger om”marketvalue” är lägre eller lika med 900 så ska”healthbar” bilden bytas ut med den bilden med jordgloben som är 9/10 fylld. Sen gör jag bara om denna ”if sats” flera gånger om men byter bilden och regeln i ”if satserna” , om ”marketvalue” ska är mindre eller lika med 800 så byts bilden till en jordglob som är 8/10 fylld osv.

en ”if sats” även kallad villkorssats handlar i huvudsakligen om ett ”om” t.ex. om 7-3 är lika med 4 så ska en viss bild ritas ut.

Med ”damages” bilden använde jag mig också utav ”if satser” men även också en inbyggd klockfunktion i sfml. Så om en fiende kraschar ner på planet så ska en ”damages” bild ritas ut under en viss tid på skärmen i detta fall en halv sekund så kommer bakgrundsbilden bli transparent rött på kanterna.

Varför jag gjorde som jag har gjort har jag ingen riktigt bra anledning, jag testa mig först på”if satser” sen så fungerade det ganska bra redan då så jag kände inte direkt någon anledning av att försöka mig på något annats sätt och jag visste inte heller något annats sätt att göra det på.

health.dmg

Rapid Fire Power up – week 5

Hejsan! I denna veckas blogginlägg ska ska skriva om hur jag gick till väg för att skapa ”power upen rapid fire” och varför jag har gjort som jag gjorde. Så en av mina uppgifterna till denna vecka vara att fixa ”rapid fire power up”. Så först behöver vi veta vad vår ”rapid fire power up” ska göra? Vi i gruppen bestämde oss för att när man fick ”power upen” så ska spelaren kunna skjuta mer projektiler under en kortare tid. Så vad behöver jag alltså koda.,först och främst så ska spelaren kunna skjuta ut en projektil och denna kod finns redan för att spelaren ska kunna skjuta projektiler vanligt. Men i denna kod använder vi oss av en typ av ”cooldown” med hjälpa en klockkod, innan man kan skjuta igen. Så om man tänker logisk så borde det bara vara att ta bort denna ”cooldown” för att kunna skjuta igen för att få en effekt av att spelaren kan skjuta mer under en kortare tid.Och det var det jag gjort, jag tog bort koden för ”cooldownen” mellan projektilerna som var satt på en halv sekund.

Nu fungerar själva ”rapid fire power upen”, spelaren kan skjuta flera projektiler under kortare tid. Så nu återstår det bara att fixa så att denna ”power up” har en livslängd och inte varar över hela spelet så fort man har fått den. Hur ska jag göra det här? Jag tänkte först att jag skulle använda mig utav kodbiblioteket sfml inbyggda klocka men detta gav mig lite problem. Jag var inte så inläst på sfml klockan och visste inte riktigt när klockan startade tills jag skrev ut det i konsolen, det visande sig att klockan startade så fort man skapade klockkoden. Så jag försökte skapa klockkoden i en kodloop för ”rapid fire” koden men det visa sig att när jag la in klockkoden i ”rapid fire” loopen så vill inte klockan öka, den stannar alltså på samma tid i hela loopen och om jag ska vara helt ärligt så vet jag inte varför det gör så. Så jag testa mig utav ett annat alternativ där jag använder mig utav ”iterator”.

An iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators (with at least the increment (++) and dereference (*) operators)” (http://www.cplusplus.com/reference/iterator/ (Hämtad 20016-03-10).

Så vad jag gjorde var att jag gjorde en iterator som plussas på varje gång som loppen körs igenom. Så då sätter jag en regel för koden om att denna iterator är högre än ett visst värde t.ex. 200 så ska ”rapid fire” ta slut och detta funkar ändå ganska okej. Så tips för någon som har fastnat i en kod är att försöka skriva ut så mycket som möjligt i konsolen så kan det bli lättare att få reda på om något skrivs ut rätt eller fel och se vart felet är. I andra bilden under ser du hur spelet ser ut utan ”rapid fire ”  och i första bilden ser du hur spelet fungerar med ”rapid fire”.hmm2

 

hmm

Meny – vecka 4

Hejsan! I dagen blogginlägg ska jag skriva om hur vi gjorde våran meny i spelet. Den uppgiften jag hade var att skapa en meny med tre olika knappar som ska innehålla olika stadier. De ska även vara möjligt att vandra mellan dessa olika stadier från menyn . De ska vara fem olika stadier som spelet ska kunna gå emellan. Det första stadiet som man kommer in till när man startar spelet är meny stadiet. Vad som finns här är de andra stadier som man ska kunna gå till. Ett ”play” stadium som ska starta det riktigt ”spelet”. Ett ”option” stadium som var tanke att man skulle kunna ändra olika saker i t.ex. ljud och skärmupplösning men tiden var knappt så för tillfället så innehåller det stadiet bara ”highscore” som ska då visa de tio bästa poängen som har uppnått i spelet. Sista stadiet i spelet är en ”quit” stadium som stänger ner spelet. När jag skapade menyn så tog jag en stor hjälp från vår andra programmerare i gruppen, Mathias.

Det först vi gjorde i projekten var att ladda in bakgrundsbilden som menyn skulle ha, i det här fallet var den en ”pixel art” bild med jorden och spelets namn. Sedan behövde vi ladda in alla andra bilder för knapparna. Alltså så behövde bilder för ”high score”, ”options”, ”play”, ”back” och ”quit”. Efter det så behövde vi fixa ett sätt så att spelet kan interageras med dessa bilder. Hur vi fixa det var genom att ge dessa olika bilder rektanglar som inte ritas ut, men att fortfarande spelet kan interagerar med. Rektanglarna är i huvudsakligen för att kolla om mus pekarna är inom rektanglarna area. Alltså så kommer dessa rektanglar ligga bakom de olika bildknapparna. För att se om muspekaren är inom någon av rektanglarnas area så behöver spelet vet om muspekarens position och det gör jag genom koden under.

sf::Vector2f mousePos = window.mapPixelToCoords(sf::Mouse::getPosition(window));

sedan så har jag en ”if sats” i spelet som säger om muspekare är inom t.ex. ”play knappen” och spelaren trycker på vänster musknapp så går spelet till ett ”play” stadium där spelet start i. Detta funkar på samma sätt på de andra knappar fast du kommer som sagt till olika stadier beroende på vilken rektangel din muspekare är inom. Kortfattat om ”if satser” , en ”if sats” är en villkorssats och som du säkert vet så betyder ”if” om på engelska och det är just detta om som ”if satsen” går ut på t.ex. om(det har gått över tre sekunder) {rita ut denna bild}.

Varför vi gjorde som vi har gjort har jag inget riktigt bra svar för, eftersom detta var det enda sättet som vi visste om för tillfället för att skapa en meny. Vi skulle dock kunna använda oss av piltangenterna för att välja mellan de olika knapparna men eftersom spelet i huvudsakligen styr med hjälp av musen så kände vi att musen var ett passande alternativ att välja mellan de olika knapparna.Hmmm

Enum states

Hejsan! I dagens blogginlägg tänkte jag att jag skulle skriva om mitt arbete i gruppen under vecka tre. Min uppgift var att skapa en meny för spelet. Vad vi behövde för menyn var en ”play-knapp”, ”option-knapp” och en ”quit-knapp”. Men problemet här var att vi inte hade några ”states” som spelet kunde vandra mellan.”states” kan man säga är ett typ av stadium i ett spel t.ex. ”menustate” där spelets meny håller till eller ”gamestate” där spelet ”spelas” ut i. Så min uppgift blev istället att göra olika ”states” för spelet och en ”state hanterare” som tar in och byter mellan de olika ”statesen”. Men det stora problemet här var att jag hade väldigt lite kunskap om ”state hanterare” och om hur olika ”states” ska fungerar med varandra. Det var inte bara jag som hade lite kunskap om det men också de andra två programmerarna i gruppen. Så vi fick tips på att försöka göra det enkelt för oss genom använda ”enums ” istället, vilket gjorde det lättare.

Enum är en förkortning av ordet enumerering. Meningen med Enum är att skapa en eller flera variabler som innehåller fasta värden. Dessa grupperas och kan sedan anropas med ett namn istället för ett värde. ” (Johansson , Pelle.2002. ENUM- vad är det och vad används det till?http://www.pellesoft.se/article/323/enum—vad-ar-det-och-vad-anvands-det-till- (Hämtad 20016-02-25)).

Jag hade fortfarande lite problem med hur man skulle få allt att fungera med ”enum” så jag tog väldigt mycket hjälp från gruppens andra programmerare, Mathias. Så hur vi gjorde då var att skapa ”enum states” i huvudfilen, vi gjorde åtta olika ”states”. Första ”state” var en startbild som sedan ska gå över till en huvudmeny ”states” där man ska kunna välja mellan tre ytterligare ”states”. Spela ”state” som startar själva spelet sedan en kontroll ”state” som ska visa hur man styr i spelet, sista ”state” i huvudmenyn var en avsluts ”state” som ska avsluta spelet. Det finns också två ytterligare ”states” i spela ”state” som är en paus ”state” som pausar spelet och en förlorar ”state” som ska visa en ”gameover” bild när man förlorar.

enum Status { STARTSCREEN, MAINMENU, PLAY, OPTIONS, PAUSED, QUIT, CONTROLS, ENDSCREEN };

Efter det här var det mestadels bara att lägga in alla funktioner och allt annan kod under rätt ”state”. Varför vi valde att göra ”enum states” var p.g.a. att det var det enklaste sättet att göra de olika stadierna för spelet, inom vår grupps kunskapsnivå. Eftersom nu kunde vi bara köra allt i en huvudfil istället för att ha flera olika filer som ska styras med en ”state hanterare” som kan krångla till det. Det dåliga med ”enum states” är att det blir väldigt mycket kod i en fil och det gör att det blir väldigt grötigt och svårt att hitta den koden du är ute efter. Så ett tips till personer som ska använda ”enum states” gör kommentarer i koden, tydliga kommentarer det gör att det blir lättare att söka på koden du är ute efter och slipper slösa massa tid på att leta kod.blogginlägg

Hitbox

Hejsan! I dagens blogginlägg tänkte jag skriva om hur jag gjorde för att skapa fiendernas och projektilernas ”hitbox” att fungera att kollidera med varandra. I vårat spelet så existerar det fiender med mål att röra sig ner mot avataren för att sedan skada den, spelaren ska då med hjälp av avataren skjuta ner fienderna med projektiler som avataren skjuter. En ”hitbox” är en form som användas för att kolla kollisionen mellan olika objekt. Så det jag gjorde var att göra passande rektanglar för fienderna och projektiler, för fienderna var det 45 pixlar bred och 22 pixlar hög, projektiler var det 20 pixlar bred och 60 pixlar hög. Det viktiga att göra här att man speltestar för att se vad som är en lämpligt ”hitbox” storlek på fienderna och projektilerna. Vi vill inte att det ska bli för svårt för spelaren att pricka fienderna med projektilerna därför får inte ”hitboxen” på fienderna vara allt för små eller på projektilen. ”Hitboxen” får heller inte vara för stor, först för att det blir för enkelt att träffa fienderna i och med det kommer inte spelet bli utmanande för spelaren.

Vad jag gör sen när fiendernas och projektilernas ”hitboxes” träffar varandra är att jag raderar båda objekten, alltså både bilden av objektet och ”hitboxen”. Varför jag gör det är p.g.a. ifall jag inte raderar bort objektets bild och ”hitboxes” så kommer det sväva runt massa onödigt minne från varje objekt i spelet som kommer göra att spelet saktas ner och tills slut kommer spelet krascha p.g.a. allt överflödigt minne som inte raderas bort. För att göra det så använder jag mig utav en funktion som gör att så fort en fiende och projektils ”hitboxes” träffar den ena eller den andra så raderas bort deras bild och ”hitbox”. Ifall man skulle vilja ha fiender med mer liv t.ex. någon bossfiende som kommer ner ibland som tar 5 projektiler att döda. För att göra det så behöver jag börja med att sätta ett värde på bossfienden, då sätter jag ett värde på 5. Sedan behöver jag sätta ett värde på projektilen på hur mycket projektilen ska skada, i detta fall är det 1. Jag sätter en ny funktion där ifall en projektilen interagerar med en fiende så förlora fienden 1 värde på livet. Denna funktion händer varje gång en projektil interagerar med en fiende till värdes livet på fienden når noll. När en fienders liv når noll så utför en ny funktion som raderar bort både bilden och ”hitboxen” för just den fiende som når noll. I GIF:en under kan man se hur projektilerna interagerar med fienderna.

 

RandomGenerator

Hejsan! Mitt namn är Stam, jag ingår i grupp 1 som gör sin variation av konceptetet Planet Suburbia. En av de uppgifterna jag hade att jobba med första veckan var att programmera fiendernas skapelseplats. Fienderna är rymdskepp som rör sig uppifrån och ner, fienderna ska alltid börja längst upp på skärmen men de ska ha en slumpmässig skapelseplats vågrätt längst skärmen. För att lycka med det här så behövde jag skapa en slumpgenerator. Jag visste inte riktigt exakt hur jag skulle gå till väg i början men stötte på en väldigt bra youtube kanal (https://www.youtube.com/user/BlueVideoGame) om spelkodning, där jag refererar de mesta av min slumpgenerators kod .

De visade sig att c++ har en include fil( <cstdlib> )som har en funktion som heter rand() som ger ut en slumpmässigt nummer. Jag börjar med att göra en random.h fil där jag deklarerar int generateRandom variabeln samtidigt som jag deklarerar ett int max värde i generateRandom för att sedan kunna använda int max värdet i generateRandom funktion som sedan kommer ingå i random.cpp filen.

int generateRandom(int max);”

Jag gör en header file för slumpgeneratorn därför att jag tycker personligen att det blir lättare att kunna komma åt funktionen från andra filer och även lättare att återanvända funktionen. Efter det gör jag en random.cpp file som kommer innehålla slump funktionen.

int generateRandom(int max)

{

int randomNumber = rand();

float random = (randomNumber % max)+1;

return random;

}

I random.cpp börjar jag med att deklarera funktionen rand() som en int randomNumber detta gör jag mest för att göra det lättare för mig själv att komma ihåg vad rand() gör. Efter det deklarerade jag en float random med ett värde (randomNumber % max) +1. Vad som händer här är att randomNumber kommer först ge ut ett slumpmässigt värde eftersom jag deklarerade randomNumber lika med rand() efter det kommer modulus operatorn att dividera det värdet med max och lämna kvar vad som blir över efter dividerandet t.ex.

5/2 = 2.5 men om man kör det i en modulus så går värdet 2, två hela gånger i värdet 5 men då återstår värdet 1, 5%2 = 1.

Efter att modulus har gjort sitt kommer det värdet som återstår att adderas på med värdet 1, att addera slutgiltiga värdet med värdet 1 är egentligen helt onödigt men vad det gör att att det slutgiltiga värdet kommer att vara 1 värde större. Varför jag använder av int max när jag hanterade modulus i funktionen är p.g.a. att ifall jag skulle sätta ett fast värde som t.ex. 1, 5 eller 6 så kommer jag bara kunna få ett begränsat antal utfall som ”slumpas” därför används int max värde för att kunna få ett ”obegränsat” antal utfall i funktionen. Vad detta kommer göra angående spelupplevelsen är att fienderna kommer inte skapas på samma plats, flera utfall desto fler olika platser kan fienderna skapas på.

Första bilden ni ser är när jag använder mig av int max i funktionen andra bilden använder jag mig av ett fast värde som 6 i funktionen.