forked from exavideo/scoreboard
-
Notifications
You must be signed in to change notification settings - Fork 1
/
scoreboard_view.rb
148 lines (128 loc) · 3.55 KB
/
scoreboard_view.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# Copyright 2011, 2014 Exavideo LLC.
#
# This file is part of Exaboard.
#
# Exaboard is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Exaboard is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Exaboard. If not, see <http://www.gnu.org/licenses/>.
require_relative './linear_animation'
require_relative './scoreboard_helpers'
##
# A template used to render the scoreboard data to SVG images.
class ScoreboardView
include ViewHelpers
##
# Creates a new view using the given SVG erb template.
def initialize(filename)
@template = Erubis::PI::Eruby.new(File.read(filename))
@away_goal_flasher = LinearAnimation.new
@home_goal_flasher = LinearAnimation.new
@announce_text_dissolve = LinearAnimation.new
@global_dissolve = LinearAnimation.new
@global_dissolve.cut_in # hack
@announce_text_dissolve.cut_in
@animations = [ @away_goal_flasher, @home_goal_flasher,
@announce_text_dissolve, @global_dissolve ]
end
##
# Starts a goal-flash animation on the given flasher.
def goal_flash(flasher)
n_frames = 15
# chain together a bunch of transitions
flasher.in(n_frames) {
flasher.out(n_frames) {
flasher.in(n_frames) {
flasher.out(n_frames) {
flasher.in(n_frames) {
flasher.out(n_frames)
}
}
}
}
}
end
##
# Renders an SVG image using the current scoreboard data.
def render
# Process view commands from the queue.
while command_queue.length > 0
cmd = command_queue.shift
if (cmd.has_key? 'down')
@global_dissolve.out(15)
elsif (cmd.has_key? 'up')
@global_dissolve.in(15)
elsif (cmd.has_key? 'announce_next')
@announce_text_dissolve.out(10) {
announce.next
@announce_text_dissolve.in(10)
}
elsif (cmd.has_key? 'goal_scored_by')
if cmd['goal_scored_by'] =~ /\/0$/
goal_flash(@away_goal_flasher)
elsif cmd['goal_scored_by'] =~ /\/1$/
goal_flash(@home_goal_flasher)
end
end
end
# Advance all animations.
@animations.each do |ani|
ani.frame_advance
end
# Advance the announce queue periodically.
if announce.is_up
announce.frames += 1
if announce.frames == 90
announce.next
end
else
announce.frames = 0
end
# Process the erb template.
@next_frame = true
ret = render_template
@next_frame = false
ret
end
##
# Returns the result of running the erb template.
def render_template
@template.result(binding)
end
##
# Returns true if the global dissolve value is nonzero - i.e.
# the scoreboard is currently up on screen.
def is_up?
@global_dissolve.value > 0.01
end
##
# Returns the global alpha (dissolve) value.
def galpha
(255 * @global_dissolve.value).to_i
end
##
# Return the opacity to be used for the announce text.
def announce_text_opacity
@announce_text_dissolve.value
end
##
# Return the opacity for the away team goal flasher layer.
def away_blink_opacity
@away_goal_flasher.value
end
##
# Return the opacity for the home team goal flasher layer.
def home_blink_opacity
@home_goal_flasher.value
end
attr_accessor :announce, :status, :away_team, :home_team, :clock
attr_accessor :penalty_state, :command_queue, :play_clock
end