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

me@43: #!/usr/bin/python
me@34: import math
me@34: import Tkinter as tk
me@38: import body
me@50: from body import Tank as BaseTank, Bullet
me@34: from game import Game
me@40: from user import User
me@46: from vector import Vector
me@38:
me@51: game_size = 500, 500
olya_zol@54: keys1 = {
olya_zol@52: 'ocircumflex': 'base_left',
olya_zol@52: 'acircumflex': 'base_right',
olya_zol@52: 'eacute': 'turret_left',
olya_zol@52: 'oacute': 'turret_right',
olya_zol@52: 'odiaeresis': 'accelerate',
olya_zol@52: 'ucircumflex': 'decelerate',
olya_zol@52: 'division': 'fire',
me@38: }
olya_zol@54:
olya_zol@54: keys2 = {
olya_zol@54: 'icircumflex': 'base_left',
olya_zol@54: 'adiaeresis': 'base_right',
olya_zol@54: 'atilde': 'turret_left',
olya_zol@54: 'ugrave': 'turret_right',
olya_zol@54: 'oslash': 'accelerate',
olya_zol@54: 'ediaeresis': 'decelerate',
olya_zol@54: 'udiaeresis': 'fire',
olya_zol@54: }
me@38:
me@44: welcome = """Press F5 to start
me@44:
me@44: Keys are:
olya_zol@54:
olya_zol@54:
olya_zol@54: User 1 :
olya_zol@54:
me@44: a, d -- turn tank
me@44: q, e -- turn muzzle
me@44: w, s -- change speed
olya_zol@54: x -- fire
olya_zol@54:
olya_zol@54: User 2 :
olya_zol@54:
olya_zol@54: j, l -- turn tank
olya_zol@54: u, o -- turn muzzle
olya_zol@54: i, k -- change speed
olya_zol@54: m -- fire
olya_zol@54: """
me@44:
me@50: class Tank(BaseTank):
me@38:
me@38: def on_tick(self, tanks, bullets):
me@38: if self.user.base_left:
olya_zol@52: self.rotate_base(-1 * body.base_angle)
me@49: if self.user.base_right:
me@46: self.rotate_base(body.base_angle)
me@38: if self.user.turret_left:
olya_zol@52: self.rotate_turret(-1 * body.turret_angle)
me@49: if self.user.turret_right:
me@46: self.rotate_turret(body.turret_angle)
me@38: if self.user.accelerate:
me@46: self.accelerate(body.speed_delta)
me@38: if self.user.decelerate:
olya_zol@52: self.accelerate(-1 * body.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@45: self.display_welcome()
me@34:
me@38: def init_game(self):
olya_zol@54: self.user1 = User(keys1)
olya_zol@54: self.user2 = User(keys2)
olya_zol@52: w, h = game_size
olya_zol@54: game = self.game = Game([], [self.user1, self.user2], w, h)
olya_zol@54: tank1 = Tank(Vector(*game_size) * 0.5, self.user1, self.game)
olya_zol@54: tank2 = Tank(Vector(*game_size) * 0.5, self.user2, self.game)
olya_zol@54: game.bodies.append(tank1)
olya_zol@54: game.bodies.append(tank2)
me@38:
me@34: def init_ui(self):
me@34: root = self.root = tk.Tk()
me@47: root.bind("", self.on_keypress)
me@47: root.bind("", self.on_keyrelease)
me@51: w, h = game_size
me@51: canvas = self.canvas = tk.Canvas(root,
me@51: background="black", width=w, height=h)
me@34: canvas.pack(fill="both", expand="yes")
me@34:
me@44: def display_welcome(self):
me@45: root, canvas = self.root, self.canvas
me@41: root.update()
me@41: w, h = canvas.winfo_width(), canvas.winfo_height()
me@44: canvas.create_rectangle(0, 0, w, h, fill="#211")
me@44: canvas.create_text(w/2, h/2, text=welcome,
me@44: fill="red", justify="center", font="bold 15")
me@41:
me@47: def on_keypress(self, ev):
me@41: if ev.keysym == "F5":
me@41: self.step()
olya_zol@54: self.user1.on_key(ev.keysym, True)
olya_zol@54: self.user2.on_key(ev.keysym, True)
me@47:
me@47: def on_keyrelease(self, ev):
olya_zol@54: self.user1.on_key(ev.keysym, False)
olya_zol@54: self.user2.on_key(ev.keysym, False)
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")
olya_zol@52: for i in self.game.bodies:
olya_zol@52: p = i.position
olya_zol@52: lt = p + Vector(-1,-1) * i.radius
olya_zol@52: rb = p + Vector(1,1) * i.radius
me@47:
olya_zol@52: v1 = Vector(i.radius, 0)
olya_zol@52: if isinstance(i, body.Tank):
olya_zol@52: v1.phi = i.base_orientation.phi
olya_zol@52: else :
olya_zol@52: v1.phi = i.velocity.phi
me@48: vb = p - v1
me@48: ve = p + v1 * 2
olya_zol@52: self.canvas.create_line(vb.x, vb.y, ve.x, ve.y, fill="darkgray", width=i.radius*2)
me@48:
olya_zol@52: if isinstance(i, BaseTank):
olya_zol@52: t = i.turret * i.radius * 1.5 + p
me@48: self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, fill="darkgreen")
me@48: self.canvas.create_line(p.x, p.y, t.x, t.y, fill="orange", width=2)
olya_zol@52: elif isinstance(i, Bullet):
me@50: self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, outline="red")
me@50: else:
olya_zol@52: raise AssertionError("Unknown object type: %s" % i.__class__.__name__)
me@34:
me@34: if __name__ == "__main__":
olya_zol@54: UI().root.mainloop()