Collision help, please

BlitzMax Forums/BlitzMax Beginners Area/Collision help, please

MadMax(Posted 2007) [#1]
I wonder if someone would be so kind as to tell me what code to add to this small program, so I can delete the rectangle I hit with my Right_Mouse_Button.

SetGraphicsDriver GLMax2DDriver()

Global number_of_Drects = 10

Type rect
  Field x#,y#,size#
Field rojo#,verde#,azul#
  'Global rectnumber=0
  Global dadas:TList
  Method draw()
	SetColor(rojo,verde,azul)
     DrawRect x,y,size,size
  End Method
Method move()
x=x+(size/8)
If x > 800
x=0
EndIf
End Method

  Method Compare(other:Object)
    If rect(other).size < size Return -1
    Return 1
  End Method

  Function create(cm)
     If dadas = Null dadas = CreateList()
     socas:rect = New rect
If cm=1
	socas.x = MouseX() ; socas.y = MouseY()
Else
     socas.x = Rand(5,795) ; socas.y = Rand(5,595)
EndIf
	 socas.size = Rand(4,20)
	 socas.rojo = Rand(80,255) ; socas.verde = Rand(80,255) ; socas.azul = Rand(80,255)
     dadas.addlast(socas)
 
  End Function

End Type

For n = 1 To number_of_Drects
    rect.create(0)
Next

SortList(rect.dadas,False)

'ClearList(rect.dadas)

a=CountList(rect.dadas)

Graphics 800,600



Repeat

Cls

  For t:rect = EachIn rect.dadas

     t.draw
	 t.move

  Next


DrawText a,20,80

Flip

If MouseHit(1)
rect.create(1)
SortList(rect.dadas,False)
a=CountList(rect.dadas)
EndIf

If KeyHit(key_space)
ClearList(rect.dadas)
a=CountList(rect.dadas)
EndIf

Until KeyHit(key_escape) Or AppTerminate()



Excuse my ugly coding, but I'm trying to understand Bmax.


amonite(Posted 2007) [#2]
Hi Madmax,

What you could do is hide the mouse pointer and draw your own mouse pointer then check for collisions between it and your flying squares. (Also you could choose not to hide the mouse pointer and draw a 1*1 pixel image at mouse coordinates then again check for collisions).


MadMax(Posted 2007) [#3]
Thanks for your answer Benyboy, another thing how do I get the colour from a pixel on the screen (opposite of plot)?


amonite(Posted 2007) [#4]
I don't know how to get the color from a pixel, but what you could do maybe is have less different colors at creation then keep track of them in a field and test with a condition if it matches the color you want ?


TomToad(Posted 2007) [#5]
First of all, if you're testing collisions only with rectangles, you don't need to plot anything extra on the screen. Just check the MouseX() and MouseY() coordinates with the bounding points of the rectangle.
'Function to see if a given point is within any rectangles
'MX and MY are the mouse x and y coordinates
Function CheckRectCollision:rect(MX:int, MY:int)
  If rect.dadas
     For Local CurrentRect:rect = EachIn rect.dadas
      If MX > CurrentRect.x and MX < CurrentRect.x + CurrentRect.size ..
        and MY > CurrentRect.y and MY < CurrentRect.y + CurrentRect.size
          Return CurrentRect
      End If
    Next
  End If
  Return Null
End Function

'You could call this function like this
Local TestRect:rect = CheckRectCollision(Mousex(),MouseY())
If TestRect Then ProcessRect(TestRect) 'Some function to deal with the rectangle collided with

As for getting the color of a point on screen, you need to first transfer the part of the screen you wish to test to a pixmap, and test that.
Color:Int = ReadPixel(GrabPixmap(X,Y,1,1),0,0)
Blue = Color & $FF
Color = Color shr 8
Green = Color & $FF
Color = Color shr 8
Red = Color & $FF
Color = Color shr 8
Alpha = Color & $FF



MadMax(Posted 2007) [#6]
Thanks to all for your answers.