Exemplo n.º 1
0
class Game(pyglet.event.EventDispatcher):
	def __init__(self):
		self.window = pyglet.window.Window(fullscreen=True)
		self.terrain = Terrain(self.window.width, self.window.height-100)
		self.players = [
			Player(name, self, i)
			for i, name in enumerate(sys.argv[1:])]
		self.moving = []
		
		# Setup events
		self.window.event(self.on_draw)
		Game.register_event_type('next_player')
		Game.register_event_type('start_moving')
		Game.register_event_type('stop_moving')
		Game.register_event_type('explosion')
		
		# Start the game.
		self.reset()
		
		# Run the f****r
		pyglet.app.run()
	
	def reset(self):
		self.terrain.reset()
		for p in self.players:
			p.reset()
		random.shuffle(self.players)
		
		for p in self.players:
			new_x = None
			while not new_x:
				new_x = int(random.uniform(20, self.window.width - 20))
				for other in self.players:
					if other != p and abs(other.pos[0] - new_x) < 50:
						new_x = None
						break
			p.pos = new_x, self.terrain.flatten(new_x)
		
		self.next_player()
	
	def next_round(self):
		for p in self.players:
			p.next_round()
		self.next_player()
	
	def next_player(self):
		live_players = list(filter(lambda p: p.alive, self.players))
		if len(live_players) < 2:
			for p in live_players:
				p.score += 10000
			self.reset()
			return
		
		for p in live_players:
			if not p.ready:
				p.take_turn()
				return
		self.moving = [
			Shot(p.pos, p.angle, p.power, p)
			for p in self.players
			if p.alive]
		pyglet.clock.schedule(self.move, 1/60)
	
	def move(self, *args, **kwargs):
		for s in self.moving:
			s.move(self)
	
	def explosion(self, x, y, r, player=None):
		self.terrain.explosion(x, y, r)
		for p in self.players:
			p.explosion(x, y, r, player)
	
	def stop_moving(self, thing):
		self.moving.remove(thing)
		if not self.moving:
			pyglet.clock.unschedule(self.move)
			self.next_round()
	
	def start_moving(self, thing):
		self.moving.append(thing)
		
	def on_draw(self):
		self.window.clear()
		self.terrain.draw(self.window.width, self.window.height-100, 100)
		for p in self.players:
			p.draw()
		for m in self.moving:
			m.draw(self.window.height-100)