Returned object array and Collide image
BlitzMax Forums/BlitzMax Beginners Area/Returned object array and Collide image
| ||
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 |
| ||
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. |
| ||
Try this link it has some collision helper functions. http://www.blitzmax.com/Community/posts.php?topic=41263 |
| ||
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 |