Vecka tre: Enemy Death

Denna vecka har jag arbetat på att göra Enemy Death, det vill säga döda spelarens motståndare. Detta har gjorts på grund av att alla fiender ska dö om spelaren träffar dem med sina projektiler.

Jag började först med att fundera ut den bästa lösningen till att göra detta. Jag var tvungen att tänka hur jag skulle göra uppgiften, vad som ska hända efter att spelarens projektiler och fiender kolliderar med varandra samt titta på hur vi har byggt upp vårt system till dagsläget och leta efter ändringar som skulle behövas göra.

Vad jag hittade som problem var att vi hade lagt alla entiteter till vårt spel i en och samma lista, till och med spelaren. Detta var väldigt opraktiskt då vårat spel ska ha ”bullet hell” i sig, vilket är att skärmen kommer att bli fylld av fienders projektiler. Om allt skulle vara i en och samma lista så skulle programmet loopas igenom ett antal onödiga gånger. Ett bra exempel på detta är att i en boss fight så skjuter bossen ut ca 50 skott, medan spelaren skjuter nio skott. I våran förra lösning så skulle vi ha en lista som innehöll spelaren, spelarens skott, bossen samt bossens skott. Denna lista skulle kunna innehålla 61 entiteter, var av varje entitet skulle behövas checkas med vilken enhet de är samt om de kolliderar med något. Denna lösning skulle kräva ca 3 600 loopningar, medan våran nuvarande lösning kräver endast 60 loopningar och kräver inte heller att det måste checkas med vilken enhet dem är. Så nu ligger alla entiteter i listor som innehåller en vissa typ av entiteter i sig, t.ex. spelarens projektiler är i en lista medan projektiler ifrån alla motståndare samt bossar ligger i en annan.

Jag har försökt att lösa denna uppgift genom att i funktionen ”Update” i klassen ”Entity Manager” lägga till en kollisions check i loopen som uppdaterar fiender. Kollisions checken jämför fiendens ”hitbox” med spelarens projektilers ”hitbox”. Om detta är sant så förstörs både fienden och projektilen, p.g.a. att projektilen ska inte fortsätta och träffa andra fiender och alla fiender tål bara ett skott. Efter att de båda objekten har förstörts så skapas ett ”Enemy Death” objekt som är till för att endast visa fienders dödsanimation. Allt detta kommer att återanvändas till t.ex. att spelaren blir träffad, tar upp en power up, mm. Jag har dock inte ännu fått något resultat ifrån min lösning på grund av att kollisions checken inte returnerar rätt svar. Vi kan bara anta att detta fungerar tills att kollisions checken har blivit fixad.

På grund av att jag inte kan ta screen shots på vad som händer vid träff så har jag skapat bilden nedan för att ge en illustration på vad som ska hända.

Vecka3

Vecka tre: Enemy Death

En reaktion på ”Vecka tre: Enemy Death

  1. Här kommer veckans kommentar, jag hoppas den är till hjälp eller åtminstone inspirerar!

    Att ha flera managers är som du säger nyttigt för att sänka antalet kollisionscheckar och resultat. Du beskriver även bra nummermässigt så man förstår vilken massiv skillnad det blir med er lösning. Det jag ställer mig lite frågande till är att det även finns andra i gruppen som verkar ha jobbat med denna artefakt, om man ser till andra bloggar, men man ser inte dem nämnda i texten.Givetvis får man jobba ihop, men jag skulle gärna se processen eller debatten ni hade till hur ni tillsammans löste problemet: Var det så att du ställde frågor om hur du skulle göra, eller var det du som ledde när du skapade lösningen? Både är viktiga sätt att ta reda på just hur man själv kommer till samma lösningar som ni gjorde och fungerar som hjälp för de som läser bloggen.

    En annan fråga jag fungerar över är att ni skapar nya objekt när en fiende dör. Går det inte bara att ändra fiendespriten till en död sprite innan den raderas, och utföra sakerna som en död fiende ska på samma gång, såsom att tappa powerups eller liknande i fiendeobjektet? Det är inte fel att göra som ni gör, jag funderar bara på om det var för att exempelvis minska på kollisionscheckar som ni skapar ett nytt objekt, utan kollisioner, istället för att exempelvis ha en bool i fiendeklassen som sätter fienden som ”död” och att en if-sats som kollar efter densamma används innan kollisioner prövas.

    Gilla

Lämna en kommentar