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.
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.
Antworten:
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
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!