summaryrefslogtreecommitdiffhomepage
path: root/stage_manager.rb
blob: 87ee955e620c10656818bea09fe5e5a694b60ee6 (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
class FelFlame
  class Stage
    class <<self
      # Allows clearing of scenes and systems.
      # Used internally by FelFlame and shouldn't need to be ever used by developers
      # @!visibility private
      attr_writer :scenes, :systems

      # Add any number of Scenes to the Stage
      # @return [Boolean] +true+
      def add(*scenes_to_add)
        self.scenes |= scenes_to_add
        scenes_to_add.each do |scene|
          self.systems |= scene.systems
        end
        systems.sort_by!(&:priority)
        true
      end

      # Remove any number of Scenes from the Stage
      # @return [Boolean] +true+
      def remove(*scenes_to_remove)
        self.scenes -= scenes_to_remove
        update_systems_list
        true
      end

      # Updates the list of systems from the Scenes added to the Stage and make sure they are ordered correctly
      # This is used internally by FelFlame and shouldn't need to be ever used by developers
      # @return [Boolean] +true+
      # @!visibility private
      def update_systems_list
        systems.clear
        scenes.each do |scene|
          self.systems |= scene.systems
        end
        systems.sort_by!(&:priority)
        true
      end

      # Clears all Scenes that were added to the Stage
      # @return [Boolean] +true+
      def clear
        systems.clear
        scenes.clear
        true
      end

      # Executes one frame of the game. This executes all the Systems in the Scenes added to the Stage. Systems that exist in two or more different Scenes will still only get executed once.
      # @return [Boolean] +true+
      def call
        systems.each(&:call)
        true
      end

      # Contains all the Scenes added to the Stage
      # @return [Array<Scene>]
      def scenes
        @scenes ||= []
      end

      # Stores systems in the order the stage manager needs to call them
      # This method should generally only need to be used internally and not by a game developer
      # @!visibility private
      def systems
        @systems ||= []
      end
    end
  end
end