SpriteCollisionAccuracy sets the level of accuracy the sprite collision engine should use during Pixel Perfect collision calculations. SpriteCollisionAccuracy defaults to 1.0 which represents a 1 to 1 comparison (100% in other words). Generally speaking that's overkill. %50 -> %75 is good trade off. Often you can go even lower and barely notice it.
FACTS:
* Collision Accuracy affects sprite collisions that use Pixel Perfect collision mode. See SpriteCollisionMode * Note: Since sprites can be rotated and scaled, you'll possibly loose some pixel accuracy through linear interpolation. So if your game requires a lot of scaling down for example, then you might want to bump up the collision accuracy up in those cases. It's always going to be trade off between speed and accuracy though. So experiment and see what works best in your game.
Mini Tutorial:
This example builds some images, setups some sprites and
MakeBitmapFont 1,$ffffff ; ==================================== ; Part 1 - Create two coloured images ; ==================================== Cls RGB(0,0,0) For lp=0 To 20 x=Rnd(128) y=Rnd(128) Select Rnd(1) Case 0 BoxC x,y,x+2,y+2,true,RndRGB() Case 1 CircleC x,y,10,true,RndRGB() EndSelect Next GetImage 1,0,0,128,128 PrepareFXImage 1 Cls RGB(0,155,100) CircleC 0,32,16,true,RGB(0,0,0) GetImage 2,0,0,64,64 PrepareFXImage 2 ; ============================= ; Part 2- Create some sprites ; ============================= ; Create Sprite 1, and assign it image 1 CreateSprite 1 SpriteImage 1,1 CenterSpriteHandle 1 ; Set Sprites Drawing mode to rotated SpriteDrawMode 1,2 ; Rotate this sprite 45 degree RotateSprite 1,45 ; Enable Collision for Sprite #1 SpriteCollision 1,on ; Set Sprite #1 to collision Class %0001 SpriteCollisionClass 1,%0001 ; Set Sprite #1 to collision mode to 6 (Pixel perfect) SpriteCollisionMode 1,6 ; ===================================================== ; Create a bunch of sprites to check collision against ; ===================================================== For Sprites=2 To 50 CreateSprite Sprites SpriteImage Sprites,2 CenterSpriteHandle Sprites x=Rnd(GetScreenWidth()-32) y=Rnd(GetScreenHeight()-32) PositionSprite sprites,x,y ; Set the sprites draw mode/rotation and scale SpriteDrawMode Sprites,2 RotateSprite Sprites,Rnd(360) ScaleSprite Sprites,0.5+(Rnd(100)/100.0) ; Enable Collision for this sprite SpriteCollision Sprites,on ; Set sprite to Collision Class %0010 SpriteCollisionClass Sprites,%0010 ; Set sprite to Collision mode 6 (pixel perfect) SpriteCollisionMode Sprites,6 Next ; ============================= ; Part 3- The Main Loop ; ============================= ; Start a DO/Loop Do ; Clear the screen Cls RGB(80,80,80) ; turn all the sprites For Sprites=1 To 50 SpriteDrawMode Sprites,2 If sprites>1 Then TurnSprite Sprites,0.15 SpriteCollisionDebug Sprites,Debugflag Next ; Position the Sprite 1 at the mouses position PositionSprite 1,MouseX(),MouseY() ; Check if sprite #1 hit another sprite ; of this sprite class ThisSprite=SpriteHit(1,GetFirstSprite(),%0010) ; If there was impact, then we loop through and ; find any other sprites we might have also hit While ThisSprite>0 ; set sprite to rotated + COlour Flash mode SpriteDrawMode ThisSprite,2+4096 ; Check if this sprite hit another sprite ? NextSprite=GetNextSprite(ThisSprite) ThisSprite=SpriteHit(1,NextSprite,%0010) EndWhile If SpaceKey() Then DebugFlag=1-debugFlag ; Draw All of the sprites DrawAllSprites ; Display a message SetCursor 0,0 Print "Checking For Pixel Perfect sprite Collisions" Print "Collision Accuracy:"+Str$(GetSpriteCollisionAccuracy()) If LeftKey() And GetSpriteCollisionAccuracy()>0.1 SpriteCollisionAccuracy GetSpriteCollisionAccuracy()-0.1 FlushKeys EndIf If RightKey() And GetSpriteCollisionAccuracy()<10 SpriteCollisionAccuracy GetSpriteCollisionAccuracy()+0.1 FlushKeys EndIf ; Draw the screen Sync ; Loop back to the DO statement Loop |
|