TanksGame.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import sys
  2. import time
  3. import Tkinter as tk
  4. from TanksField import TanksField
  5. class TanksGame(tk.Tk):
  6. def __init__(self):
  7. tk.Tk.__init__(self)
  8. self.resizable(width="NO", height="NO")
  9. self.title("Paper Warfare")
  10. #GUI
  11. self.setupGUI()
  12. #Other entities
  13. self.field = TanksField(self.canvas,nrtanks=1)
  14. self.player = self.field.player
  15. self.player_gui_listener = self.player.addListener(["gui"])
  16. #lift overlay
  17. self.canvas.tag_raise(self.overlay)
  18. #initial event binding
  19. self.bind("p", self.pausePressed)
  20. #engine
  21. self.fixed_update_time = 20 #ms
  22. self.is_paused = True
  23. self.elapsed = 0.0
  24. self.game_running = True
  25. #these two don't need to be set if we start in the paused state
  26. #self.schedule_time = dt.datetime.now()
  27. #self.after(self.fixed_update_time, self.update)
  28. """GUI Related"""
  29. def setupGUI(self):
  30. self.protocol("WM_DELETE_WINDOW", self.window_close)
  31. self.sidebar = tk.Frame(self)
  32. self.sidebar.pack(side=tk.LEFT, fill=tk.Y)
  33. w = tk.Label(self.sidebar, text="Menu", relief=tk.GROOVE, width=12)
  34. w.pack(side=tk.TOP, padx = 2, pady=2)
  35. self.keyBoard = []
  36. self.keyBoardVar = tk.IntVar()
  37. modes = [("Azerty", 0, True),("Qwerty", 1, False)]
  38. for text, mode, active in modes:
  39. b = tk.Radiobutton(self.sidebar, text=text, value=mode, variable=self.keyBoardVar, command=self.keyBoardChanged)
  40. if active : b.select()
  41. b.pack(anchor=tk.W, side=tk.TOP)
  42. self.keyBoardChanged()
  43. w = tk.Label(self.sidebar, text="State", relief=tk.GROOVE, width=12)
  44. w.pack(side=tk.TOP, padx = 2, pady=2)
  45. self.reloadState = tk.StringVar()
  46. w = tk.Label(self.sidebar, textvariable=self.reloadState, width=12)
  47. w.pack(side=tk.TOP, padx = 2, pady=2)
  48. self.setLoaded()
  49. #set up canvas, this is the actual game area
  50. canvas_width = 1000
  51. canvas_height = 600
  52. self.canvas = tk.Canvas(master=self,
  53. takefocus=1,
  54. width=canvas_width, height=canvas_height,
  55. background="white")
  56. self.canvas.pack(fill=tk.BOTH, expand=1)
  57. self.canvas.focus_set()
  58. self.background = tk.PhotoImage(file="./paper2.gif")
  59. self.canvas.create_image(0, 0, image=self.background, anchor='nw')
  60. self.overlay = self.canvas.create_text(
  61. canvas_width/2,
  62. canvas_height/2,
  63. text="Press P to Play/Pause\n\nSteering :\nAzerty = Z+S+Q+D\nQwerty = W+S+A+D\n\nCannon :\nRotate = Left + Right Arrow\nShoot = Up Arrow",
  64. font=("Helvetica", 18, "bold"), fill ="Red", justify=tk.CENTER)
  65. def hideOverlay(self):
  66. self.canvas.itemconfig(self.overlay,text="")
  67. def showPauseOverlay(self):
  68. self.canvas.itemconfig(self.overlay,text="Press P to Resume")
  69. def showEndOverlay(self):
  70. self.canvas.itemconfig(self.overlay,text="Game Over")
  71. def keyBoardChanged(self):
  72. if self.keyBoardVar.get() == 1 : self.keyBoard = ['w','s','a','d'] #qwerty
  73. else : self.keyBoard = ['z','s','q','d'] #azerty
  74. def setLoaded(self):
  75. self.reloadState.set("Ready")
  76. def setReloading(self):
  77. self.reloadState.set("Reloading...")
  78. """Event handling"""
  79. def keyPressed(self, event):
  80. event_name = None
  81. if (event.char == self.keyBoard[0]):
  82. event_name = "up-pressed"
  83. elif (event.char== self.keyBoard[1]):
  84. event_name = "down-pressed"
  85. elif (event.char == self.keyBoard[2]):
  86. event_name = "left-pressed"
  87. elif (event.char == self.keyBoard[3]):
  88. event_name = "right-pressed"
  89. elif (event.keysym == "Up"):
  90. event_name = "shoot-pressed"
  91. elif (event.keysym == "Left"):
  92. event_name = "cannon-left-pressed"
  93. elif (event.keysym == "Right"):
  94. event_name = "cannon-right-pressed"
  95. elif (event.char == 'p') :
  96. self.pausePressed(event)
  97. if self.player and event_name :
  98. self.player.event(event_name, "input")
  99. def keyReleased(self, event):
  100. event_name = None
  101. if (event.char == self.keyBoard[0]):
  102. event_name = "up-released"
  103. elif (event.char== self.keyBoard[1]):
  104. event_name = "down-released"
  105. elif (event.char == self.keyBoard[2]):
  106. event_name = "left-released"
  107. elif (event.char == self.keyBoard[3]):
  108. event_name = "right-released"
  109. elif (event.keysym == "Up"):
  110. event_name = "shoot-released"
  111. elif (event.keysym == "Left"):
  112. event_name = "cannon-left-released"
  113. elif (event.keysym == "Right"):
  114. event_name = "cannon-right-released"
  115. if self.player and event_name :
  116. self.player.event(event_name, "input")
  117. """Engine related"""
  118. def update(self):
  119. self.schedule_time = time.time()
  120. self.scheduled_update_id = self.after(self.fixed_update_time, self.update)
  121. #update child elements
  122. self.field.update(self.fixed_update_time/1000.0)
  123. #GUI update
  124. while(True) :
  125. fetched = self.player_gui_listener.fetch()
  126. if fetched is None :
  127. break
  128. else :
  129. if fetched.getName() == "reloading" :
  130. self.setReloading()
  131. elif fetched.getName() == "loaded" :
  132. self.setLoaded()
  133. elif fetched.getName() == "game_over" :
  134. self.setGameOver()
  135. if self.game_running == True :
  136. if not self.field.level_running :
  137. self.showEndOverlay()
  138. self.game_running = False
  139. def pausePressed(self, event):
  140. if self.is_paused :
  141. self.scheduled_update_id = self.after(self.fixed_update_time-(int(self.elapsed)*1000), self.update)
  142. self.hideOverlay()
  143. self.is_paused = False
  144. self.bind("<KeyPress>", self.keyPressed)
  145. self.bind("<KeyRelease>", self.keyReleased)
  146. self.unbind("p")
  147. else :
  148. self.elapsed = time.time() - self.schedule_time
  149. self.after_cancel(self.scheduled_update_id)
  150. self.showPauseOverlay()
  151. self.is_paused = True
  152. self.bind("p", self.pausePressed)
  153. self.unbind("<KeyPress>")
  154. self.unbind("<KeyRelease>")
  155. def window_close(self):
  156. #destroy code?
  157. sys.exit(0)
  158. if __name__=="__main__":
  159. game = TanksGame()
  160. game.mainloop()