PageRenderTime 56ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/game-prototype/duckHunt.rb

https://github.com/amozoss/ece3710
Ruby | 283 lines | 228 code | 37 blank | 18 comment | 36 complexity | 9a800aef81968f9f412ef2acc25dd3fb MD5 | raw file
  1. #!/usr/bin/env ruby
  2. require 'rubygems'
  3. require 'rubygame'
  4. require 'observer'
  5. require_relative 'duck'
  6. require_relative 'serialPort'
  7. YELLOW = [ 0xee, 0xee, 0x33]
  8. RED = [ 0xff, 0x00, 0x00]
  9. BLUE = [ 0x00, 0x00, 0xff]
  10. GREEN = [ 0x00, 0xff, 0x00]
  11. PURPLE = [ 0xff, 0x00, 0xff]
  12. class Game
  13. include Rubygame
  14. def initialize
  15. @demo = true
  16. @serialEnable = false
  17. @player1Score = 0
  18. @player2Score = 0
  19. if @demo
  20. @duckCount = 5
  21. @frameDelay = 30
  22. else
  23. @duckCount = 5
  24. @frameDelay = 2
  25. end
  26. TTF.setup
  27. @point_size = 40
  28. $font = TTF.new "Verdana.ttf", @point_size
  29. @resolution = [1024, 768]
  30. #@resolution = [800, 600]
  31. @screen = Screen.open @resolution, 0, [HWSURFACE, DOUBLEBUF]
  32. #@backgroundImage = "bg800x600.jpg"
  33. if @demo
  34. @backgroundImage = "bg1024x768.jpg"
  35. @background = Surface.load @backgroundImage
  36. else
  37. @background = Surface.new @resolution
  38. end
  39. @black = Surface.new @resolution
  40. @black.blit @screen,[0,0]
  41. @background.blit @screen,[0,0]
  42. @screen.title = "Duck Hunt"
  43. unless @screen.respond_to? :draw_box
  44. puts "Don't have SDL_gfx available, can't use draw_box"
  45. puts "Exiting..."
  46. exit 1
  47. end
  48. @drawOffset = -1
  49. @killDuck = false
  50. if (@serialEnable)
  51. @watcher = SerialObservable.new
  52. @watcher.start_observing
  53. @watcher.add_observer(self)
  54. end
  55. @clock = Clock.new
  56. @clock.target_framerate = 60
  57. @clock.enable_tick_events
  58. @eventQueue = EventQueue.new
  59. @eventQueue.enable_new_style_events #enables rubygame 3.0
  60. @ducks=Sprites::Group.new
  61. @walls=Sprites::Group.new
  62. Sprites::UpdateGroup.extend_object @ducks
  63. # different color to help debug
  64. duck1 = Duck.new @screen, YELLOW
  65. @ducks << duck1
  66. duck2 = Duck.new @screen, RED
  67. @ducks << duck2
  68. duck3 = Duck.new @screen, GREEN
  69. @ducks << duck3
  70. duck4 = Duck.new @screen, BLUE
  71. @ducks << duck4
  72. duck5 = Duck.new @screen, PURPLE
  73. @ducks << duck5
  74. #for i in 1..@duckCount
  75. #duck1 = Duck.new @screen [ 200, i*100 , 110]
  76. #@ducks << duck1
  77. #end
  78. end
  79. def update(newData)
  80. puts "#{newData}"
  81. if newData =~ /^\bPlayer\b\s+\btrigger\b\s+(\d+)$/
  82. @hitCount = 1
  83. @whoPulledTrigger = $1
  84. end
  85. if newData =~ /^\bPlayer1\b\s+\bsens\b\s+(\d+)$/
  86. @player1Hit = $1
  87. end
  88. if newData =~ /^\bPlayer2\b\s+\bsens\b\s+(\d+)$/
  89. @player2Hit = $1
  90. end
  91. end
  92. # handles the drawing when the trigger is pulled
  93. def hit hits
  94. # blackout the screen
  95. @watcher.observe_sensors if @serialEnable
  96. if hits >= 1 and hits < @frameDelay
  97. @black.blit @screen,[0,0]
  98. hits += 1
  99. @ducks.map &:color_trans
  100. end
  101. # Draw each duck as a white square
  102. if hits >= @frameDelay and hits < @frameDelay*(@ducks.count) + @frameDelay
  103. puts "******** drawOffset: #{@drawOffset} ****************"
  104. if hits % @frameDelay == 0
  105. @drawOffset += 1
  106. # displays each duck for the alloted frameDelay
  107. @ducks.each_with_index do |duck, index|
  108. if (index == @drawOffset )
  109. puts "drawOffset: #{@drawOffset}, index that is white: #{index}"
  110. duck.color_white()
  111. else
  112. duck.color_black()
  113. duck.draw @screen
  114. duck.color_trans()
  115. end
  116. end
  117. end
  118. puts "P1 #{@whoPulledTrigger}, #{@player1Hit}"
  119. puts "P2 #{@whoPulledTrigger}, #{@player2Hit}"
  120. # who killed the duck
  121. if @whoPulledTrigger == "1" and @player1Hit == "1"
  122. @player1Score += 1
  123. @whoPulledTrigger = "0"
  124. @killDuck = true
  125. end
  126. if @whoPulledTrigger == "2" and @player2Hit == "1"
  127. @player2Score += 1
  128. @whoPulledTrigger = "0"
  129. @killDuck = true
  130. end
  131. @player1Hit = "3"
  132. @player2Hit = "3"
  133. if @killDuck == true
  134. #@ducks[@drawOffset].alive = false
  135. @ducks.delete_at @drawOffset
  136. @killDuck = false
  137. end
  138. hits += 1
  139. # Go back to normal
  140. elsif hits >= @frameDelay*(@ducks.count) + @frameDelay
  141. @drawOffset = -1
  142. @whoPulledTrigger = 0
  143. @ducks.map &:duck
  144. @background.blit @screen, [0,0]
  145. hits = 0
  146. end
  147. return hits
  148. end
  149. def update_score
  150. player1_score_text = $font.render_utf8 @player1Score.to_s, true, YELLOW
  151. player2_score_text = $font.render_utf8 @player2Score.to_s, true, YELLOW
  152. player1_score_text.blit @screen, [0,0]
  153. player2_score_text.blit @screen, [320,0]
  154. end
  155. # returns -1, 0 ,1
  156. def randLevelOne
  157. a = rand(3)
  158. a = -1 if a == 2
  159. return a
  160. end
  161. # returns -1, 1
  162. def randLevelTwo
  163. a = rand(2)
  164. a = -1 if a == 0
  165. return a
  166. end
  167. def start
  168. shouldRun = true
  169. count = 0
  170. sec = 1
  171. @hitCount = 0
  172. while shouldRun
  173. secondsPassed = @clock.tick().seconds
  174. @eventQueue.each do |event|
  175. case event
  176. when Events::QuitRequested
  177. shouldRun = false
  178. when Events::MousePressed
  179. puts "Pressed #{event.button} at #{event.pos}"
  180. when Events::KeyPressed
  181. case event.key
  182. when :escape
  183. @screen.exit
  184. puts "exit"
  185. when :f
  186. Screen.close
  187. @resolution = Screen.get_resolution
  188. @screen = Screen.open @resolution, 0, [HWSURFACE, DOUBLEBUF, FULLSCREEN]
  189. if @demo
  190. @background = Surface.load @backgroundImage
  191. else
  192. @background = Surface.new @resolution
  193. end
  194. @background.blit @screen,[0,0]
  195. when :d
  196. @ducks.map &:duck
  197. duck1 = Duck.new @screen, [ 200, 100 , 110]
  198. @ducks << duck1
  199. when :b
  200. @ducks.map &:color_black
  201. when :o
  202. @ducks.map &:color_original
  203. when :u
  204. @ducks.map &:speed_up
  205. when :s
  206. @ducks.map &:speed_down
  207. when :c
  208. @ducks.undraw @screen, @background
  209. when :w
  210. @ducks.map &:color_white
  211. when :h
  212. @hitCount = 1
  213. end
  214. end
  215. end
  216. count += secondsPassed
  217. if count > sec
  218. @ducks.map &:switch_vel
  219. end
  220. if count > sec
  221. count = 0
  222. num = rand(3) + 0.5
  223. num = 1 if num == 2.5
  224. sec = num
  225. end
  226. if @hitCount == 0
  227. @ducks.undraw @screen, @background
  228. @ducks.update secondsPassed, @walls
  229. @watcher.observe_trigger if @serialEnable
  230. update_score
  231. end
  232. @ducks.draw @screen
  233. # call the hit code
  234. @hitCount = self.hit @hitCount
  235. if @ducks.size == 0
  236. 5.times do
  237. duck1 = Duck.new @screen, [ 200, 100 , 110]
  238. @ducks << duck1
  239. end
  240. end
  241. @screen.flip
  242. end
  243. end
  244. end
  245. game = Game.new
  246. game.start