rev |
line source |
me@43
|
1 #!/usr/bin/python |
me@34
|
2 import math |
me@34
|
3 import Tkinter as tk |
me@38
|
4 import body |
me@50
|
5 from body import Tank as BaseTank, Bullet |
me@34
|
6 from game import Game |
me@40
|
7 from user import User |
me@46
|
8 from vector import Vector |
me@38
|
9 |
me@51
|
10 game_size = 500, 500 |
olya_zol@54
|
11 keys1 = { |
olya_zol@52
|
12 'ocircumflex': 'base_left', |
olya_zol@52
|
13 'acircumflex': 'base_right', |
olya_zol@52
|
14 'eacute': 'turret_left', |
olya_zol@52
|
15 'oacute': 'turret_right', |
olya_zol@52
|
16 'odiaeresis': 'accelerate', |
olya_zol@52
|
17 'ucircumflex': 'decelerate', |
olya_zol@52
|
18 'division': 'fire', |
me@38
|
19 } |
olya_zol@54
|
20 |
olya_zol@54
|
21 keys2 = { |
olya_zol@54
|
22 'icircumflex': 'base_left', |
olya_zol@54
|
23 'adiaeresis': 'base_right', |
olya_zol@54
|
24 'atilde': 'turret_left', |
olya_zol@54
|
25 'ugrave': 'turret_right', |
olya_zol@54
|
26 'oslash': 'accelerate', |
olya_zol@54
|
27 'ediaeresis': 'decelerate', |
olya_zol@54
|
28 'udiaeresis': 'fire', |
olya_zol@54
|
29 } |
me@38
|
30 |
me@44
|
31 welcome = """Press F5 to start |
me@44
|
32 |
me@44
|
33 Keys are: |
olya_zol@54
|
34 |
olya_zol@54
|
35 |
olya_zol@54
|
36 User 1 : |
olya_zol@54
|
37 |
me@44
|
38 a, d -- turn tank |
me@44
|
39 q, e -- turn muzzle |
me@44
|
40 w, s -- change speed |
olya_zol@54
|
41 x -- fire |
olya_zol@54
|
42 |
olya_zol@54
|
43 User 2 : |
olya_zol@54
|
44 |
olya_zol@54
|
45 j, l -- turn tank |
olya_zol@54
|
46 u, o -- turn muzzle |
olya_zol@54
|
47 i, k -- change speed |
olya_zol@54
|
48 m -- fire |
olya_zol@54
|
49 """ |
me@44
|
50 |
me@50
|
51 class Tank(BaseTank): |
me@38
|
52 |
me@38
|
53 def on_tick(self, tanks, bullets): |
me@38
|
54 if self.user.base_left: |
olya_zol@52
|
55 self.rotate_base(-1 * body.base_angle) |
me@49
|
56 if self.user.base_right: |
me@46
|
57 self.rotate_base(body.base_angle) |
me@38
|
58 if self.user.turret_left: |
olya_zol@52
|
59 self.rotate_turret(-1 * body.turret_angle) |
me@49
|
60 if self.user.turret_right: |
me@46
|
61 self.rotate_turret(body.turret_angle) |
me@38
|
62 if self.user.accelerate: |
me@46
|
63 self.accelerate(body.speed_delta) |
me@38
|
64 if self.user.decelerate: |
olya_zol@52
|
65 self.accelerate(-1 * body.speed_delta) |
me@38
|
66 if self.user.fire: |
me@38
|
67 self.fire() |
me@34
|
68 |
me@34
|
69 class UI(object): |
me@38
|
70 |
me@34
|
71 def __init__(self): |
me@34
|
72 self.init_game() |
me@34
|
73 self.init_ui() |
me@45
|
74 self.display_welcome() |
me@34
|
75 |
me@38
|
76 def init_game(self): |
olya_zol@54
|
77 self.user1 = User(keys1) |
olya_zol@54
|
78 self.user2 = User(keys2) |
olya_zol@52
|
79 w, h = game_size |
olya_zol@54
|
80 game = self.game = Game([], [self.user1, self.user2], w, h) |
olya_zol@54
|
81 tank1 = Tank(Vector(*game_size) * 0.5, self.user1, self.game) |
olya_zol@54
|
82 tank2 = Tank(Vector(*game_size) * 0.5, self.user2, self.game) |
olya_zol@54
|
83 game.bodies.append(tank1) |
olya_zol@54
|
84 game.bodies.append(tank2) |
me@38
|
85 |
me@34
|
86 def init_ui(self): |
me@34
|
87 root = self.root = tk.Tk() |
me@47
|
88 root.bind("<KeyPress>", self.on_keypress) |
me@47
|
89 root.bind("<KeyRelease>", self.on_keyrelease) |
me@51
|
90 w, h = game_size |
me@51
|
91 canvas = self.canvas = tk.Canvas(root, |
me@51
|
92 background="black", width=w, height=h) |
me@34
|
93 canvas.pack(fill="both", expand="yes") |
me@34
|
94 |
me@44
|
95 def display_welcome(self): |
me@45
|
96 root, canvas = self.root, self.canvas |
me@41
|
97 root.update() |
me@41
|
98 w, h = canvas.winfo_width(), canvas.winfo_height() |
me@44
|
99 canvas.create_rectangle(0, 0, w, h, fill="#211") |
me@44
|
100 canvas.create_text(w/2, h/2, text=welcome, |
me@44
|
101 fill="red", justify="center", font="bold 15") |
me@41
|
102 |
me@47
|
103 def on_keypress(self, ev): |
me@41
|
104 if ev.keysym == "F5": |
me@41
|
105 self.step() |
olya_zol@54
|
106 self.user1.on_key(ev.keysym, True) |
olya_zol@54
|
107 self.user2.on_key(ev.keysym, True) |
me@47
|
108 |
me@47
|
109 def on_keyrelease(self, ev): |
olya_zol@54
|
110 self.user1.on_key(ev.keysym, False) |
olya_zol@54
|
111 self.user2.on_key(ev.keysym, False) |
me@34
|
112 |
me@34
|
113 def step(self): |
me@34
|
114 self.root.after(100, self.step) |
me@40
|
115 self.game.step() |
me@34
|
116 self.redraw() |
me@34
|
117 |
me@34
|
118 def redraw(self): |
me@34
|
119 self.canvas.delete("all") |
olya_zol@52
|
120 for i in self.game.bodies: |
olya_zol@52
|
121 p = i.position |
olya_zol@52
|
122 lt = p + Vector(-1,-1) * i.radius |
olya_zol@52
|
123 rb = p + Vector(1,1) * i.radius |
me@47
|
124 |
olya_zol@52
|
125 v1 = Vector(i.radius, 0) |
olya_zol@52
|
126 if isinstance(i, body.Tank): |
olya_zol@52
|
127 v1.phi = i.base_orientation.phi |
olya_zol@52
|
128 else : |
olya_zol@52
|
129 v1.phi = i.velocity.phi |
me@48
|
130 vb = p - v1 |
me@48
|
131 ve = p + v1 * 2 |
olya_zol@52
|
132 self.canvas.create_line(vb.x, vb.y, ve.x, ve.y, fill="darkgray", width=i.radius*2) |
me@48
|
133 |
olya_zol@52
|
134 if isinstance(i, BaseTank): |
olya_zol@52
|
135 t = i.turret * i.radius * 1.5 + p |
me@48
|
136 self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, fill="darkgreen") |
me@48
|
137 self.canvas.create_line(p.x, p.y, t.x, t.y, fill="orange", width=2) |
olya_zol@52
|
138 elif isinstance(i, Bullet): |
me@50
|
139 self.canvas.create_oval(lt.x, lt.y, rb.x, rb.y, outline="red") |
me@50
|
140 else: |
olya_zol@52
|
141 raise AssertionError("Unknown object type: %s" % i.__class__.__name__) |
me@34
|
142 |
me@34
|
143 if __name__ == "__main__": |
olya_zol@54
|
144 UI().root.mainloop() |