3 svar
150 visningar
Oskillz 15
Postad: 27 feb 2017 19:08

Kollisionshantering för skott mellan instanser av samma klass

Hej, jag håller på att göra ett spel i Monogame där jag har implementerat en Tank klass och har skapat 2 tanks. I tank klassen har jag en lista av objekt av en annan klass kallad Bullet, en bullet skapas när en tanks Shoot() metod anropas. Mitt problem är att jag inte riktigt vet hur jag ska kolla om en tank blir träffad av den andres skott. Jag har en arvshierarki där jag har GameObject och MovingGameObject som basklasser och i Game1 (main klassen) har jag skapat en lista av GameObjects där jag lägger in alla objekt som mina tanks ska kunna kollidera med. Kollisionshanteringen för dessa objekten ligger i tank klassen och ser ut såhär:

public void TankCollision()
{
foreach (GameObject g in Game1.instance.gameObjects)
{
if (this.hitBox.Intersects(g.getHitBox))
{
if (g is Ammo)
{
ammoCount += 1;
break;
}

else if (g is Health)
{
health += 1;
break;
}

}
}
}
}

Problemet här är att eftersom att jag skapar min lista med bullets i tank klassen så finns inte några bullets i listan med gameobjects som jag kan kolla kollision mot, dessutom så skulle man kunna träffas av sina egna skott med denna implementationen. 

En annan lösning som jag provade va att göra en metod som tog emot en instans av en annan tank och den såg ut såhär: (skapade en lista med bullets för den andra tanken i tank klassen vilket inte känns som en bra lösning)

public void TakingFire(Tank otherTank)
{
enemyBullets = otherTank.GetEnemyBulletList;

foreach (Bullet b in otherTank.GetEnemyBulletList)
{
if (this.hitBox.Intersects(b.getHitBox))
{
health--;
otherTank.GetEnemyBulletList.Remove(b);
break;
}
}
}

 

Detta blev dock lite för snurrigt för mig och det känns inte som att detta är någon bra lösning rent generellt. Så jag skulle gärna uppskatta om någon kunde vägleda mig in på något bra sätt att lösa det här problemet :).

PeterÅ 842
Postad: 27 feb 2017 19:19

Att rada upp många if then else är ingen snygg struktur på något program samt att det blir svårt att både överblicka och felsöka. Vad det gäller spel är händelseorienterad programmering en bättre lösning. När en händelse sker går du "rakt på rödbetan" utan att behöva testa if then else ....  Det är ett annorlunda sätt att tänka och kan vara svårt om man från början lärt sig en annan teknik. Vill du lära dig riktig spelprogrammering råder jag dig att studera ämnet från början och inte utgå från "traditionell" programmering. Jag förstår att det kräver tid och ansträngning men du kan bli en vass spelprogrammerare om du vill och orkar.

http://www.gamefromscratch.com/page/MonoGame-Tutorial-Series.aspx

Oskillz 15
Postad: 27 feb 2017 19:35

Okej, detta är egentligen en uppgift från en AI kurs som jag ville testa att implementera ett helt nytt spel till. Är dock medveten om att det är en del grundläggande grejer som jag borde bli bättre på, bland annat det jag skrev om här. Går nån av dom tutorials på den sidan du länkade igenom händelseorienterad programmering? Kollade med knde inte hitta något om det du sa.

Ingemar 517 – Fd. Medlem
Postad: 28 feb 2017 22:44

Enklast är väl att se om kulan finns tillräckligt nära motståndaren för att generera en träff. Då fungerar pythagoras sats. Gör en enkel cirkeltest. Jag skrev ett  kapitel för C++ om hur man kan göra, men det borde fungera lika bra till C#: https://sv.wikibooks.org/wiki/Programmera_spel_i_C%2B%2B_f%C3%B6r_nyb%C3%B6rjare/Exempel_p%C3%A5_collision_detect_i_spel#F.C3.B6rsta_varianten:_Cirkeltest


Svara Avbryt
Close