summaryrefslogtreecommitdiffhomepage
path: root/samples/07_advanced_rendering/09_z_targeting_camera/app/main.rb
blob: ecdbfd3505c4ee4a3e275826fb28fa775c72ad70 (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
class Game
  attr_gtk

  def tick
    defaults
    render
    input
    calc
  end

  def defaults
    outputs.background_color = [219, 208, 191]
    player.x        ||= 634
    player.y        ||= 153
    player.angle    ||= 90
    player.distance ||= arena_radius
    target.x        ||= 634
    target.y        ||= 359
  end

  def render
    outputs[:scene].sprites << ([0, 0, 933, 700, 'sprites/arena.png'].center_inside_rect grid.rect)
    outputs[:scene].sprites << target_sprite
    outputs[:scene].sprites << player_sprite
    outputs.sprites << scene
  end

  def target_sprite
    {
      x: target.x, y: target.y,
      w: 10, h: 10,
      path: 'sprites/square/black.png'
    }.anchor_rect 0.5, 0.5
  end

  def input
    if inputs.up && player.distance > 30
      player.distance -= 2
    elsif inputs.down && player.distance < 200
      player.distance += 2
    end

    player.angle += inputs.left_right * -1
  end

  def calc
    player.x = target.x + ((player.angle *  1).vector_x player.distance)
    player.y = target.y + ((player.angle * -1).vector_y player.distance)
  end

  def player_sprite
    {
      x: player.x,
      y: player.y,
      w: 50,
      h: 100,
      path: 'sprites/player.png',
      angle: (player.angle * -1) + 90
    }.anchor_rect 0.5, 0
  end

  def center_map
    { x: 634, y: 359 }
  end

  def zoom_factor_single
    2 - ((args.geometry.distance player, center_map).fdiv arena_radius)
  end

  def zoom_factor
    zoom_factor_single ** 2
  end

  def arena_radius
    206
  end

  def scene
    {
      x:    (640 - player.x) + (640 - (640 * zoom_factor)),
      y:    (360 - player.y - (75 * zoom_factor)) + (320 - (320 * zoom_factor)),
      w:    1280 * zoom_factor,
      h:     720 * zoom_factor,
      path: :scene,
      angle: player.angle - 90,
      angle_anchor_x: (player.x.fdiv 1280),
      angle_anchor_y: (player.y.fdiv 720)
    }
  end

  def player
    state.player
  end

  def target
    state.target
  end
end

def tick args
  $game ||= Game.new
  $game.args = args
  $game.tick
end

$gtk.reset