Hit Detection



  • Hallo,
    ich habe bei einem kleinen Spiel die zwei Instanzen Spieldatenverarbeitung und grafische Darstellung getrennt.
    Das läuft darauf hinaus, dass erstere sämtliche Variablen verwaltet und verarbeitet und letztere dann durch eine Referenz kommt.

    Allerdings brauche ich eine "Hit Detection", also die Prüfung, ob ein Gegner von einem Angriff getroffen wird.
    Die erste Möglichkeit dafür, die mir einfällt, ist, den Alphakanal der Pixel des Gegnerbildes zu prüfen (wenn ein Pixel nicht 100% transparent ist, ist das eine Stelle, wo der Gegner getroffen wird).
    Das Problem wäre dabei offensichtlich: Ich müsste die Trennung der beiden Instanzen aufheben oder sie zumindestens teilweise vermischen.
    Gibt es deswegen eine schönere Lösung?



  • Die Sektion zur Darstellung bietet eine Funktion an, mit welcher man bestimmte Pixel abragen kann. Und die Spielelogik-Sektion ruft diese auf und verarbeitet die Daten.



  • Dabei wäre das Problem, dass ich aus der Informations-/Daten-Instanz heraus müsste.
    Mein Aufbau sieht ungefähr so aus:

    Main
         |
         V
    Game_Manager
        _|_
       /   \
       |   |
       V   V
    Daten  Grafik
    

    Entweder bräuchte ich dann noch eine Referenz von Dateninstanz zu Grafikinstanz oder ich gehe über den Game_Manager.

    Deine Lösung gefällt mir auf jeden Fall besser als meine, aber 100% glücklich bin ich damit noch nicht. Schonmal danke, falls keine besseren Lösungen mehr kommen, werd ichs vermutlich so machen 🙂



  • Achtung: Persönliche Meinung. Zu deinem konkreten Problem geht's unter dem Strich.

    Treib Daten und Grafiktrennung lieber nicht ins Perverse. Diese Trennung ist dafür gedacht, leicht Änderungen oder komplettes Austauschen an der Verarbeitung des einen zu ermöglichen ohne das andere zu beeinflussen.

    Da das in Spielen so gut wie nie nötig ist, braucht man keine 100% Trennung zwischen Logik und Grafik.

    Deine Logik sollte zwar nach wie vor nicht von der Grafik abhängen (d.h. extrem gesagt sollte eine Funktion die dir Schaden an Gegner berechnet keine anderen Werte ausspucken weil du von OpenGL auf DirectX wechselst), aber aus Komfortabilitäts und Performancegründen (alle Daten ständig mit Zeigern und Kopien hin und herreichen anstatt direkt drauf zuzugreifen geht irgendwann stark auf die Performance) kannst du ruhig Einschnitte machen und das beide zusammen packen.

    Beispielsweise finde ich es gar nicht schlimm, sowas wie ne "Entity" Basisklasse hat die sich sowohl selbst rendern kann (bzw. von ner übergebenen Grafikschnittstelle "render mich!" aufruft oder ähnliches) als auch logische Informationen über sich beinhaltet (was auch immer du halt brauchst). Dadurch gibt es immernoch so etwas wie eine "soft-trennung" zwischen Grafik und Logik , trotzdem hast du ales schön in einzelnen, kleinen und logischen Einheiten. Mit gutem Design kannst du auch da die Grafikengine von OpenGL auf Direct3D umschalten, ohne dass du irgendwas außerhalb der Grafik-Engine ändern musst.

    -----------------------------------------------------------------------------

    Mit deinem Problem hat das trotzdem recht wenig zu tun, da Kollisionserkennung normalerweise sowieso 100% auf "data-only" Basis läuft. Google doch einfach mal nach "Kollisionserkennung", "Collision Detection" etc.

    Je nach dem was du genau brauchst könnte es recht trivial sein und auf 4 if-abfragen hinauslaufen oder du schaust dir eben mal das Separating Axis Theorem an. In jedem Fall ist so ein einfall wie Alpha-Werte prüfen richtig böse 🤡



  • Ich mag die Trennung eigentlich und mit Ausnahme von eben diesem Problem hatte ich sonst nie welche damit.

    Die meisten Funde, wenn ich so suche, sind aber für die Abfrage Polygon-Polygon oder ähnliches. Mein Angriff liegt aber nur als Punkt vor, weswegen ich höchstens Punkt-Polygon benutzen könnte.



  • Dann such doch nach "Point in Polygon" oder "Punkt in Polygon".

    Ich weiss nicht was du erwartest, aber hier hat keiner Zeit (bzw. Lust) ein Tutorial zum dem Thema zu verfassen. Wir können dir alle nur sagen wonach du suchen musst, und wenn du ein spezifisches Problem mit einem Algorithmus bzw. dessen Teil hast, dann kannst du zurückkommen und wir können dir damit vielleicht helfen.



  • Was ich erwarte sind Beiträge wie der von EOutOfResources 🙂
    Also eben Lösungsansätze bzw. -ideen.
    Auch wenn es passende Algorithmen oder Namen für dieses Problem gibt, wie scheinbar "Point in Polygon", dann helft ihr mir damit.



  • Wie wärs mit boost::geometry ?
    Da kann man die Abfrage mit einem C++-Befehl durchführen.


Log in to reply