Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.cmm.msu.su/trac/tanchiki/browser/game.py?format=txt
Дата изменения: Sat Dec 25 01:51:31 2010
Дата индексирования: Tue Oct 2 10:50:22 2012
Кодировка:
import vector
import body
import time
import random

other_tanks = []
bullets = []
width = 500
height = 500

class Game(object):
def __init__(self, bodies, users, width, height):
self.bodies = bodies
self.users = users
self.width = width
self.height = height

def step(self):
self.next_positions()
self.check_collisions()
self.check_walls()
self.update_positions()
self.invoke_ticks()
self.respawn()
self.update_velocities()
# for i in self.bodies :
# print i # test
# print 'next position' , i.next_position # test
# print 'update_position' , i.position # test
# print 'velocity' , i.velocity # test
# print 'velocity.rho', i.velocity.rho # test
# if isinstance(i,body.Tank) == True: # test
# print 'base_orientation' , i.base_orientation # test
# print '\n'

def update_velocities(self):
for i in self.bodies:
if isinstance(i, body.Tank):
if abs(i.velocity) > 1e-10 :
i.velocity = i.velocity - i.velocity.normalize()*body.acceleration
else :
i.velocity.rho = 0

def next_positions(self):
delta_t = 1
for i in self.bodies:
i.next_position = i.position + i.velocity*body.delta_t

def check_collisions(self):
for i in self.bodies:
for j in self.bodies:
if self.collides(i,j) == True :
self.handle_collision(i,j)

def collides(self,body1,body2):
if (abs(body1.next_position - body2.next_position) <= (body1.radius + body2.radius)):
if (body1 != body2):
return True
else :
return False
else :
return False

def handle_collision(self,body1,body2):
if isinstance(body1, body.Tank) == True :
if isinstance(body2, body.Tank) == True :
body1.on_collision(body2)
else :
body1.on_hit(body2)
body1.on_death()
self.bodies.remove(body2)
else :
if isinstance(body2, body.Tank) == True :
body2.on_hit(body2)
body2.on_death()
self.bodies.remove(body1)

def check_walls(self):
for i in self.bodies :
if ((i.next_position.x - i.radius) <= 0) or ((i.next_position.y - i.radius) <= 0) or ((i.next_position.x + i.radius) >= self.width) or ((i.next_position.y + i.radius) >= self.height) :
i.on_wall()

def update_positions(self):
for i in self.bodies:
i.position = i.next_position

def invoke_ticks(self):
for i in self.bodies :
if isinstance(i, body.Tank) :
i.on_tick([], [])


def respawn(self):
for i in self.users :
if i.tank.strength == 0 :
i.tank.on_spawn()
i.tank.strength = 1
i.tank.velocity = vector.null
i.tank.position.x = random.randint(i.tank.radius , width - i.tank.radius)
i.tank.position.y = random.randint(i.tank.radius , height - i.tank.radius)
i.tank.velocity = vector.null