Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.cmm.msu.ru/trac/tanchiki/browser/game.py?rev=52%3Ad740eff76e7e&format=txt
Дата изменения: Fri Dec 24 22:10:08 2010
Дата индексирования: Fri Feb 11 20:10:35 2011
Кодировка:
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
# print 'next position' , i.next_position
print 'update_position' , i.position
print 'velocity' , i.velocity
print 'velocity.rho', i.velocity.rho # test
print '\n'
if isinstance(i,body.Tank) == True:
print 'base_orientation' , i.base_orientation

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
if isinstance(i, body.Bullet) == True:
print 'Bullet', i

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):
# print 'collision'
# 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()
body1.on_death()
else :
if isinstance(body2, body.Tank) == True :
body2.on_hit()
body2.on_death()

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()
print 'wall' #test

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()
print 'respawn'
print i.tank.strength , i.tank.position
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
print i.tank.strength , i.tank.position