Class: Termfront::TitleScreen

Inherits:
Object
  • Object
show all
Defined in:
lib/termfront/title_screen.rb

Constant Summary collapse

DEMO_WAYPOINTS =
[
  [2.5, 5.0], [7.0, 2.5], [11.0, 3.5], [13.0, 5.0],
  [13.0, 8.0], [10.0, 8.5], [5.0, 8.5], [2.5, 5.0]
].freeze
TITLE_TEXT =
"T E R M F R O N T"
SUB_TEXT =
"Terminal FPS"
["[P] PvP", "[F] Wavesfight", "[C] Campaign", "[S] Training", "[Q] Quit"].freeze
TITLE_CEIL_C =
Color.rgb_to_256(0, 0, 95)
TITLE_FLOOR_C =
Color.rgb_to_256(28, 28, 28)
TITLE_EXECUTOR_FALLBACK =
Color.rgb_to_256(100, 60, 200)
TITLE_CRAWLER_FALLBACK =
Color.rgb_to_256(220, 140, 30)

Instance Method Summary collapse

Constructor Details

#initialize(stdout) ⇒ TitleScreen

Returns a new instance of TitleScreen.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/termfront/title_screen.rb', line 19

def initialize(stdout)
  @stdout = stdout
  @title_spin = 0.0
  @demo_wp_idx = 0
  @demo_wp_t = 0.0
  @demo_fire = 0

  mission_class = Mission::Base.campaign.first
  if mission_class
    m = mission_class.new
    @demo_map = m.map_data.map { |row| row.is_a?(Array) ? row : row.chars }.freeze
    @demo_map_h = @demo_map.size
    @demo_map_w = @demo_map[0].size
    @demo_enemies = m.enemy_defs.freeze
  end

  @static_lines_cols = 0
  @static_title_line = nil
  @static_sub_line = nil
  @static_menu_lines = nil
end

Instance Method Details

#showObject



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
# File 'lib/termfront/title_screen.rb', line 41

def show
  @title_spin = 0.0
  @demo_wp_idx = 0
  @demo_wp_t = 0.0
  @demo_fire = 0

  TerminalOutput.write_all(@stdout, TerminalOutput.begin_frame(home: true, clear: true) + TerminalOutput.end_frame)

  STDIN.raw do |stdin|
    last_render = clock - Config::RENDER_DT
    loop do
      now = clock
      @title_spin += 0.015

      if now - last_render >= Config::RENDER_DT
        render
        last_render = now
      end

      while IO.select([stdin], nil, nil, 0)
        begin
          ch = stdin.read_nonblock(64)
          ch.each_byte do |b|
            case b
            when 102, 70  then return :wavesfight
            when 115, 83  then return :singleplayer
            when 99, 67   then return :campaign
            when 112, 80  then return :pvp
            when 113, 81, 27 then return :quit
            end
          end
        rescue IO::WaitReadable
          break
        end
      end

      spent = clock - now
      remain = Config::FRAME_DT - spent
      sleep(remain) if remain > 0
    end
  end
end