Image collision when scaling

BlitzMax Forums/BlitzMax Beginners Area/Image collision when scaling

Hi!

I'm having a little problem trying to see if the mouse is over an image. The image is a PNG with alpha and I'd like pixel collisions (bounding box kind of defeats the purpose of the transparent PNG).

What I used is a 1x1 image placed at the mouse cursor and check collisions between that and the transparent image. This works just fine when I'm at 100% scale and upwards, but if I scale things down, there's no more collision detected.

While writing this post, I just thought that maybe that 1x1 image gets scaled to 0x0 or something and therefore no collision.

Is there any better way to detect those collisions, or should I try to keep that image at 1x1 scale at all times?

Would *really* help if you provided some code.
Anyway, I got the same issue but would fix it by doing a setscale before the colliderect:
Strict

Local x,y

Graphics 640,480

AutoMidHandle True	'image will rotate around it's center

Local image:TImage=LoadImage("max.png")

While Not KeyHit(KEY_ESCAPE)
	Cls
	ResetCollisions

' draw the first image at 5 times the size and on an arbitrary angle
	
	SetScale 0.4,0.4
	DrawImage image,200,200

' add the first image to the first collision layer at same postion, rotation 
' and scale as it has just been drawn

	CollideImage image,200,200,0,0,1

' move the other image relative to the mouse and rotate it continuously

	x=MouseX()
	y=MouseY()

	DrawRect x,y,1,1

' test the image at it's current rotation, scale and position with images
' that have been added to the first collision layer
     SetScale 1.0,1.0
	If CollideRect(x,y,1,1,1,0)

' reset scale and rotation states so our text is drawn correctly		

		DrawText "COLLISION!",20,20

	EndIf

	Flip
Wend


Thanks for the answer, but I kind of found the solution.

It is indeed my 1x1 pixel image that causes the problems. Some basic code should look like this:

SuperStrict

Graphics 800, 600

Global img1:TImage = LoadImage("leaf.png")
Global Pixel:TImage = LoadImage("Data\Gfx\dot2.png")

SetBlend ALPHABLEND

Global Scale:Float = 1.0

While Not (KeyHit(KEY_ESCAPE) Or AppTerminate())
	
	Cls
	
	If (KeyHit(KEY_SPACE) ) 
		If (Scale > 0.99) 
			Scale = 0.5
		Else
			Scale = 1.0
		EndIf
	EndIf
	
	SetScale Scale, Scale
	
	DrawImage img1,100,100
	
	If (ImagesCollide(img1 , 100 , 100 , 0 , Pixel , MouseX() , MouseY() , 0) ) 
		DrawText "Collision", 0, 0
	EndIf
	
	Flip
	
Wend
End


Sorry I can't provide the images, so if you're too lazy just forget it :)

I've found the fix though: ImagesCollide2!

Guess this was the purpose for that function. I can draw the first image scaled to any size, but keep my 1x1 image at 100% scale.

Back to coding now...

Hmmm! ImagesCollide2 does under the covers what my code does. Using ImagesCollide2 won't be as flexible in scope but, as I don't know your scope, I'll leave that for you.

I was using ImagesCollide before, so it was a matter of adding a "2" and changing parameters. Thanks anyway :o)

I've never used the collision system, has anyone done any tests with hundreds of sprites moving around, colliding with each other and/or a background?

Hmm, never thought f benchmarking it. I'm using it for a level editor, so I'm really not that concerned about it. I can tell you that it runs fine with around 1000 alpha sprites checking collision with that 1x1 image on a Q6600 (what I have at work).

I could optimize stuff by checking if they're on screen, then with bounding box, and then collision, but I don't feel the need right now.

I will probably try a benchmark soon though.

I made a simple little game and used imagescollide() for collision detection, it had maybe up to 30-50 objects about 100x100 pixels on the screen at the most, compared against the player object. Was fine on a 2GHz dual core iMac ATI X1600 128mb. I expect it could handle more than that but at some point it's going to become apparent that it is doing a lot of work to find a collision.