I'm in the middle of creating a breakout-style game. The ball is bouncing fine at the moment, but only when the bricks are not moving. When the ball collides with a moving brick, sometimes it will calculate the collision wrong and the ball will end up passing through the brick instead of reflecting off it. Here's some code to see what I mean:
How would I fix this code so the ball would bounce off the brick correctly? Thanks in advance.
superstrict type Tball field x: float field y: float field w: float field h: float field dx: float field dy: float field hit: int field temp_x: float field temp_y: float end type type Tbrick field x: float field y: float field w: float field h: float field dx: float field dy: float end type graphics(800,600,0) local ball: Tball = new Tball ball.x = 374 ball.y = 100 ball.w = 16 ball.h = 16 ball.dx = 0 ball.dy = 5 local brick: Tbrick = new Tbrick brick.x = 350 brick.y = 200 brick.w = 64 brick.h = 32 brick.dx = 0 brick.dy = 1 repeat ' Move Ball X ball.temp_x = ball.x + ball.dx if ball.hit = false if (overlap(ball.temp_x,ball.temp_y,ball.w,ball.h,brick.x,brick.y,brick.w,brick.h)) ball.dx = -ball.dx ball.hit = true notify("Horizontal Collision") ball.temp_x = ball.x endif endif ball.x = ball.temp_x ' Move Ball Y ball.temp_y = ball.y + ball.dy if ball.hit = false if (overlap(ball.temp_x,ball.temp_y,ball.w,ball.h,brick.x,brick.y,brick.w,brick.h)) ball.dy = -ball.dy ball.hit = true notify("Vertical Collision") ball.temp_y = ball.y endif endif ball.y = ball.temp_y ' Bounce ball off walls if (ball.x > 800 - ball.w or ball.x < 0) ball.dx = -ball.dx ; ball.hit = false if (ball.y > 600 - ball.h or ball.y < 0) ball.dy = -ball.dy ; ball.hit = false ' Move Brick brick.x :+ brick.dx brick.y :+ brick.dy ' Bounce brick off walls if (brick.x > 800 - (brick.w * 2) or brick.x < brick.w) brick.dx = -brick.dx if (brick.y > 600 - (brick.h * 2) or brick.y < brick.h) brick.dy = -brick.dy ' Draw cls if (ball.hit) drawtext("Hit",0,0) ' Ball setcolor(255,255,255) draw_unfilled_rect(ball.x,ball.y,ball.w,ball.h) ' Brick setcolor(0,255,0) draw_unfilled_rect(brick.x,brick.y,brick.w,brick.h) flip until keydown(KEY_ESCAPE) end function draw_unfilled_rect(x: float, y: float, w: float, h: float) w = (w + x) h = (h + y) drawline(x, y, w, y) drawline(x, h, w, h) drawline(x, y, x, h) drawline(w, y, w, h) end function function overlap: int(x1: float,y1: float,w1: float,h1: float, x2: float,y2: float,w2: float, h2: float) if ((x1 + w1) > x2) and ((x1 + w1) < (x2 + (w2 + w1))) and ((y1 + h1) > y2) and ((y1 + h1) < (y2 + (h2 + h1))) return true end function
How would I fix this code so the ball would bounce off the brick correctly? Thanks in advance.