Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

1

05.09.2016, 14:30

Pixelaccurate Collision [2D] - Performance

Hallo Zusammen,

ich habe einen kleinen Sidescroller mit pixelgenauer Kollisionserkennung. Funktioniert tadellos.
Nun stellt sich mir aber die Frage ob das auch auf Dauer die richtige Lösung ist. Ich habe das mal mit 100 Objekten getestet, die von einander abprallen, sah soweit auch gut aus. Allerdings bin ich mir nicht sicher ob meine Methode das gelbe vom Ei ist.

Pseudocode:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Einlesen der Texturdaten für die Texturen (nach Namen)
Dictionary<String, Color[]> textureData = new Dictionary<string, Color[]>();
private Color[] LoadColorInfo(String imageName, Texture2D image)
{
    Color[] imageData = new Color[image.Width * image.Height];
    image.GetData(imageData);
    textureData.Add(imageName, imageData);
    return imageData;
}

//Kollisionsprüfung
bool PixelsCollide(BaseTexture otherTex, out Vector2 collidePoint)
{
    bool texturesCollide = TextureCollide(otherTex); //Check ob sich die Texturen berühren (Rectangle Collision)
    
    if(texturesCollide)
        if(NichtTransparenter Pixel trifft auf NichtTransparentenPixel) //Verwendung von textureData
            return true;
   
    //...
    return false;
}


Irgendwie gefällt mir das nicht, hier für etliche Texturen die Pixel in einer Schleife zu prüfen ob denn nicht etwas im Weg ist. Wenn ich nach Pixel Kollision suche, kommt meist ein zumindest sehr ähnlicher Ansatz.

Ich wüsste zwar nicht wie, aber gibt es keine bessere Methode? Oder sind meine Bedenken ohnehin unbegründet (weil auch Hobbyprojekt und so).
Wie lösen das andere Spiele? Wenn ich da zB. an Diablo denke wo gefühlte 1000 Geschosse durch die Luft fliegen?

2

05.09.2016, 14:50

Andere Spiele nutzen meist eher Boxen zur einfacheren Erkennung.
Außerdem könntest du (Octo-) Trees wie bei 3D nutzen.

Starcraft & Diablo II waren anscheinend Grid-based, d.h. du hast eine Tabelle und weißt damit auch, ob z.B. in einer Spalte überhaupt was sein kann und du diese prüfen musst, oder ob du diese Spalte auslassen und gleich zur nächsten gehen kannst.

Diese Links könnten dir weiterhelfen:
Indie Game-Dev Programmierer beim 2D MMORPG Pentaquin | Pentaquin Foren Vorstellung

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

05.09.2016, 15:37

Du benutzt ja schon eine Optimierung indem du zuerst per Rechteck auf Kollision prüfst. Allgemein stellt sich halt die Frage ob du wirklich pixelgenaue Kollision benötigst. Es müssen ja nicht immer Rechtecke oder Kreise sein, du kannst ja genau so gut Polygone nutzen. Ansonsten ist es wie JuKu schon sagst, du kannst deine Welt partitionieren. Entweder in eine Art Schachbrett, in einen Quadtree oder was auch immer. Dabei wird die Kollision dann im Prinzip in mehrere Schritte unterteilt. Welche Objekte liegen in einer Partition und können dadurch überhaupt miteinander kollidieren, und danach dann die genauere Kollision. Das könnte man natürlich auch noch weiter verfeinern wenn man dann möchte. Aber da sollte man sich halt die Frage stellen ob das am Ende wirklich einen Performancevorteil bringt oder ob man da an falscher Stelle optimiert oder nicht vielleicht sogar verschlechtert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

4

05.09.2016, 15:43

Danke für eure Antworten und Links, da komme ich schon weiter :)

Ob ich die pixelgenaue Erkennung brauchen werde bin ich mir noch nicht sicher, bei Hindernissen wie Bäume oder Felsen eher nicht. Aber lieber etwas haben und dann nicht brauchen als wenn man dann an "unsichtbaren Ecken" hängen bleibt :D

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

05.09.2016, 15:51

Eine bessere Lösung wäre: keine Pixelgenaue-Kollision verwenden. Was machst du bei Animationen? Dabei würde sich das Kollisionsverhalten verändern und Charaktere würden sich von der Wand wegbewegen, auch obwohl der Spieler sich nicht bewegt. Weiterhin funktioniert es höchstens, wenn als Perspektive exakt von der Seite oder von oben auf das Spielgeschehen geschaut wird. Alles dazwischen würde nicht funktionieren.
Weiterhin würde sich das Spiel unterschiedlich verhalten, wenn man für unterschiedliche Auflösungen oder Qualitätseinstellungen unterschiedliche Grafiken verwendet. Weiterhin würden Rotationen noch immer nicht berücksichtigt werden.

Deshalb werden Objekte in anderen Spielen über Polygone angenähert, bspw. Rechtecke oder Kreise. Dabei wird aber nicht unbedingt die Grafik angenähert, sondern die Form des dargestellten Objekts. Dabei geht es nichtmal um die Performance, sondern um eine saubere Repräsentation der Objekte, die im Spielenthalten sind.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige