summaryrefslogtreecommitdiffhomepage
path: root/samples/04_physics_and_collisions/08_bouncing_on_collision/app/main.rb
blob: f5883ad8a3e7197b4642b1a62b8af961a1a14649 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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