Wie kann ich feststellen, wie viel von einer „Rubbelkarte“ aufgedeckt wurde?

7

Ich habe einen Rubbelkarteneffekt entwickelt. Ich arbeite jetzt am Belohnungssystem. Meine Frage ist also, wie ich fortfahren und eine Logik implementieren soll, die mich wissen lässt, dass das Objekt hinter der Rubbelkarte jetzt sichtbar ist.

Geben Sie hier die Bildbeschreibung ein

idurvesh
quelle
Hängt davon ab, was Sie als sichtbar definieren. Technisch vollständig sichtbar würde bedeuten, dass sich kein einziges nicht transparentes Pixel von der Rubbelkarte zum Objekt überlappt, aber das wäre irgendwie albern. Ich vermute, Sie möchten, dass es als sichtbar definiert wird, wenn sich nur sehr wenige Pixel vor dem Objekt befinden, oder?
Superdoggy

Antworten:

4

Ich stimme der Antwort von Superdoggy zu, aber ich glaube, es gibt einen besseren Weg, dies zu tun. Wenn Sie den Bereich der Rubbelkarten-Kollisionsbox kennen, den Sie anzeigen möchten, können Sie Folgendes tun: Ermitteln Sie die Gesamtpixelmenge des Objekts (Breite * Höhe). Wenn die Maus gedrückt wird: Überprüfen Sie die Pixel um die Maus in einem Radius Ihrer Wahl. Wenn sie sich im Bereich des Objekts befinden und das Pixel derzeit undurchsichtig ist, setzen Sie sie auf transparent und ++ auf einen Zähler für "aufgedeckte Pixel". Um zu überprüfen, wie viel von der Rubbelkarte derzeit sichtbar ist, teilen Sie einfach "Aufgedeckte Pixel" durch "Gesamtpixel".

Leider weiß ich nicht, wie man in Unity programmiert, also hier ein Pseudocode!

    Initializer:
      set object = {x1, y1, x2, y2}
      set revelead_pixels = 0
      set radius = (number greater than 0)
      set bool object_pixels[object.x2 - object.x1][object.y2 - object.y1] = 1
      set percent_visible = (percentage of object to be visible before coninuing, 0 to 1)

    On mouse press:
      --mouse.x and mouse.y are coordinates of mouse

      FOR x, radius * 2 DO


        FOR y, radius * 2 DO

          --only run if x and y are within circle around mouse
          IF ((x - radius) * (y - radius) > radius) THEN 
            continue 
          ENDIF

          --if mouse + 'for variables' is within object
          IF ((x + mouse.x >= object.x1) AND (x + mouse.x < object.x2) AND (y + mouse.y >= object.y1) AND (y + mouse.y < object.y2)) THEN

            --if the current pixel is set to 1 (or opaque)
            IF (object_pixels[x + mouse.x - object.x1][y + mouse.y - object.y1] == 1) THEN
              object_pixels[x + mouse.x][y + mouse.y] = 0
              revealed_pixels += 1
            ENDIF

          ENDIF

        ENDFOR

      ENDFOR


      IF revealed_pixels >= ((object.x2 - object.x1) * (object.y2 - object.y1)) / percent_visible THEN
        --This statement runs if over preferred amount of pixels are visible
      END
NickM13
quelle
danke mch für die breite antwort, ich benutze einen ähnlichen ansatz wie du, ich habe 6 collider auf beiden seiten und in der mitte von img eingerichtet, wenn img enthüllt wird, dass der collider auch ausgelöst wird, ASA alle collider werden ausgelöst, belohnt wird zugewiesen.
Idurvesh
2

Ich würde alle Alpha-Werte der Rubbelkartenpixel addieren, die die Objektpixel überlappen. Wenn dann "A" <ein Wert ist, können Sie davon ausgehen, dass der Benutzer genügend Pixel gelöscht hat, um das Objekt sehen zu können.

Ein wirklich gutes Tutorial zur Kollisionserkennung pro Pixel in C # finden Sie hier: Linkylink . Es ist für C # mit XNA gemacht, aber das Konzept ist nicht allzu schwer an C # mit Unity anzupassen, würde ich annehmen. Ändern Sie den Code einfach ein wenig, um die Alpha-Werte kollidierender Pixel zu zählen, anstatt nur nach Kollisionen zu suchen.

Hoffe das hilft!

Superdoggy
quelle
danke für den Link, es ist sehr hilfreich ... Ich werde es auf jeden Fall versuchen, muss es aber derzeit schnell fertigstellen, also habe ich den Collider-Ansatz gewählt, dh 6 Collider auf beiden Seiten und in der Mitte von img eingerichtet und wenn img enthüllt wird, dass der Collider ausgelöst wird Auch ASA alle Collider wird ausgelöst, Belohnung wird zugewiesen.
Idurvesh