コード例 #1
0
class GS_Editor(GameState):
	def __init__(self, kernel, gsm, levelName):
		GameState.__init__(self, "Editor", kernel, gsm)

		self.mLevelName = levelName
		self.mLevel = Level(kernel, 650)

		self.mEntityBox = pygame.Rect(650, 0, 150, 600)

		self.mCurrentEntity = None
		self.mGhostEntity = None

		self.mSelectedEntity = None
		self.mEntitySelects = []
		self.mAvailableEntities = [
			"Bee",
			"Box",
			"RedCap",
			"BlueCap",
			"GoldCap",
			"Hive"
		]

		self.mSaveLevelImage, self.mSaveLevelRect = kernel.ImageManager().LoadImage("saveLevel.bmp", False)
		self.mSaveLevelRect.topleft = (725  - (self.mSaveLevelRect.width / 2), 570)
		
		self.mMainMenuImage, self.mMainMenuRect = kernel.ImageManager().LoadImage("mainmenu_ed.bmp", False)
		self.mMainMenuRect.topleft = (725  - (self.mSaveLevelRect.width / 2), 540)

		self.mGroundLevel = 570

		self.mScrollDirection = 0

		self.mFont = pygame.font.SysFont("Helvetica", 16, True)

	def Initialize(self):
		self.mLevel.LoadLevel(self.mLevelName)

		currentHeight = 10
		for i in range(len(self.mAvailableEntities)):
			module = __import__(self.mAvailableEntities[i])
			_EntityClass = getattr(module, self.mAvailableEntities[i])

			# Hacky passing in self.mKernel, but since it has Display surface, it works
			entity = _EntityClass(self.mKernel, self.mKernel)
			entity.SetPosition([ 725 - (entity.Rect().width / 2), currentHeight])

			currentHeight += entity.Rect().height + 10

			self.mEntitySelects.append(entity)

		return GameState.Initialize(self)

	def Destroy(self):

		return GameState.Destroy(self)

	def Pause(self):

		return GameState.Pause(self)

	def Unpause(self):

		return GameState.Unpause(self)

	def HandleEvent(self, event):
		if (event.type == QUIT):
			pygame.quit()
			sys.exit()
		elif (event.type == MOUSEBUTTONDOWN):
			if (self.mEntityBox.collidepoint(event.pos)):

				if (self.mSaveLevelRect.collidepoint(event.pos)):
					self.mLevel.SaveLevel(self.mLevelName)

				elif (self.mMainMenuRect.collidepoint(event.pos)):
					self.mGameStateManager.SwitchState("MainMenu")

				else:
					for entity in self.mEntitySelects:
						if (entity.Rect().collidepoint(event.pos)):
							self.mSelectedEntity = entity

							classname = self.mSelectedEntity.__class__.__name__
							module = __import__(classname)
							_Entity = getattr(module, classname)

							self.mGhostEntity = _Entity(self.mKernel, self.mKernel)
							self.mGhostEntity.SetPosition(list(event.pos))
							return

					self.mGhostEntity = None
					self.mSelectedEntity = None
			else:
				if (self.mSelectedEntity):
					classname = self.mSelectedEntity.__class__.__name__
					module = __import__(classname)
					_Entity = getattr(module, classname)

					newEntity = _Entity(self.mKernel, self.mLevel)
					self.mLevel.AddEntity(newEntity, self.mLevel.ScreenToLevelCoordinates(event.pos))
					self.mLevel.CalcMaxScore()

				elif (self.mCurrentEntity):
					self.mCurrentEntity.SetPosition(list(self.mLevel.ScreenToLevelCoordinates(event.pos)))
					self.mCurrentEntity = None

				else:
					self.mGhostEntity = None
					self.mCurrentEntity = self.mLevel.EntityAt(event.pos)

		elif (event.type == MOUSEMOTION):
			if (self.mCurrentEntity and event.pos[0] < 576 and event.pos[0] > 0):
				self.mCurrentEntity.SetPosition(list(self.mLevel.ScreenToLevelCoordinates(event.pos)))

			elif (self.mSelectedEntity and event.pos[0] < 576 and event.pos[0] > 0):
				if (not self.mGhostEntity):
					classname = self.mSelectedEntity.__class__.__name__
					module = __import__(classname)
					_Entity = getattr(module, classname)

					self.mGhostEntity = _Entity(self.mKernel, self.mKernel)

				self.mGhostEntity.SetPosition(list(event.pos))

		elif (event.type == KEYDOWN):
			if (event.key == K_a):
				self.mScrollDirection = -4
			elif (event.key == K_d):
				self.mScrollDirection = 4
			elif (event.key == K_BACKSPACE and self.mCurrentEntity):
				self.mLevel.RemoveEntity(self.mCurrentEntity)
				self.mCurrentEntity = None
				self.mLevel.CalcMaxScore()

		elif (event.type == KEYUP):
			if (event.key == K_a or event.key == K_d):
				self.mScrollDirection = 0

		return GameState.HandleEvent(self, event)

	def Update(self, delta):
		# Don't animate things
		#self.mLevel.Update(delta)
		self.mLevel.Scroll(self.mScrollDirection)

		self.mLevel.Draw()

		if (self.mCurrentEntity):
			pygame.draw.rect(self.mLevel.DisplaySurface(), Colors.GREEN, self.mCurrentEntity.Rect(), 2)

		self.mLevel.Blit()

		if (self.mGhostEntity):
			self.mGhostEntity.Draw()
			pygame.draw.rect(self.mKernel.DisplaySurface(), Colors.RED, self.mGhostEntity.Rect(), 2)

		pygame.draw.line(self.mKernel.DisplaySurface(), Colors.BLUE, (0, self.mGroundLevel), (800, self.mGroundLevel), 4)
		pygame.draw.line(self.mKernel.DisplaySurface(), Colors.RED, (self.mLevel.mLevelLength - 1500 - self.mLevel.mCameraX, 0), (self.mLevel.mLevelLength - 1500 - self.mLevel.mCameraX, 600), 4)

		pygame.draw.rect(self.mKernel.DisplaySurface(), Colors.LIGHT_GREY, self.mEntityBox)

		for entity in self.mEntitySelects:
			entity.Draw()

		if (self.mSelectedEntity):
			selectedRect = self.mSelectedEntity.Rect()
			pygame.draw.rect(self.mKernel.DisplaySurface(), Colors.RED, self.mSelectedEntity.Rect(), 2)

		self.mKernel.DisplaySurface().blit(self.mMainMenuImage, self.mMainMenuRect)
		self.mKernel.DisplaySurface().blit(self.mSaveLevelImage, self.mSaveLevelRect)

		textSurface = self.mFont.render("Max Score: " + str(self.mLevel.mMaxScore), True, Colors.WHITE)
		self.mKernel.DisplaySurface().blit(textSurface, (40, 580, textSurface.get_rect().width, textSurface.get_rect().height))

		return GameState.Update(self, delta)