Esempio n. 1
0
class GameSpace:
	def __init__(self, mazesize=20):
		# game characters
		self.p1 = 'H'
		self.p2 = 'G'
		self.exit = 'E'

		# game maze
		self.maze = Maze(mazesize)
		self.boot = 1
		self.size = int()

		# game objects
		self.player = None
		self.clock = None

		# game objects
		pygame.init()
                self.exit_sprite = pygame.image.load("../images/exit.png")
                self.exit_rect = self.exit_sprite.get_rect()
                self.gameover_sprite = pygame.image.load("../images/gameover.png")
                self.gameover_rect = self.gameover_sprite.get_rect()
                self.gameover_rect = self.gameover_rect.move(SCREEN_SIZE/4, SCREEN_SIZE/4)
		self.gameoverl_sprite = pygame.image.load("../images/gameover_l.png")
                self.gameoverl_rect = self.gameoverl_sprite.get_rect()
                self.gameoverl_rect = self.gameoverl_rect.move(SCREEN_SIZE/4, SCREEN_SIZE/4)
                self.bg = pygame.image.load("../images/background.png")
                self.bg_rect = self.bg.get_rect()
		self.wait_screen = pygame.image.load("../images/wait_screen.png")
                self.wait_rect = self.wait_screen.get_rect()
                #self.bg_rect = self.bg_rect.move(SCREEN_SIZE/2, SCREEN_SIZE/2)

		self.size = self.width, self.height = SCREEN_SIZE, SCREEN_SIZE
                self.green = 0, 255, 0
		self.connected = 0

		self.opponent = [(MAZE_SIZE/2 - 1) * WALL_SIZE * SCALE, 0, "../images/ghost_down.png"]
		self.ghostImage = pygame.image.load(self.opponent[2])
		self.ghostRect = self.ghostImage.get_rect()		
		self.ghostRect.centerx = self.opponent[0]
		self.ghostRect.centery = self.opponent[1]
		
		# network
		self.ghostProtocol = None

	def setup(self):
		# generate maze
		self.maze.generate()
		size = self.maze.getSize()

		# send data to ghost
		pd = pickle.dumps(self.maze)
		self.ghostProtocol.transport.write(pd)

		# set character start positions
		self.maze.setPos(size-1, size/2-1, self.p1)	# human
		self.maze.setPos(0, size/2-1, self.p2)	   	# ghost

		# set exit (try middle if path, otherwise on edge)
		if self.maze.getPos(size/2-1, size/2-1) == self.maze.path:
			self.maze.setPos(size/2-1, size/2-1, self.exit)
		else:
			side = randint(0,1)
			i = 0

			if side == 0:
				# set on left side
				while i < size:
					if self.maze.getPos(i, 0) == self.maze.path:
						self.maze.setPos(i, 0, self.exit)
						break
					i += 1
			else:
				# set on right side
				while i < self.size:
					if self.maze.getPos(i, size-1) == self.maze.path:
						self.maze.setPos(i, size-1, self.exit)
						break
					i += 1

		#self.maze.display()

		# reset data
		self.walls = []
		self.game_over = 0
		self.lose = 0
		self.break_flag = 0

		# music 
                pygame.mixer.music.load("../music/horror.wav")
                pygame.mixer.music.play(-1, 0.0)
		return

	def main(self):
		# establish connection with ghost
		ghostFactory = GhostFactory(self)
		reactor.listenTCP(GHOST_PORT, ghostFactory)

		# Initialize screen window
		pygame.display.set_caption("PATH")
		
		self.screen = pygame.display.set_mode(self.size)
		pygame.key.set_repeat(1, 100)
		self.screen_rect = self.screen.get_rect()

		# set looping call tick
                tick = LoopingCall(self.gameloop)
                tick.start(1/60)

		reactor.run()

	def gameloop(self):
		if self.connected != 1:
			self.screen.blit(self.wait_screen, self.wait_rect)
                        pygame.display.flip()

		elif self.boot == 1:
			self.setup()

			# maze display
			r = 0
			while r < self.maze.getSize():
				c = 0
				while c < self.maze.getSize():
					if self.maze.getPos(r, c) == self.maze.wall:
						rockWall = Wall()
						height = rockWall.rect.size
						rockWall.rect = rockWall.rect.move(height[0] * c, height[0] * r)
						self.walls.append(rockWall)
					elif self.maze.getPos(r,c) == self.exit:
						self.exit_rect = self.exit_rect.move(WALL_SIZE * c, WALL_SIZE * r)
					c += 1
				r += 1

			# Pygame Objects
			self.clock = pygame.time.Clock()
			self.player = Player()
			self.boot = 0
		
		else:
			# Game Loop Logic	   
			if self.break_flag == 1:
				self.boot = 1
				# temporary
				os._exit(0)
		
			#frame rate
			self.clock.tick(60)

			#check user inputs
			for event in pygame.event.get():
				if event.type == KEYDOWN and self.game_over == 0:
					self.player.move(event.key)
					msg = PlayerMessage(self.player.rect.centerx, self.player.rect.centery, self.player.imagePath)
					self.ghostProtocol.transport.write(pickle.dumps(msg))
				elif event.type == KEYDOWN and self.game_over == 1:
					if event.key == K_n:
						sys.exit()
					elif event.key == K_y:
						self.break_flag = 1
				elif event.type == pygame.QUIT:
					os._exit(0)

			#flush to screen and swap buffers
			self.screen.fill(self.green)
			self.screen.blit(self.bg, self.bg_rect)
			for w in self.walls:
				self.screen.blit(w.image, w.rect)

				# check for wall collisions
				if self.player.rect.colliderect(w.rect):
					self.player.setLastPosition() # set to last non-collision position

				if self.player.rect.colliderect(self.exit_rect):
					pygame.mixer.music.stop()
					self.game_over = 1
					self.player.setLastPosition()
					pygame.mixer.music.load("../music/win.wav")
					pygame.mixer.music.play(1, 0.0)
					#sys.exit()

			self.screen.blit(self.exit_sprite, self.exit_rect)
			self.screen.blit(self.player.image, self.player.rect)
			self.ghostImage = pygame.image.load(self.opponent[2])
			self.ghostRect.centerx = self.opponent[0]
			self.ghostRect.centery = self.opponent[1]
			self.screen.blit(self.ghostImage, self.ghostRect)
			if self.ghostRect.colliderect(self.player.rect):
				self.game_over = 1
				self.lose = 1
			if self.game_over == 0:
				self.player.light.drawCircle()
				self.screen.blit(self.player.light.mask, (0,0))
			elif self.game_over == 1 and self.lose == 0:
				self.player.light.mask.fill((0,0, 0, 190))
				self.screen.blit(self.player.light.mask, (0,0))
				self.screen.blit(self.gameover_sprite, self.gameover_rect)
			elif self.game_over == 1 and self.lose == 1:
				self.player.light.mask.fill((0,0, 0, 190))
                                self.screen.blit(self.player.light.mask, (0,0))
                                self.screen.blit(self.gameoverl_sprite, self.gameoverl_rect)

			self.player.rect.clamp_ip(self.screen_rect)
			pygame.display.flip()