Bouncing a ball off moving bricks

BlitzMax Forums/BlitzMax Beginners Area/Bouncing a ball off moving bricks

wizenick(Posted 2007) [#1]
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:


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.


Jesse(Posted 2007) [#2]
here you go:

the way you have it, you are doing two tests inside the brick. the first test was done when the ball was 4 pixels inside the brick the second was when you were 1 pixels inside the brick the 1 pixel is the brick movement. and that is why it was going through.


wizenick(Posted 2007) [#3]
Many thanks for the quick reply! It's working fine now.