Guest User

Untitled

a guest
Oct 20th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. require 'ffi-ncurses'
  2.  
  3. module Helpers
  4. # Run a code block every interval seconds
  5. def every(interval, &code)
  6. Thread.new do
  7. loop do
  8. sleep interval
  9. code.call
  10. end
  11. end
  12. end
  13.  
  14. # Run a code block now and then every interval seconds thereafter
  15. def now_and_every(interval, &code)
  16. code.call
  17. every(interval, &code)
  18. end
  19.  
  20. # Use ncurses to print text to the screen
  21. def cprint(text, options = {})
  22. options = { x: 0, y: 0 }.merge(options)
  23. FFI::NCurses.move(options[:y], options[:x])
  24. FFI::NCurses.attron FFI::NCurses.COLOR_PAIR(1)
  25. FFI::NCurses.addstr(text)
  26. end
  27. end
  28.  
  29. module MyProgram
  30. class Window
  31. include FFI::NCurses
  32.  
  33. attr_reader :screen
  34.  
  35. def initialize
  36. # Various screen setup
  37. @screen = initscr
  38. @in_screen = true
  39. curs_set 0
  40. noecho
  41. raw
  42. cbreak
  43. keypad @screen, 1
  44. timeout 0
  45.  
  46. # Clear the screen
  47. clear
  48. refresh
  49.  
  50. # Ensure curses clears the screen up nicely when the app ends
  51. at_exit { endwin if @in_screen }
  52. end
  53.  
  54. def close
  55. @in_screen = false
  56. endwin
  57. end
  58.  
  59. def maxx
  60. @screen.getmaxx(@screen)
  61. end
  62.  
  63. def maxy
  64. @screen.getmaxy(@screen)
  65. end
  66.  
  67. end
  68. end
  69.  
  70. window = MyProgram::Window.new
  71.  
  72. include FFI::NCurses
  73. include Helpers
  74.  
  75. @angle = 0
  76.  
  77. # Twice per second, print a random number onto the screen
  78. now_and_every(1.0 / 60) do
  79. clear
  80. s = "-" * window.maxx
  81. s[((s.length / 2) + Math.sin(@angle / 57.296) * (s.length / 2)).to_i] = "_"
  82. cprint s, x: 0, y: 10
  83.  
  84. s = "-" * window.maxx
  85. s[((s.length / 2) + Math.cos(@angle / 57.296) * (s.length / 2)).to_i] = "_"
  86. cprint s, x: 0, y: 12
  87. refresh
  88. end
  89.  
  90. every(1.0 / 120) do
  91. @angle = (@angle + 1) % 360
  92. end
  93.  
  94. # Sit around waiting for input
  95. loop do
  96. case k = getch
  97. when 27, 'q'.ord
  98. exit
  99. end
  100. end
Add Comment
Please, Sign In to add comment