Returned object array and Collide image

BlitzMax Forums/BlitzMax Beginners Area/Returned object array and Collide image

Sky009(Posted 2005) [#1]
Hello!

I have a problem with CollideImage and the return object array.

This code in the Method Test_Collision2() throws
an error:

Local temp_ball:Tball
temp_ball = Tball(anz_collisions[x])

I think it wrong Casting.
How can i do it right?

Help welcomed


Greetings

sky009





Strict

Const C_WIDTH = 1024
Const C_HEIGHT = 768

Const C_ANZBALL = 100
Const C_ANZBALL_TYP = 1

Graphics C_WIDTH, C_HEIGHT, 32


Local current:Int, old_FPS_time:Int, FPS:Int, CurrentFPS:Int


Type Tball

	Field ball:timage
	Field x:Float
	Field y:Float
	Field dx:Float
  	Field dy:Float
  	Field sp:Float

	Method New()
		ball = temp_image
		x = Rand(C_WIDTH - 24)
		y = Rand(C_HEIGHT - 24)
  		dx = Rndfloat()      'Float random zwischen 0 und ...
  		dy = Rndfloat()      'hans.f=Random(8)/10+0.4 
  		sp = Rndfloat() * 2 + 0.3
 	End Method

	Method Move()
		x = x + dx * sp
		y = y + dy * sp
	End Method

	Method Test_Screen_Limit()
		If y < 0 Then dy = 1 
    		If y > C_HEIGHT - 24 Then dy = -1
    		If x < 0 Then dx = 1
    		If x > C_WIDTH - 24 Then dx = -1
    	End Method

	Method Test_Collision()
		
		For Local temp_ball:Tball = EachIn ballList	
	
			If temp_ball <> Self

				ResetCollisions
				CollideImage temp_ball.ball, temp_ball.x, temp_ball.y, 0, 0, 1
			
				If CollideImage(ball, x, y, 0, 1, 0)
	        
	   				If x <  temp_ball.x 
   	 		      		dx = -1
   		    	      		temp_ball.dx = 1
      		  		EndIf
     	    	  		If x > temp_ball.x
         		 		dx = 1
             				temp_ball.dx = -1
           			EndIf
             			If y < temp_ball.y
                 			dy = - 1
             		  		temp_ball.dy = 1
             			EndIf
             			If y > temp_ball.y
                 			dy = 1
                 			temp_ball.dy = -1
             			EndIf
		    		EndIf
			EndIf
		Next
			
	End Method
	
	Method Test_Collision2()
		
		Local anz_collisions:Object[]
		
		ResetCollisions
		For Local temp_ball:Tball = EachIn ballList	
	
			If temp_ball <> Self
				'Write to Writemask
     			CollideImage temp_ball.ball, temp_ball.x, temp_ball.y, 0, 0, 1
			EndIf
		Next
		
		'Test Collision	
		anz_collisions = CollideImage(ball, x, y, 0, 1, 0)
	        
		If anz_collisions
		
			For Local x = 0 To Len(anz_collisions) -1
			
				Local temp_ball:Tball
				temp_ball = Tball(anz_collisions[x])
									 
				
	   	    			If x <  temp_ball.x 
    			      		dx = -1
         	      		temp_ball.dx = 1
      		  		EndIf
     	      		If x > temp_ball.x
         	     		dx = 1
             				temp_ball.dx = -1
           	  		EndIf
               		If y < temp_ball.y
                   		dy = - 1
                   		temp_ball.dy = 1
               		EndIf
               		If y > temp_ball.y
                   		dy = 1
                   		temp_ball.dy = -1
               		EndIf
		    					
			Next
		EndIf
					
	End Method

End Type



' Create Ball Image
SetClsColor 0, 0, 0
SetMaskColor 0, 0, 0

SetColor 0, 0, 255
DrawOval	100,100, 24,24
Global temp_image:timage = CreateImage(24, 24) 
GrabImage temp_image, 100, 100

' Create Ball List
Global ballList:TList = CreateList()
Local x:Int


For x = 1 To C_ANZBALL

	Local temp_ball:Tball = New Tball
	ListAddLast ballList, temp_ball 
Next 



SetColor 255, 255, 255

While Not KeyDown(KEY_ESCAPE)

	Cls 

	For Local ball:Tball = EachIn ballList

		DrawImage ball.ball, ball.x, ball.y	
		ball.Move
		ball.Test_Screen_Limit
		ball.Test_Collision2

	Next 

	
	'Test FPS
	current = MilliSecs() 
  	If current >= old_fps_time + 1000 
    		old_fps_time = current 
    		FPS = CurrentFPS 
    		CurrentFPS = 1 
  	Else 
    		CurrentFPS = CurrentFPS + 1 
  	EndIf 
	
	DrawText "Balls: " + C_ANZBALL +"  FPS: " + FPS, 100, 100
	

	Flip
	FlushMem

Wend




marksibly(Posted 2005) [#2]
Hi,

When you use CollideImage to write to a collision layer, you must provide an object to be returned when a later collision occurs. You don't appear to be doing this anywhere.


FoRcE(Posted 2005) [#3]
Try this link it has some collision helper functions.
http://www.blitzmax.com/Community/posts.php?topic=41263


Sky009(Posted 2005) [#4]
Hi!

I thought with this peace of code i provide the object.


 
...

Local anz_collisions:Object[]
		
		ResetCollisions
		For Local temp_ball:Tball = EachIn ballList	
	
			If temp_ball <> Self
				'Write to Writemask
     			CollideImage temp_ball.ball, temp_ball.x, temp_ball.y, 0, 0, 1
			EndIf
		Next
		
		'Test Collision	
		anz_collisions = CollideImage(ball, x, y, 0, 1, 0)

...




@Force
The helper funktions are working (see Method Test_Collision).


I understand, that CollideImage returns a object array.
But how is the returned array managed? (The object array confuses me a litle bit :-) )

In the code above anz_collisions is a object array. Probably
3 collisions are detected (anz_collisions [0]-[2]).

Is the returned object a Tball type?? (in the above code)

I thought

local temp_ball:Tball = Tball(anz_collisions[0]) works.

But it does´nt.

A little tip, please. Perhaps i mess it all around.


Greetings

sky009