summaryrefslogtreecommitdiffhomepage
path: root/samples/04_physics_and_collisions/08_bouncing_on_collision
diff options
context:
space:
mode:
authorAmir Rajan <[email protected]>2021-01-18 12:08:34 -0600
committerAmir Rajan <[email protected]>2021-01-18 12:08:34 -0600
commita4b9c048a1d751f5226833bb0c527ba1a8ac5d09 (patch)
tree3f2535e7a6272e796d50e7f07c906d4c9eb1b14a /samples/04_physics_and_collisions/08_bouncing_on_collision
parenta24a71805b1924ae7f80776c736f94575c171d2c (diff)
downloaddragonruby-game-toolkit-contrib-a4b9c048a1d751f5226833bb0c527ba1a8ac5d09.tar.gz
dragonruby-game-toolkit-contrib-a4b9c048a1d751f5226833bb0c527ba1a8ac5d09.zip
Synced with 2.3.
Diffstat (limited to 'samples/04_physics_and_collisions/08_bouncing_on_collision')
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb87
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb159
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb20
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb117
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb182
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb49
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/docs/LinearCollider.md13
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_1.pngbin0 -> 315601 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_2.pngbin0 -> 394289 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_3.pngbin0 -> 339651 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_4.pngbin0 -> 18828 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_5.pngbin0 -> 24240 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_6.pngbin0 -> 375696 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/ball.pngbin0 -> 38235 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/border-black.pngbin0 -> 908 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-black.pngbin0 -> 1882 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-blue.pngbin0 -> 2901 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-gray.pngbin0 -> 3006 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-green.pngbin0 -> 2887 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-indigo.pngbin0 -> 2433 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-orange.pngbin0 -> 2670 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-red.pngbin0 -> 2233 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-violet.pngbin0 -> 2439 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-white.pngbin0 -> 1754 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-yellow.pngbin0 -> 2456 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-0.pngbin0 -> 12896 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-1.pngbin0 -> 2964 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-2.pngbin0 -> 3047 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-3.pngbin0 -> 2655 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-4.pngbin0 -> 2725 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-5.pngbin0 -> 2655 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-0.pngbin0 -> 267 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-1.pngbin0 -> 4585 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-2.pngbin0 -> 4675 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-3.pngbin0 -> 4724 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-4.pngbin0 -> 4773 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-5.pngbin0 -> 4742 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-6.pngbin0 -> 4665 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-sheet.pngbin0 -> 2584 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-black.pngbin0 -> 2602 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-blue.pngbin0 -> 4842 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-gray.pngbin0 -> 5184 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-green.pngbin0 -> 4695 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-indigo.pngbin0 -> 4918 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-orange.pngbin0 -> 4825 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-red.pngbin0 -> 3753 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-violet.pngbin0 -> 5069 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-white.pngbin0 -> 5326 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-yellow.pngbin0 -> 5249 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-black.pngbin0 -> 264 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-blue.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-gray.pngbin0 -> 493 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-green.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-indigo.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-orange.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-red.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-violet.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-white.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-yellow.pngbin0 -> 361 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-black.pngbin0 -> 250 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-blue.pngbin0 -> 283 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-gray.pngbin0 -> 251 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-green.pngbin0 -> 283 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-indigo.pngbin0 -> 283 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-orange.pngbin0 -> 282 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-red.pngbin0 -> 274 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-violet.pngbin0 -> 284 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-white.pngbin0 -> 279 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-yellow.pngbin0 -> 286 bytes
-rw-r--r--samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/star.pngbin0 -> 711 bytes
70 files changed, 627 insertions, 0 deletions
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb
new file mode 100644
index 0000000..80b61e3
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/ball.rb
@@ -0,0 +1,87 @@
+GRAVITY = -0.08
+
+class Ball
+ attr_accessor :velocity, :center, :radius, :collision_enabled
+
+ def initialize args
+ #Start the ball in the top center
+ #@x = args.grid.w / 2
+ #@y = args.grid.h - 20
+
+ @velocity = {x: 0, y: 0}
+ #@width = 20
+ #@height = @width
+ @radius = 20.0 / 2.0
+ @center = {x: (args.grid.w / 2), y: (args.grid.h)}
+
+ #@left_wall = (args.state.board_width + args.grid.w / 8)
+ #@right_wall = @left_wall + args.state.board_width
+ @left_wall = 0
+ @right_wall = $args.grid.right
+
+ @max_velocity = 7
+ @collision_enabled = true
+ end
+
+ #Move the ball according to its velocity
+ def update args
+ @center.x += @velocity.x
+ @center.y += @velocity.y
+ @velocity.y += GRAVITY
+
+ alpha = 0.2
+ if @center.y-@radius <= 0
+ @velocity.y = (@velocity.y.abs*0.7).abs
+ @velocity.x = (@velocity.x.abs*0.9).abs * ((@velocity.x < 0) ? -1 : 1)
+
+ if @velocity.y.abs() < alpha
+ @velocity.y=0
+ end
+ if @velocity.x.abs() < alpha
+ @velocity.x=0
+ end
+ end
+
+ if @center.x > args.grid.right+@radius*2
+ @center.x = 0-@radius
+ elsif @center.x< 0-@radius*2
+ @center.x = args.grid.right + @radius
+ end
+ end
+
+ def wallBounds args
+ #if @x < @left_wall || @x + @width > @right_wall
+ #@velocity.x *= -1.1
+ #if @velocity.x > @max_velocity
+ #@velocity.x = @max_velocity
+ #elsif @velocity.x < @max_velocity * -1
+ #@velocity.x = @max_velocity * -1
+ #end
+ #end
+ #if @y < 0 || @y + @height > args.grid.h
+ #@velocity.y *= -1.1
+ #if @velocity.y > @max_velocity
+ #@velocity.y = @max_velocity
+ #elsif @velocity.y < @max_velocity * -1
+ #@velocity.y = @max_velocity * -1
+ #end
+ #end
+ end
+
+ #render the ball to the screen
+ def draw args
+ #args.outputs.solids << [@x, @y, @width, @height, 255, 255, 0];
+ args.outputs.sprites << [
+ @center.x-@radius,
+ @center.y-@radius,
+ @radius*2,
+ @radius*2,
+ "sprites/circle-white.png",
+ 0,
+ 255,
+ 255, #r
+ 0, #g
+ 255 #b
+ ]
+ end
+ end
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
new file mode 100644
index 0000000..9254ee4
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
@@ -0,0 +1,159 @@
+DEGREES_TO_RADIANS = Math::PI / 180
+
+class Block
+ def initialize(x, y, block_size, rotation)
+ @x = x
+ @y = y
+ @block_size = block_size
+ @rotation = rotation
+
+ #The repel velocity?
+ @velocity = {x: 2, y: 0}
+
+ horizontal_offset = (3 * block_size) * Math.cos(rotation * DEGREES_TO_RADIANS)
+ vertical_offset = block_size * Math.sin(rotation * DEGREES_TO_RADIANS)
+
+ if rotation >= 0
+ theta = 90 - rotation
+ #The line doesn't visually line up exactly with the edge of the sprite, so artificially move it a bit
+ modifier = 5
+ x_offset = modifier * Math.cos(theta * DEGREES_TO_RADIANS)
+ y_offset = modifier * Math.sin(theta * DEGREES_TO_RADIANS)
+ @x1 = @x - x_offset
+ @y1 = @y + y_offset
+ @x2 = @x1 + horizontal_offset
+ @y2 = @y1 + (vertical_offset * 3)
+
+ @imaginary_line = [ @x1, @y1, @x2, @y2 ]
+ else
+ theta = 90 + rotation
+ x_offset = @block_size * Math.cos(theta * DEGREES_TO_RADIANS)
+ y_offset = @block_size * Math.sin(theta * DEGREES_TO_RADIANS)
+ @x1 = @x + x_offset
+ @y1 = @y + y_offset + 19
+ @x2 = @x1 + horizontal_offset
+ @y2 = @y1 + (vertical_offset * 3)
+
+ @imaginary_line = [ @x1, @y1, @x2, @y2 ]
+ end
+
+ end
+
+ def draw args
+ args.outputs.sprites << [
+ @x,
+ @y,
+ @block_size*3,
+ @block_size,
+ "sprites/square-green.png",
+ @rotation
+ ]
+
+ args.outputs.lines << @imaginary_line
+ args.outputs.solids << @debug_shape
+ end
+
+ def multiply_matricies
+ end
+
+ def calc args
+ if collision? args
+ collide args
+ end
+ end
+
+ #Determine if the ball and block are touching
+ def collision? args
+ #The minimum area enclosed by the center of the ball and the 2 corners of the block
+ #If the area ever drops below this value, we know there is a collision
+ min_area = ((@block_size * 3) * args.state.ball.radius) / 2
+
+ #https://www.mathopenref.com/coordtrianglearea.html
+ ax = @x1
+ ay = @y1
+ bx = @x2
+ by = @y2
+ cx = args.state.ball.center.x
+ cy = args.state.ball.center.y
+
+ current_area = (ax*(by-cy)+bx*(cy-ay)+cx*(ay-by))/2
+
+ collision = false
+ if @rotation >= 0
+ if (current_area < min_area &&
+ current_area > 0 &&
+ args.state.ball.center.y > @y1 &&
+ args.state.ball.center.x < @x2)
+
+ collision = true
+ end
+ else
+ if (current_area < min_area &&
+ current_area > 0 &&
+ args.state.ball.center.y > @y2 &&
+ args.state.ball.center.x > @x1)
+
+ collision = true
+ end
+ end
+
+ return collision
+ end
+
+ def collide args
+ #Slope of the block
+ slope = (@y2 - @y1) / (@x2 - @x1)
+
+ #Create a unit vector and tilt it (@rotation) number of degrees
+ x = -Math.cos(@rotation * DEGREES_TO_RADIANS)
+ y = Math.sin(@rotation * DEGREES_TO_RADIANS)
+
+ #Find the vector that is perpendicular to the slope
+ perpVect = { x: x, y: y }
+ mag = (perpVect.x**2 + perpVect.y**2)**0.5 # find the magniude of the perpVect
+ perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)} # divide the perpVect by the magniude to make it a unit vector
+
+ previousPosition = { # calculate an ESTIMATE of the previousPosition of the ball
+ x:args.state.ball.center.x-args.state.ball.velocity.x,
+ y:args.state.ball.center.y-args.state.ball.velocity.y
+ }
+
+ velocityMag = (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5 # the current velocity magnitude of the ball
+ theta_ball = Math.atan2(args.state.ball.velocity.y, args.state.ball.velocity.x) #the angle of the ball's velocity
+ theta_repel = (180 * DEGREES_TO_RADIANS) - theta_ball + (@rotation * DEGREES_TO_RADIANS)
+
+ fbx = velocityMag * Math.cos(theta_ball) #the x component of the ball's velocity
+ fby = velocityMag * Math.sin(theta_ball) #the y component of the ball's velocity
+
+ frx = velocityMag * Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
+ fry = velocityMag * Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
+
+ args.state.display_value = velocityMag
+ fsumx = fbx+frx #sum of x forces
+ fsumy = fby+fry #sum of y forces
+ fr = velocityMag #fr is the resulting magnitude
+ thetaNew = Math.atan2(fsumy, fsumx) #thetaNew is the resulting angle
+
+ xnew = fr*Math.cos(thetaNew) #resulting x velocity
+ ynew = fr*Math.sin(thetaNew) #resulting y velocity
+
+ dampener = 0.3
+ ynew *= dampener * 0.5
+
+ #If the bounce is very low, that means the ball is rolling and we don't want to dampenen the X velocity
+ if ynew > -0.1
+ xnew *= dampener
+ end
+
+ #Add the sine component of gravity back in (X component)
+ gravity_x = 4 * Math.sin(@rotation * DEGREES_TO_RADIANS)
+ xnew += gravity_x
+
+ args.state.ball.velocity.x = -xnew
+ args.state.ball.velocity.y = -ynew
+
+ #Set the position of the ball to the previous position so it doesn't warp throught the block
+ args.state.ball.center.x = previousPosition.x
+ args.state.ball.center.y = previousPosition.y
+ end
+end
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb
new file mode 100644
index 0000000..4df68fe
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/cannon.rb
@@ -0,0 +1,20 @@
+class Cannon
+ def initialize args
+ @pointA = {x: args.grid.right/2,y: args.grid.top}
+ @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}
+ end
+ def update args
+ activeBall = args.state.ball
+ @pointB = {x: args.inputs.mouse.x, y: args.inputs.mouse.y}
+
+ if args.inputs.mouse.click
+ alpha = 0.01
+ activeBall.velocity.y = (@pointB.y - @pointA.y) * alpha
+ activeBall.velocity.x = (@pointB.x - @pointA.x) * alpha
+ activeBall.center = {x: (args.grid.w / 2), y: (args.grid.h)}
+ end
+ end
+ def render args
+ args.outputs.lines << [@pointA.x, @pointA.y, @pointB.x, @pointB.y]
+ end
+end
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb
new file mode 100644
index 0000000..f5883ad
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb
@@ -0,0 +1,117 @@
+INFINITY= 10**10
+
+require 'app/vector2d.rb'
+require 'app/peg.rb'
+require 'app/block.rb'
+require 'app/ball.rb'
+require 'app/cannon.rb'
+
+
+#Method to init default values
+def defaults args
+ args.state.pegs ||= []
+ args.state.blocks ||= []
+ args.state.cannon ||= Cannon.new args
+ args.state.ball ||= Ball.new args
+ args.state.horizontal_offset ||= 0
+ init_pegs args
+ init_blocks args
+
+ args.state.display_value ||= "test"
+end
+
+begin :default_methods
+ def init_pegs args
+ num_horizontal_pegs = 14
+ num_rows = 5
+
+ return unless args.state.pegs.count < num_rows * num_horizontal_pegs
+
+ block_size = 32
+ block_spacing = 50
+ total_width = num_horizontal_pegs * (block_size + block_spacing)
+ starting_offset = (args.grid.w - total_width) / 2 + block_size
+
+ for i in (0...num_rows)
+ for j in (0...num_horizontal_pegs)
+ row_offset = 0
+ if i % 2 == 0
+ row_offset = 20
+ else
+ row_offset = -20
+ end
+ args.state.pegs.append(Peg.new(j * (block_size+block_spacing) + starting_offset + row_offset, (args.grid.h - block_size * 2) - (i * block_size * 2)-90, block_size))
+ end
+ end
+
+ end
+
+ def init_blocks args
+ return unless args.state.blocks.count < 10
+
+ #Sprites are rotated in degrees, but the Ruby math functions work on radians
+ radians_to_degrees = Math::PI / 180
+
+ block_size = 25
+ #Rotation angle (in degrees) of the blocks
+ rotation = 30
+ vertical_offset = block_size * Math.sin(rotation * radians_to_degrees)
+ horizontal_offset = (3 * block_size) * Math.cos(rotation * radians_to_degrees)
+ center = args.grid.w / 2
+
+ for i in (0...5)
+ #Create a ramp of blocks. Not going to be perfect because of the float to integer conversion and anisotropic to isotropic coversion
+ args.state.blocks.append(Block.new((center + 100 + (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, rotation))
+ args.state.blocks.append(Block.new((center - 100 - (i * horizontal_offset)).to_i, 100 + (vertical_offset * i) + (i * block_size), block_size, -rotation))
+ end
+ end
+end
+
+#Render loop
+def render args
+ args.outputs.borders << args.state.game_area
+ render_pegs args
+ render_blocks args
+ args.state.cannon.render args
+ args.state.ball.draw args
+end
+
+begin :render_methods
+ #Draw the pegs in a grid pattern
+ def render_pegs args
+ args.state.pegs.each do |peg|
+ peg.draw args
+ end
+ end
+
+ def render_blocks args
+ args.state.blocks.each do |block|
+ block.draw args
+ end
+ end
+
+end
+
+#Calls all methods necessary for performing calculations
+def calc args
+ args.state.pegs.each do |peg|
+ peg.calc args
+ end
+
+ args.state.blocks.each do |block|
+ block.calc args
+ end
+
+ args.state.ball.update args
+ args.state.cannon.update args
+end
+
+begin :calc_methods
+
+end
+
+def tick args
+ defaults args
+ render args
+ calc args
+end
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb
new file mode 100644
index 0000000..52045de
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/peg.rb
@@ -0,0 +1,182 @@
+class Peg
+ def initialize(x, y, block_size)
+ @x = x # x cordinate of the LEFT side of the peg
+ @y = y # y cordinate of the RIGHT side of the peg
+ @block_size = block_size # diameter of the peg
+
+ @radius = @block_size/2.0 # radius of the peg
+ @center = { # cordinatees of the CENTER of the peg
+ x: @x+@block_size/2.0,
+ y: @y+@block_size/2.0
+ }
+
+ @r = 255 # color of the peg
+ @g = 0
+ @b = 0
+
+ @velocity = {x: 2, y: 0}
+ end
+
+ def draw args
+ args.outputs.sprites << [ # draw the peg according to the @x, @y, @radius, and the RGB
+ @x,
+ @y,
+ @radius*2.0,
+ @radius*2.0,
+ "sprites/circle-white.png",
+ 0,
+ 255,
+ @r, #r
+ @g, #g
+ @b #b
+ ]
+ end
+
+
+ def calc args
+ if collisionWithBounce? args # if the is a collision with the bouncing ball
+ collide args
+ @r = 0
+ @b = 0
+ @g = 255
+ else
+ end
+ end
+
+
+ # do two circles (the ball and this peg) intersect
+ def collisionWithBounce? args
+ squareDistance = ( # the squared distance between the ball's center and this peg's center
+ (args.state.ball.center.x - @center.x) ** 2.0 +
+ (args.state.ball.center.y - @center.y) ** 2.0
+ )
+ radiusSum = ( # the sum of the radius squared of the this peg and the ball
+ (args.state.ball.radius + @radius) ** 2.0
+ )
+ # if the squareDistance is less or equal to radiusSum, then there is a radial intersection between the ball and this peg
+ return (squareDistance <= radiusSum)
+ end
+
+ # ! The following links explain the getRepelMagnitude function !
+ # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_4.png
+ # https://raw.githubusercontent.com/DragonRuby/dragonruby-game-toolkit-physics/master/docs/docImages/LinearCollider_5.png
+ # https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/LinearCollider.md
+ def getRepelMagnitude (args, fbx, fby, vrx, vry, ballMag)
+ a = fbx ; b = vrx ; c = fby
+ d = vry ; e = ballMag
+ if b**2 + d**2 == 0
+ #unexpected
+ end
+
+ x1 = (-a*b+-c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 + d**2 - a**2 * d**2)**0.5)/(b**2 + d**2)
+ x2 = -((a*b + c*d + (e**2 * b**2 - b**2 * c**2 + 2*a*b*c*d + e**2 * d**2 - a**2 * d**2)**0.5)/(b**2 + d**2))
+
+ err = 0.00001
+ o = ((fbx + x1*vrx)**2 + (fby + x1*vry)**2 ) ** 0.5
+ p = ((fbx + x2*vrx)**2 + (fby + x2*vry)**2 ) ** 0.5
+ r = 0
+
+ if (ballMag >= o-err and ballMag <= o+err)
+ r = x1
+ elsif (ballMag >= p-err and ballMag <= p+err)
+ r = x2
+ else
+ #unexpected
+ end
+
+ if (args.state.ball.center.x > @center.x)
+ return x2*-1
+ end
+
+ return x2
+
+ #return r
+ end
+
+ #this sets the new velocity of the ball once it has collided with this peg
+ def collide args
+ normalOfRCCollision = [ #this is the normal of the collision in COMPONENT FORM
+ {x: @center.x, y: @center.y}, #see https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.mathscard.co.uk%2Fonline%2Fcircle-coordinate-geometry%2F&psig=AOvVaw2GcD-e2-nJR_IUKpw3hO98&ust=1605731315521000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCMjBo7e1iu0CFQAAAAAdAAAAABAD
+ {x: args.state.ball.center.x, y: args.state.ball.center.y},
+ ]
+
+ normalSlope = ( #normalSlope is the slope of normalOfRCCollision
+ (normalOfRCCollision[1].y - normalOfRCCollision[0].y) /
+ (normalOfRCCollision[1].x - normalOfRCCollision[0].x)
+ )
+ slope = normalSlope**-1.0 * -1 # slope is the slope of the tangent
+ # args.state.display_value = slope
+ pointA = { # pointA and pointB are using the var slope to tangent in COMPONENT FORM
+ x: args.state.ball.center.x-1,
+ y: -(slope-args.state.ball.center.y)
+ }
+ pointB = {
+ x: args.state.ball.center.x+1,
+ y: slope+args.state.ball.center.y
+ }
+
+ perpVect = {x: pointB.x - pointA.x, y:pointB.y - pointA.y} # perpVect is to be VECTOR of the perpendicular tangent
+ mag = (perpVect.x**2 + perpVect.y**2)**0.5 # find the magniude of the perpVect
+ perpVect = {x: perpVect.x/(mag), y: perpVect.y/(mag)} # divide the perpVect by the magniude to make it a unit vector
+ perpVect = {x: -perpVect.y, y: perpVect.x} # swap the x and y and multiply by -1 to make the vector perpendicular
+ args.state.display_value = perpVect
+ if perpVect.y > 0 #ensure perpVect points upward
+ perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
+ end
+
+ previousPosition = { # calculate an ESTIMATE of the previousPosition of the ball
+ x:args.state.ball.center.x-args.state.ball.velocity.x,
+ y:args.state.ball.center.y-args.state.ball.velocity.y
+ }
+
+ yInterc = pointA.y + -slope*pointA.x
+ if slope == INFINITY # the perpVect presently either points in the correct dirrection or it is 180 degrees off we need to correct this
+ if previousPosition.x < pointA.x
+ perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
+ yInterc = -INFINITY
+ end
+ elsif previousPosition.y < slope*previousPosition.x + yInterc # check if ball is bellow or above the collider to determine if perpVect is - or +
+ perpVect = {x: perpVect.x*-1, y: perpVect.y*-1}
+ end
+
+ velocityMag = # the current velocity magnitude of the ball
+ (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5
+ theta_ball=
+ Math.atan2(args.state.ball.velocity.y,args.state.ball.velocity.x) #the angle of the ball's velocity
+ theta_repel=
+ Math.atan2(args.state.ball.center.y,args.state.ball.center.x) #the angle of the repelling force(perpVect)
+
+ fbx = velocityMag * Math.cos(theta_ball) #the x component of the ball's velocity
+ fby = velocityMag * Math.sin(theta_ball) #the y component of the ball's velocity
+ repelMag = getRepelMagnitude( # the magniude of the collision vector
+ args,
+ fbx,
+ fby,
+ perpVect.x,
+ perpVect.y,
+ (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5
+ )
+ frx = repelMag* Math.cos(theta_repel) #the x component of the repel's velocity | magnitude is set to twice of fbx
+ fry = repelMag* Math.sin(theta_repel) #the y component of the repel's velocity | magnitude is set to twice of fby
+
+ fsumx = fbx+frx # sum of x forces
+ fsumy = fby+fry # sum of y forces
+ fr = velocityMag # fr is the resulting magnitude
+ thetaNew = Math.atan2(fsumy, fsumx) # thetaNew is the resulting angle
+ xnew = fr*Math.cos(thetaNew) # resulting x velocity
+ ynew = fr*Math.sin(thetaNew) # resulting y velocity
+ if (args.state.ball.center.x >= @center.x) # this is necessary for the ball colliding on the right side of the peg
+ xnew=xnew.abs
+ end
+
+ args.state.ball.velocity.x = xnew # set the x-velocity to the new velocity
+ if args.state.ball.center.y > @center.y # if the ball is above the middle of the peg we need to temporarily ignore some of the gravity
+ args.state.ball.velocity.y = ynew + GRAVITY * 0.01
+ else
+ args.state.ball.velocity.y = ynew - GRAVITY * 0.01 # if the ball is bellow the middle of the peg we need to temporarily increase the power of the gravity
+ end
+
+ args.state.ball.center.x+= args.state.ball.velocity.x # update the position of the ball so it never looks like the ball is intersecting the circle
+ args.state.ball.center.y+= args.state.ball.velocity.y
+ end
+end
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb
new file mode 100644
index 0000000..9cb1954
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/app/vector2d.rb
@@ -0,0 +1,49 @@
+class Vector2d
+ attr_accessor :x, :y
+
+ def initialize x=0, y=0
+ @x=x
+ @y=y
+ end
+
+ #returns a vector multiplied by scalar x
+ #x [float] scalar
+ def mult x
+ r = Vector2d.new(0,0)
+ r.x=@x*x
+ r.y=@y*x
+ r
+ end
+
+ # vect [Vector2d] vector to copy
+ def copy vect
+ Vector2d.new(@x, @y)
+ end
+
+ #returns a new vector equivalent to this+vect
+ #vect [Vector2d] vector to add to self
+ def add vect
+ Vector2d.new(@x+vect.x,@y+vect.y)
+ end
+
+ #returns a new vector equivalent to this-vect
+ #vect [Vector2d] vector to subtract to self
+ def sub vect
+ Vector2d.new(@x-vect.c, @y-vect.y)
+ end
+
+ #return the magnitude of the vector
+ def mag
+ ((@x**2)+(@y**2))**0.5
+ end
+
+ #returns a new normalize version of the vector
+ def normalize
+ Vector2d.new(@x/mag, @y/mag)
+ end
+
+ #TODO delet?
+ def distABS vect
+ (((vect.x-@x)**2+(vect.y-@y)**2)**0.5).abs()
+ end
+ end \ No newline at end of file
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/LinearCollider.md b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/LinearCollider.md
new file mode 100644
index 0000000..41227a2
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/LinearCollider.md
@@ -0,0 +1,13 @@
+<br/>
+<img src="https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/docImages/LinearCollider_1.png?raw=true" width="300" height="271">
+<br/>
+<img src="https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/docImages/LinearCollider_2.png?raw=true" width="300" height="271">
+<br/>
+<img src="https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/docImages/LinearCollider_3.png?raw=true" width="300" height="271">
+<br/>
+<img src="https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/docImages/LinearCollider_4.png?raw=true" width="634" height="72">
+<br/>
+<img src="https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/docImages/LinearCollider_5.png?raw=true" width="1226" height="92">
+<br/>
+<img src="https://github.com/DragonRuby/dragonruby-game-toolkit-physics/blob/master/docs/docImages/LinearCollider_6.png?raw=true" width="300" height="271">
+<br/>
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_1.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_1.png
new file mode 100644
index 0000000..75c8271
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_1.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_2.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_2.png
new file mode 100644
index 0000000..231a362
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_2.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_3.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_3.png
new file mode 100644
index 0000000..5e552d3
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_3.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_4.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_4.png
new file mode 100644
index 0000000..c1284a3
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_4.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_5.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_5.png
new file mode 100644
index 0000000..035282c
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_5.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_6.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_6.png
new file mode 100644
index 0000000..b1dadcb
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/docs/docImages/LinearCollider_6.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/ball.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/ball.png
new file mode 100644
index 0000000..aec6fa4
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/ball.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/border-black.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/border-black.png
new file mode 100644
index 0000000..c9d0bad
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/border-black.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-black.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-black.png
new file mode 100644
index 0000000..c98e23d
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-black.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-blue.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-blue.png
new file mode 100644
index 0000000..1726d2a
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-blue.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-gray.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-gray.png
new file mode 100644
index 0000000..960f191
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-gray.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-green.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-green.png
new file mode 100644
index 0000000..43cf7ee
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-green.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-indigo.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-indigo.png
new file mode 100644
index 0000000..598e240
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-indigo.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-orange.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-orange.png
new file mode 100644
index 0000000..5604a42
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-orange.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-red.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-red.png
new file mode 100644
index 0000000..7f17ca6
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-red.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-violet.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-violet.png
new file mode 100644
index 0000000..681d210
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-violet.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-white.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-white.png
new file mode 100644
index 0000000..bd32155
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-white.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-yellow.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-yellow.png
new file mode 100644
index 0000000..94992eb
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/circle-yellow.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-0.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-0.png
new file mode 100644
index 0000000..fb179af
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-0.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-1.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-1.png
new file mode 100644
index 0000000..8cfe531
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-1.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-2.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-2.png
new file mode 100644
index 0000000..cb462e1
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-2.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-3.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-3.png
new file mode 100644
index 0000000..04c4977
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-3.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-4.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-4.png
new file mode 100644
index 0000000..b29fa3d
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-4.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-5.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-5.png
new file mode 100644
index 0000000..99f4e74
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/dragon-5.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-0.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-0.png
new file mode 100644
index 0000000..f48636f
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-0.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-1.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-1.png
new file mode 100644
index 0000000..b4018d9
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-1.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-2.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-2.png
new file mode 100644
index 0000000..3abaedd
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-2.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-3.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-3.png
new file mode 100644
index 0000000..fe94a5a
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-3.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-4.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-4.png
new file mode 100644
index 0000000..ed04237
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-4.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-5.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-5.png
new file mode 100644
index 0000000..2cd8f06
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-5.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-6.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-6.png
new file mode 100644
index 0000000..e55909c
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-6.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-sheet.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-sheet.png
new file mode 100644
index 0000000..8559a5c
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/explosion-sheet.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-black.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-black.png
new file mode 100644
index 0000000..f50c872
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-black.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-blue.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-blue.png
new file mode 100644
index 0000000..1696bae
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-blue.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-gray.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-gray.png
new file mode 100644
index 0000000..e8c4c5a
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-gray.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-green.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-green.png
new file mode 100644
index 0000000..a700602
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-green.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-indigo.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-indigo.png
new file mode 100644
index 0000000..15f6f4f
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-indigo.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-orange.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-orange.png
new file mode 100644
index 0000000..1587173
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-orange.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-red.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-red.png
new file mode 100644
index 0000000..d442f39
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-red.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-violet.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-violet.png
new file mode 100644
index 0000000..3be5731
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-violet.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-white.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-white.png
new file mode 100644
index 0000000..c1ad970
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-white.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-yellow.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-yellow.png
new file mode 100644
index 0000000..63f5f34
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/hexagon-yellow.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-black.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-black.png
new file mode 100644
index 0000000..fa9e463
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-black.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-blue.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-blue.png
new file mode 100644
index 0000000..a3d8524
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-blue.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-gray.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-gray.png
new file mode 100644
index 0000000..85dcc1d
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-gray.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-green.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-green.png
new file mode 100644
index 0000000..ec2773e
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-green.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-indigo.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-indigo.png
new file mode 100644
index 0000000..e6be50c
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-indigo.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-orange.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-orange.png
new file mode 100644
index 0000000..154d81c
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-orange.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-red.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-red.png
new file mode 100644
index 0000000..3448c4d
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-red.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-violet.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-violet.png
new file mode 100644
index 0000000..f09bf21
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-violet.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-white.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-white.png
new file mode 100644
index 0000000..a45793d
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-white.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-yellow.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-yellow.png
new file mode 100644
index 0000000..9be20c7
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/isometric-yellow.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-black.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-black.png
new file mode 100644
index 0000000..cea7bd7
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-black.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-blue.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-blue.png
new file mode 100644
index 0000000..b840849
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-blue.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-gray.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-gray.png
new file mode 100644
index 0000000..2142b30
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-gray.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-green.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-green.png
new file mode 100644
index 0000000..5ef7f75
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-green.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-indigo.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-indigo.png
new file mode 100644
index 0000000..2384108
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-indigo.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-orange.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-orange.png
new file mode 100644
index 0000000..bb1eee7
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-orange.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-red.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-red.png
new file mode 100644
index 0000000..3ed5f13
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-red.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-violet.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-violet.png
new file mode 100644
index 0000000..333540c
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-violet.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-white.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-white.png
new file mode 100644
index 0000000..378c565
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-white.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-yellow.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-yellow.png
new file mode 100644
index 0000000..0edeeec
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/square-yellow.png
Binary files differ
diff --git a/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/star.png b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/star.png
new file mode 100644
index 0000000..e0ee0f9
--- /dev/null
+++ b/samples/04_physics_and_collisions/08_bouncing_on_collision/sprites/star.png
Binary files differ