| rev |
line source |
|
me@34
|
1 import math |
|
me@34
|
2 import Tkinter as tk |
|
me@38
|
3 import body |
|
me@34
|
4 from game import Game |
|
me@40
|
5 from user import User |
|
me@38
|
6 from vector import Vector, null |
|
me@38
|
7 |
|
me@38
|
8 game_size = 100, 100 |
|
me@38
|
9 keys = { |
|
me@38
|
10 'a': 'base_left', |
|
me@38
|
11 'd': 'base_right', |
|
me@38
|
12 'q': 'turret_left', |
|
me@38
|
13 'e': 'turret_right', |
|
me@38
|
14 'w': 'accelerate', |
|
me@38
|
15 's': 'decelerate', |
|
me@38
|
16 'x': 'fire', |
|
me@38
|
17 } |
|
me@38
|
18 |
|
me@38
|
19 class Tank(body.Tank): |
|
me@38
|
20 |
|
me@38
|
21 def on_tick(self, tanks, bullets): |
|
me@38
|
22 if self.user.base_left: |
|
me@38
|
23 self.rotate_base(game.delta_phi) |
|
me@38
|
24 if self.user.base_right: |
|
me@38
|
25 self.rotate_base(-game.delta_phi) |
|
me@38
|
26 if self.user.turret_left: |
|
me@38
|
27 self.rotate_turret(game.delta_phi) |
|
me@38
|
28 if self.user.turret_right: |
|
me@38
|
29 self.rotate_turret(-game.delta_phi) |
|
me@38
|
30 if self.user.accelerate: |
|
me@38
|
31 self.accelerate(game.speed_delta) |
|
me@38
|
32 if self.user.decelerate: |
|
me@38
|
33 self.accelerate(-game.speed_delta) |
|
me@38
|
34 if self.user.fire: |
|
me@38
|
35 self.fire() |
|
me@34
|
36 |
|
me@34
|
37 class UI(object): |
|
me@38
|
38 |
|
me@34
|
39 def __init__(self): |
|
me@34
|
40 self.init_game() |
|
me@34
|
41 self.init_ui() |
|
me@34
|
42 |
|
me@38
|
43 def init_game(self): |
|
me@38
|
44 self.user = User(keys) |
|
me@40
|
45 w, h = game_size |
|
me@40
|
46 self.game = Game([], [self.user], w, h) |
|
me@40
|
47 tank = Tank(null, self.user, self.game) |
|
me@38
|
48 |
|
me@34
|
49 def init_ui(self): |
|
me@34
|
50 root = self.root = tk.Tk() |
|
me@40
|
51 root.bind("<KeyPress>", self.on_key) |
|
me@34
|
52 canvas = self.canvas = tk.Canvas(root, background="black") |
|
me@34
|
53 canvas.pack(fill="both", expand="yes") |
|
me@34
|
54 |
|
me@41
|
55 root.update() |
|
me@41
|
56 w, h = canvas.winfo_width(), canvas.winfo_height() |
|
me@41
|
57 canvas.create_text(w/2, h/2, text="Press F5 to start", |
|
me@41
|
58 fill="red", justify="center", font="15") |
|
me@41
|
59 |
|
me@34
|
60 def on_key(self, ev): |
|
me@41
|
61 if ev.keysym == "F5": |
|
me@41
|
62 self.step() |
|
me@40
|
63 self.user.on_keypress(ev.keysym) |
|
me@34
|
64 |
|
me@34
|
65 def step(self): |
|
me@34
|
66 self.root.after(100, self.step) |
|
me@40
|
67 self.game.step() |
|
me@34
|
68 self.redraw() |
|
me@34
|
69 |
|
me@34
|
70 def redraw(self): |
|
me@34
|
71 self.canvas.delete("all") |
|
me@34
|
72 for body in self.game.bodies: |
|
me@34
|
73 p = body.position |
|
me@34
|
74 lt = p + Vector(-1,-1) * body.radius |
|
me@34
|
75 rb = p + Vector(1,1) * body.radius |
|
me@34
|
76 if isinstance(body, Tank): |
|
me@34
|
77 t = body.turret * body.radius + p |
|
me@34
|
78 self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, fill="green") |
|
me@34
|
79 self.canvas.create_line(p.x, p.y, t.x, t.y, fill="yellow", width=2) |
|
me@34
|
80 elif isinstance(body, Bullet): |
|
me@34
|
81 self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, fill="red") |
|
me@34
|
82 |
|
me@34
|
83 if __name__ == "__main__": |
|
me@34
|
84 UI().root.mainloop() |