Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/tanchiki/raw-annotate/0b4a191acd89/tk_ui.py
Дата изменения: Unknown
Дата индексирования: Fri Feb 11 15:29:35 2011
Кодировка:

me@34: import math
me@34: import Tkinter as tk
me@38: import body
me@34: from game import Game
me@40: from user import User
me@38: from vector import Vector, null
me@38:
me@38: game_size = 100, 100
me@38: keys = {
me@38: 'a': 'base_left',
me@38: 'd': 'base_right',
me@38: 'q': 'turret_left',
me@38: 'e': 'turret_right',
me@38: 'w': 'accelerate',
me@38: 's': 'decelerate',
me@38: 'x': 'fire',
me@38: }
me@38:
me@38: class Tank(body.Tank):
me@38:
me@38: def on_tick(self, tanks, bullets):
me@38: if self.user.base_left:
me@38: self.rotate_base(game.delta_phi)
me@38: if self.user.base_right:
me@38: self.rotate_base(-game.delta_phi)
me@38: if self.user.turret_left:
me@38: self.rotate_turret(game.delta_phi)
me@38: if self.user.turret_right:
me@38: self.rotate_turret(-game.delta_phi)
me@38: if self.user.accelerate:
me@38: self.accelerate(game.speed_delta)
me@38: if self.user.decelerate:
me@38: self.accelerate(-game.speed_delta)
me@38: if self.user.fire:
me@38: self.fire()
me@34:
me@34: class UI(object):
me@38:
me@34: def __init__(self):
me@34: self.init_game()
me@34: self.init_ui()
me@34:
me@38: def init_game(self):
me@38: self.user = User(keys)
me@40: w, h = game_size
me@40: self.game = Game([], [self.user], w, h)
me@40: tank = Tank(null, self.user, self.game)
me@38:
me@34: def init_ui(self):
me@34: root = self.root = tk.Tk()
me@40: root.bind("", self.on_key)
me@34: canvas = self.canvas = tk.Canvas(root, background="black")
me@34: canvas.pack(fill="both", expand="yes")
me@34:
me@41: root.update()
me@41: w, h = canvas.winfo_width(), canvas.winfo_height()
me@41: canvas.create_text(w/2, h/2, text="Press F5 to start",
me@41: fill="red", justify="center", font="15")
me@41:
me@34: def on_key(self, ev):
me@41: if ev.keysym == "F5":
me@41: self.step()
me@40: self.user.on_keypress(ev.keysym)
me@34:
me@34: def step(self):
me@34: self.root.after(100, self.step)
me@40: self.game.step()
me@34: self.redraw()
me@34:
me@34: def redraw(self):
me@34: self.canvas.delete("all")
me@34: for body in self.game.bodies:
me@34: p = body.position
me@34: lt = p + Vector(-1,-1) * body.radius
me@34: rb = p + Vector(1,1) * body.radius
me@34: if isinstance(body, Tank):
me@34: t = body.turret * body.radius + p
me@34: self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, fill="green")
me@34: self.canvas.create_line(p.x, p.y, t.x, t.y, fill="yellow", width=2)
me@34: elif isinstance(body, Bullet):
me@34: self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, fill="red")
me@34:
me@34: if __name__ == "__main__":
me@34: UI().root.mainloop()