/
timeline.rb
106 lines (87 loc) · 3.03 KB
/
timeline.rb
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
require 'active_support'
module GeekGame
class Timeline
def initialize
setup_event_queue
setup_clock
setup_world
setup_network_server
# This is temporarily here
@red = Player.new color: [0xff, 0, 0]
MetalDerrick.new position: Point(-1000, -400)
@red.recharger = Recharger.new position: Point(-1000, -400), player: @red
PewPewFactory.new position: Point(-1250, -400), angle: 90.degrees, player: @red
EngineerFactory.new position: Point(-1100, -600), angle: -135.degrees, player: @red
build_initial_engineers_for @red
@blue = Player.new color: [0, 0, 0xff]
MetalDerrick.new position: Point(1000, 400)
@blue.recharger = Recharger.new position: Point(1000, 400), player: @blue
PewPewFactory.new position: Point(950, 650), angle: 180.degrees, player: @blue
EngineerFactory.new position: Point(1250, 350), angle: 45.degrees, player: @blue
build_initial_engineers_for @blue
build_initial_pew_pews_for @blue
@ai = [AI::Lemmings.new(@red), AI::AttackInFormation.new(@blue)]
end
def build_initial_engineers_for(player)
3.times do
random_position = player.recharger.position.advance_by(Vector.polar(1, rand(360).degrees) * (150 + rand(300)))
Engineer.new position: random_position, angle: rand(360).degrees, player: player
end
end
def build_initial_pew_pews_for(player)
5.times do
random_position = player.recharger.position.advance_by(Vector.polar(1, rand(360).degrees) * (150 + rand(300)))
PewPew.new position: random_position, angle: rand(360).degrees, player: player
end
end
def start!
loop do
handle_system_events
seconds_passed = @clock.tick.seconds
gradually_update(seconds_passed)
@network_server.push
end
end
def gradually_update(seconds_passed)
time_step = 1e-1
(seconds_passed.to_f / time_step).to_i.times do
update_game_world(time_step)
end
update_game_world(seconds_passed.to_f % time_step)
end
def update_game_world(seconds_passed)
@ai.each { |ai| ai.act!(seconds_passed) } # TODO: to be wiped out to client (AI) side
@world.update(seconds_passed)
end
def handle_system_events
@event_queue.each do |event|
case event
when Rubygame::Events::QuitRequested
Rubygame.quit
exit
end
end
end
protected
def setup_network_server
@network_server = GeekGame::Network::Server.new self, 'localhost', 21000
@network_server.bind_to_port
print "Waiting for client..."
@network_server.wait_for_client
puts " client connected"
end
def setup_event_queue
@event_queue = Rubygame::EventQueue.new
@event_queue.enable_new_style_events
end
def setup_clock
@clock = Rubygame::Clock.new
@clock.target_framerate = 10
@clock.calibrate
@clock.enable_tick_events
end
def setup_world
@world = GeekGame::World.new
end
end
end