Class: AdventureRL::FileGroupPlayer

Inherits:
Object
  • Object
show all
Includes:
Helpers::Error
Defined in:
lib/AdventureRL/FileGroupPlayer.rb

Overview

This is an abstract class, which is inherited by

  • ClipPlayer

  • AudioPlayer

At its core, it takes a FileGroup in its #play method, and “plays” it.

Direct Known Subclasses

AudioPlayer, ClipPlayer

Constant Summary

Constants included from Helpers::Error

Helpers::Error::PADDING, Helpers::Error::STACK_TRACE_PADDING, Helpers::Error::STACK_TRACE_SIZE

Instance Method Summary collapse

Methods included from Helpers::Error

directory_exists?, error, error_no_directory, error_no_file, file_exists?

Constructor Details

#initialize(settings = {}) ⇒ FileGroupPlayer

Pass settings Hash or Settings as argument. Supersedes the child class’ DEFAULT_SETTINGS.



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 12

def initialize settings = {}
  @settings = get_default_settings.merge settings
  @playing                  = false
  @speed                    = @settings.get(:speed)
  @filegroup_index          = 0
  @filegroup                = nil
  @current_file             = nil
  @current_time             = 0.0
  @last_current_time        = 0.0
  @target_frame_delay       = 1.0 / 24.0  # Default, will be overwritten in #play
  @deltatime                = Deltatime.new
end

Instance Method Details

#get_current_timeObject Also known as: get_time

Returns the current playback time in seconds.



39
40
41
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 39

def get_current_time
  return @current_time
end

#get_filegroupObject

Returns the currently set FileGroup.



34
35
36
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 34

def get_filegroup
  return @filegroup
end

#get_settings(*keys) ⇒ Object

Returns the settings as AdventureRL::Settings, unless *keys are given, then it returns the value of @settings.get(*keys).



28
29
30
31
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 28

def get_settings *keys
  return @settings  if (keys.empty?)
  return @settings.get(*keys)
end

#get_speedObject

Returns the current playback speed multiplier.



66
67
68
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 66

def get_speed
  return @speed
end

#has_filegroup?Boolean

Returns true if there is a currently active FileGroup.

Returns:

  • (Boolean)


118
119
120
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 118

def has_filegroup?
  return !!get_filegroup
end

#increase_current_time(seconds) ⇒ Object Also known as: increase_time, seek

Increase (or decrease) current_time.



55
56
57
58
59
60
61
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 55

def increase_current_time seconds
  error(
    "Passed seconds must be an Integer or Float,",
    "but got #{seconds.inspect}:#{seconds.class.name}"
  )  unless ([Integer, Float].include? seconds.class)
  @current_time += seconds
end

#increase_speed(amount) ⇒ Object

Increment (or decrement) the speed value by amount.



80
81
82
83
84
85
86
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 80

def increase_speed amount
  error(
    "Argument passed to #increment_speed must be a Float or Integer, but got",
    "#{seconds.inspect}:#{amount.class.name}"
  )  unless ([Float, Integer].include? amount.class)
  @speed += amount
end

#is_playing?Boolean

Returns true if is currently playing, and false if is paused or stopped.

Returns:

  • (Boolean)


151
152
153
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 151

def is_playing?
  return @playing
end

#load_filegroup(filegroup) ⇒ Object

Load a FileGroup as active FileGroup.



96
97
98
99
100
101
102
103
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 96

def load_filegroup filegroup
  error(
    "Passed argument must be an instance of FileGroup, but got",
    "#{filegroup.inspect}:#{filegroup.class.name}."
  )  unless (filegroup.is_a? FileGroup)
  set_filegroup filegroup
  @target_frame_delay = 1.0 / get_filegroup.get_settings(:fps).to_f
end

#pauseObject

Pause the currently playing FileGroup.



106
107
108
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 106

def pause
  @playing = false
end

#play(filegroup) ⇒ Object

Start playing FileGroup filegroup.



89
90
91
92
93
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 89

def play filegroup
  load_filegroup filegroup
  @playing = true
  reset
end

#resetObject

Reset the current playback. Start playing from the start again.



142
143
144
145
146
147
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 142

def reset
  @deltatime.reset
  @current_time    = 0.0
  @filegroup_index = 0
  set_file
end

#resumeObject

Resumes playing paused FileGroup.



111
112
113
114
115
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 111

def resume
  return  unless (has_filegroup?)
  @playing = true
  @deltatime.reset
end

#set_current_time(seconds) ⇒ Object Also known as: set_time

Set a new current playback time in seconds.



45
46
47
48
49
50
51
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 45

def set_current_time seconds
  error(
    "Passed seconds must be an Integer or Float,",
    "but got #{seconds.inspect}:#{seconds.class.name}"
  )  unless ([Integer, Float].include? seconds.class)
  @current_time = seconds
end

#set_speed(speed) ⇒ Object

Set playback speed multiplier.



71
72
73
74
75
76
77
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 71

def set_speed speed
  error(
    "Argument passed to #set_speed must be a Float or Integer, but got",
    "#{speed.inspect}:#{speed.class.name}"
  )  unless ([Float, Integer].include? speed.class)
  @speed = speed
end

#stopObject

Stop playing and clear active FileGroup. Cannot call #resume after this, before calling #play again.



125
126
127
128
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 125

def stop
  @filegroup = nil
  @playing   = false
end

#toggleObject

Calls #resume if is paused, or calls #pause if is playing.



132
133
134
135
136
137
138
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 132

def toggle
  if    (is_playing?)
    pause
  elsif (has_filegroup?)
    resume
  end
end

#updateObject

Check which file from FileGroup is supposed to be played. This should be called every frame.



157
158
159
160
161
# File 'lib/AdventureRL/FileGroupPlayer.rb', line 157

def update
  return  unless (is_playing?)
  set_filegroup_index
  update_timing
end