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
|