ClosestSpriteToPoint
SpriteIndex = ClosestSpriteToPoint(PointX, PointY, FirstSpriteIndex, ClassMask, Mode)
 
Parameters:

    PointX = The test points X coordinate
    PointY = The test points Y coordinate
    FirstSpriteIndex = The sprite to being checking from
    ClassMask = The Collision Class Mask
    Mode = The type of closest sprite to local (closest Axis, Edge or Collision Edge)
Returns:

    SpriteIndex = The closest Sprite to the given point
 

     The ClosestSpriteToPoint function returns the closest sprite to a given point. The function has various modes to improve your guery. So you can locate the closest Sprite Axis, the collision Sprite Edge and the closest collision edge.


Mode Values

      0 = Find the closest Sprite Axis
      1 = Find the closest Sprite Edge
      2 = Find the closest Sprite Collision Edge




FACTS:


      * ClosestSpriteToPoint returns the closest point on a sprite through the GetIntersectX#/GetIntersectY# () functions.

      * ClosestSpriteToPoint returns the closest points normal through the GetNormalX#/GetNormalY#() functions.

      * ClosestSpriteToPoint can't return the closed pixel, it returns the closest point on the sprites bounding rect.




Mini Tutorial:


      This example creates a random image, then creates 10 randomly positioned sprites on the screen using this image.

      The main loop rotates the sprites, while detecting which what sprites are the closest to the mouse pointer. To show the difference, It tests using all three modes. What you should notice is that depending upon the layout of the sprites, all three modes can be give very different results.


  
; Limit this program to 60 frames per second or less
  SetFPS 60
  
; Make a Blue image, with circles on it
  Cls RGB(0,0,255)
  MyImage=NewFXImage(100,100)
  For lp =0 To 100
     CircleC Rnd(100),Rnd(100),Rnd(5),1,RndRGB()
  Next
  GetImage MyImage,0,0,100,100
  
  
; Make 10 sprites
  For spr=1 To 10
     
   ; Create the sprite
     CreateSprite Spr
     
   ; position this sprite randomly on the screen
     x=Rnd(GetScreenWidth())
     y=Rnd(GetScreenHeight())
     PositionSpriteXYZ Spr,x,y,100
     
   ; assign MyImage to this sprite.
     SpriteImage Spr,MyImage
     
   ; Center Sprite Handles on it's image
     CenterSpriteHandle spr
     
   ; Turn collision ON
     SpriteCollision spr,on
     
   ; Set sprite collision to Circle
     SpriteCollisionMode Spr,2
     
   ; Set the collision mode Radius to 30
     SpriteCollisionRadius Spr,40
     
   ; activate Sprites Debug Mode
   ; so we can see the Sprites region
     SpriteCollisionDebug Spr,true
  Next
  
  
; Set up a camera to handle some the draw order for us
  MyCamera=NewCamera()
  
  
  
  Do
     
   ; Activate Capture to Scene mode
     CaptureToScene
     
   ; Clear the scene buffer
     ClsScene
     
     
   ; Check if the mouse  is over a sprite
     mx#=MouseX()
     my#=MouseY()
     
   ; start for/next loop from 1 to 10
     For spr=1 To 10
        If MouseButton()=false
         ; Turn this sprite
           TurnSprite spr,spr*0.33
        EndIf
      ; Set it's draw mode to just rotated
        SpriteDrawMode Spr,2
     Next
     
     
     
   ; =====================================================
   ; Calculate the Closest Sprite AXIS to the mouse pointer
   ; =====================================================
     
   ; Mode 0 - Find the Closest Sprite Axis
   ; The Closest AXIS sprite will be coloured RED
     ClosestSprite=ClosestSpriteToPoint(Mx#,My#,GetFirstSprite(),1,0)
     
     If ClosestSprite>0
      ; set the sprite colour flash value RED.
        SpriteFlashColour CLosestSprite, RGB(255,0,0)
      ; Set it's draw mode to just rotated + Colour Flash
        SpriteDrawMode ClosestSprite,2+1024
        x2#=GetSpriteX(ClosestSprite)
        y2#=GetSpriteY(ClosestSprite)
        
        Line mx#,my#,x2#,y2#
        CircleC x2#,y2#,5,1,RndRGB()
     EndIf
     
     
     
   ; Mode 1 - Find the Closest Sprite EDGE
   ; The Closest EDGE sprite will be coloured PURPLE
     ClosestSprite=ClosestSpriteToPoint(Mx#,My#,GetFirstSprite(),1,1)
     
     If ClosestSprite>0
      ; set the sprite colour flash value PRPLE.
        SpriteFlashColour CLosestSprite, RGB(255,0,255)
      ; Set it's draw mode to just rotated + Colour Flash
        SpriteDrawMode ClosestSprite,2+1024
        x2#=GetIntersectX#(0)
        y2#=GetIntersectY#(0)
        
        Line mx#,my#,x2#,y2#
        Circle x2#,y2#,5,0
     EndIf
     
     
     
     
   ; Mode 2 - Find the Closest Sprites Collision EDGE
   ; The Closest sprites Collision EDGE will be coloured GREEn
     ClosestSprite=ClosestSpriteToPoint(Mx#,My#,GetFirstSprite(),1,2)
     
     If ClosestSprite>0
      ; set the sprite colour flash value GREEN.
        SpriteFlashColour CLosestSprite, RGB(0,255,0)
      ; Set it's draw mode to just rotated + Colour Flash
        SpriteDrawMode ClosestSprite,2+1024
        x2#=GetIntersectX#(0)
        y2#=GetIntersectY#(0)
        
        Line mx#,my#,x2#,y2#
        Circle x2#,y2#,10,1
     EndIf
     
     
     
   ; draw all the sprites to the scene buffer
     DrawAllSprites
     
   ; get the camera to process and draw the scene buffer elements
   ; this takes care of the scene depth for us
     DrawCamera MyCamera
     
     Sync
  Loop
  
  





 
Related Info: CircleHitSprite | QuadHitSprite | RectHitSprite | ShapeHitSprite | SpriteCollisionMode | SpriteHit :
 


(c) Copyright 2002 - 2024 - Kevin Picone - PlayBASIC.com