7
\$\begingroup\$

I have developed scratch card effect.I am now working on reward system, so my question is how will I go on and implement logic which will let me know that the object behind scratch card is now visible??

enter image description here

\$\endgroup\$
1
  • \$\begingroup\$ Depends what you define visible as. Technically fully visible would mean that there isn't a single nontransparent pixel overlapping from the scratch card to the object, but that would be kind of silly. I'm guessing you want it to be defined as visible when there are very few pixels in front of the object, right? \$\endgroup\$
    – Superdoggy
    Jun 8 '15 at 15:03
4
\$\begingroup\$

I agree with Superdoggy's answer, but I believe there is a better way to go about this. If you know the area of the scratch card collision box you are wanting to reveal, you could go about it by: Get the Total Pixel amount of the object(width*height). When the mouse is pressed: check the pixels around the mouse in a radius of your choice, and if it is within the area of the object, and the pixel is currently opaque, set to transparent and ++ a 'revealed pixel' counter. To check how much of the scratch card is currently visible, just divide 'Revealed Pixels' by 'Total Pixels.'

Unfortunately I don't know how to program in Unity, so here's some pseudo code!

    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
\$\endgroup\$
1
  • \$\begingroup\$ thanks mch for broad answer, I kind of use similiar approach like you, I set up 6 colliders on both side and middle of img , whn img get reveal the collider gets trigger too ,ASA all collider gets trigger ,Reward gets assign. \$\endgroup\$
    – idurvesh
    Jun 8 '15 at 23:02
2
\$\begingroup\$

I would add up all of the alpha values of the scratch card pixels that are overlapping the object pixels. Then if "A" < some value you can assume that the user has cleared enough pixels that they can see the object.

You can find a really good tutorial on per-pixel collision detection in C# here: Linkylink. It's made for C# with XNA, but the concept isn't too hard to adapt to C# with Unity, I would assume. Simply just modify the code a bit to count alpha values of colliding pixels instead of just checking for collision.

Hope this helps!

\$\endgroup\$
1
  • \$\begingroup\$ thanks for the link,its very helpful...I will definitly try it but currently need to complete it quickly so went with collider approach i.e., set up 6 colliders on both side and middle of img and whn img get reveal the collider gets trigger too ,ASA all collider gets trigger ,Reward gets assign. \$\endgroup\$
    – idurvesh
    Jun 8 '15 at 23:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.