Ejemplo n.º 1
0
class Controller(ConnectionListener):

	def __init__(self):

		os.environ['SDL_VIDEO_CENTERED'] = '1'

		pygame.init()

		self.servtype = "LAN"
		self.pumpthejam = False
		self.clientid = None
		self.gameid = None
		self.connected = False
		self.host = socket.gethostbyname(socket.gethostname())
		self.port = 8000
		self.ctype = ""
		self.nickname = "Per Gessle"
		self.allready = False
		self.joined = ""

		#KEYMAPPING AND EVENT MAPPING
		self.keymap = {}
		self.keymap_singlepress = {}
		self.events = {}

		#NECESSARY VARIABLES
		self.state = S_MENU
		self.screen = pygame.display.set_mode(SCREEN_SIZE) #pygame.FULLSCREEN | pygame.DOUBLEBUF
		self.caption = pygame.display.set_caption(CAPTION)
		self.font = pygame.font.SysFont('monospace', 20)
		self.clock = pygame.time.Clock()

		#SELF DEPENDANT
		self.world = World(self.screen)
		self.menu = Menu(self)
		#Mouse.load_cursor(self.screen)

		Sound.load_sounds()
		Sound.Sounds["mainmenu"].play()

		self.register_eventhandler(pygame.QUIT, self.quit)
		self.register_key(pygame.K_ESCAPE, self.quit, singlepress = True)

		"""---------------------------------------------------WILL BE MOVED TO MENU STATE----------------------------------------------------------"""
		self.player = Player(self, (500,500), pygame.K_1, pygame.K_2, pygame.K_3, pygame.K_4)
		self.player.spells[0] = Firebolt(1)
		self.player.spells[1] = LightningStrike(1)
		self.player.spells[2] = Firebolt(1)
		self.player.spells[3] = Firebolt(1)
		SpellWindow.load_windows(self)

		"""---------------------------------------------------WILL BE MOVED TO MENU STATE----------------------------------------------------------"""

	def run(self):
		while True:

			#MOUSE AND KEYBOARD REGISTER UPDATE (pygame)
			Mpos = pygame.mouse.get_pos() # (x, y)
			self.keys = pygame.key.get_pressed()
			self.mouse = pygame.mouse.get_pressed()

			"""-------------------------------------MENU------------------------------------------"""

			if self.state == S_MENU:

				for event in pygame.event.get():

					for event_type, callback in self.events.iteritems():
						if event.type == event_type:
							callback(event)

				self.menu.update_and_draw()
				
			"""-------------------------------------GAME------------------------------------------"""

			if self.state == S_GAME:

				for event in pygame.event.get():

					for event_type, callback in self.events.iteritems():
						if event.type == event_type:
							callback(event)

					if event.type == pygame.KEYDOWN:
						for event_key in self.keymap_singlepress.iterkeys():
							if event.key == event_key:
								self.keymap_singlepress[(event_key)](event)

				for event_key in self.keymap.iterkeys():
					if self.keys[event_key]:
						self.keymap[(event_key)]()

				#AFTER ALL THE F*****G FOR LOOPS
				self.world.draw()
				self.player.update()
				self.player.draw()
				Enemy.draw_enemies()
				Spell.update_spells(self.screen)
				SpellWindow.draw()

				self.TellNetwork_playerpos()
				connection.Pump()
				self.Pump()
				
			#ESSENTIAL STUFF
			if self.pumpthejam:
				self.pump()

			pygame.display.flip()
			self.clock.tick(FPS)

	"""-------------------------------------FUNCTIONS------------------------------------------"""

	def register_key(self, event_key, callback, singlepress = False):
		if singlepress == False:
			self.keymap[(event_key)] = callback
		else:
			self.keymap_singlepress[(event_key)] = callback

	def register_eventhandler(self, event_type, callback):
		self.events[event_type] = callback

	def start_game(self):
		self.player.wake()
		self.state = S_GAME

	def pump(self):
		connection.Pump()
		self.Pump()

	def quit(self, event):
		pygame.quit()
		sys.exit()



	"""-------------------------------------NETWORK------------------------------------------"""


	def Network_response(self, data):
		self.clientid = data["clientid"]
		self.Send({"action" : "init", "type" : self.ctype, "clientid" : self.clientid, "name" : self.nickname})
		self.connected = True

	def Network_playerjoin(self, data):
		if self.joined == "":
			self.joined += str(data["name"])
		else:
			self.joined = self.joined + ", " + str(data["name"])

	def Network_allready(self, data):
		pass
	def Network_newenemy(self, data):
		id_ = data["clientid"]
		Enemy(id_, self.screen)

	def Network_startgame(self, data):
	    self.start_game()
	    self.menu.state = None

	def Network_enemypos(self, data):
		clientid = data["clientid"]
		x, y = data["x"], data["y"]
		for enemy in Enemy.List:
			if enemy.clientid == clientid:
				enemy.x, enemy.y = x, y

	def TellNetwork_playerpos(self):
		self.Send({"action" : "playerpos", "clientid" : self.clientid, "x" : self.player.x, "y" : self.player.y})