天天看點

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

前言:

本期我們将制作一個簡單的滑雪遊戲。

廢話不多說,讓我們愉快地開始吧~

結果

老規矩還是我們先看看效果圖

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

開發工具

Python版本:3.6.4

相關子產品:

pygame子產品;

以及一些Python自帶的子產品。

環境搭建

安裝Python并添加到環境變量,pip安裝需要的相關子產品即可。

原理介紹

遊戲規則:

玩家通過“AD”鍵或者“←→”操控前進中的滑雪者,努力避開路上的樹,盡量撿到路上的小旗。

如果碰到樹,則得分減50,如果撿到小旗子,則得分加10。

逐漸實作:

Step1:定義精靈類

由于遊戲涉及到碰撞檢測(滑雪者與樹和小旗之間的碰撞),是以我們定義兩個精靈類,分别用于代表滑雪者和障礙物(即樹和小旗):

'''滑雪者類'''
class SkierClass(pygame.sprite.Sprite):
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		# 滑雪者的朝向(-2到2)
		self.direction = 0
		self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
		self.image = pygame.image.load(self.imagepaths[self.direction])
		self.rect = self.image.get_rect()
		self.rect.center = [320, 100]
		self.speed = [self.direction, 6-abs(self.direction)*2]
		'''改變滑雪者的朝向. 負數為向左,正數為向右,0為向前'''
	def turn(self, num):
		self.direction += num
		self.direction = max(-2, self.direction)
		self.direction = min(2, self.direction)
		center = self.rect.center
		self.image = pygame.image.load(self.imagepaths[self.direction])
		self.rect = self.image.get_rect()
		self.rect.center = center
		self.speed = [self.direction, 6-abs(self.direction)*2]
		return self.speed
	'''移動滑雪者'''
	def move(self):
		self.rect.centerx += self.speed[0]
		self.rect.centerx = max(20, self.rect.centerx)
		self.rect.centerx = min(620, self.rect.centerx)
'''障礙物類'''
class ObstacleClass(pygame.sprite.Sprite):
	def __init__(self, img_path, location, attribute):
		pygame.sprite.Sprite.__init__(self)
		self.img_path = img_path
		self.image = pygame.image.load(self.img_path)
		self.location = location
		self.rect = self.image.get_rect()
		self.rect.center = self.location
		self.attribute = attribute
		self.passed = False
	'''移動'''
	def move(self, num):
		self.rect.centery = self.location[1] - num
           

其中,滑雪者在前進過程中應當擁有向左,向右偏移的能力,并且在偏移時滑雪者向前的速度應當減慢才更加合乎常理,這樣才能供玩家操作。同時,滑雪者應當擁有不同的姿态來表現自己滑行時的狀态:

直線:

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

左偏一點:

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

左偏很多:

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

右偏一點:

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

右偏很多:

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

另外,盡管滑雪者的左右移動通過移動滑雪者本身實作,但是滑雪者的向前移動是通過移動障礙物實作的。

Step2:随機建立障礙物

現在我們需要定義一個随機建立障礙物的函數,以便在遊戲主循環中調用:

Python遊戲開發,pygame子產品,Python實作滑雪小遊戲

其中障礙物建立兩次的目的是便于畫面銜接。

然後我們就可以定義主循環了:

'''遊戲主循環'''
	while True:
		# --事件捕獲
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				pygame.quit()
				sys.exit()
			if event.type == pygame.KEYDOWN:
				if event.key == pygame.K_LEFT or event.key == pygame.K_a:
					speed = skier.turn(-1)
				elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
					speed = skier.turn(1)
		'''--更新目前遊戲幀的資料'''
		skier.move()
		distance += speed[1]
		if distance >= 640 and obstaclesflag == 0:
			obstaclesflag = 1
			obstacles0 = createObstacles(20, 29)
			obstacles = AddObstacles(obstacles0, obstacles1)
		if distance >= 1280 and obstaclesflag == 1:
			obstaclesflag = 0
			distance -= 1280
			for obstacle in obstacles0:
				obstacle.location[1] = obstacle.location[1] - 1280
			obstacles1 = createObstacles(10, 19)
			obstacles = AddObstacles(obstacles0, obstacles1)
		for obstacle in obstacles:
			obstacle.move(distance)
		'''--碰撞檢測'''
		hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
		if hitted_obstacles:
			if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
				score -= 50
				skier.setFall()
				updateFrame(screen, obstacles, skier, score)
				pygame.time.delay(1000)
				skier.setForward()
				speed = [0, 6]
				hitted_obstacles[0].passed = True
			elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
				score += 10
				obstacles.remove(hitted_obstacles[0])
        '''--更新螢幕'''
		updateFrame(screen, obstacles, skier, score)
		clock.tick(cfg.FPS)
           

主循環的内容包括:

事件監聽、障礙物的更新、碰撞檢測以及分數的展示等内容,總之還是很容易實作的。

Step4:其他

開始、結束界面這些,就靠大家自己發揮了,我就寫了一個簡單的開始界面:

'''顯示遊戲開始界面'''
def ShowStartInterface(screen, screensize):
	screen.fill((255, 255, 255))
	tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
	cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
	title = tfont.render(u'滑雪遊戲', True, (255, 0, 0))
	content = cfont.render(u'按任意鍵開始遊戲', True, (0, 0, 255))
	trect = title.get_rect()
	trect.midtop = (screensize[0]/2, screensize[1]/5)
	crect = content.get_rect()
	crect.midtop = (screensize[0]/2, screensize[1]/2)
	screen.blit(title, trect)
	screen.blit(content, crect)
	while True:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				pygame.quit()
				sys.exit()
			elif event.type == pygame.KEYDOWN:
				return
		pygame.display.update()
           

文章到這裡就結束了,感謝你的觀看,Python24個小遊戲系列,下篇文章分享經典90坦克大戰

為了感謝讀者們,我想把我最近收藏的一些程式設計幹貨分享給大家,回饋每一個讀者,希望能幫到你們。

幹貨主要有:

① 2000多本Python電子書(主流和經典的書籍應該都有了)

② Python标準庫資料(最全中文版)

③ 項目源碼(四五十個有趣且經典的練手項目及源碼)

④ Python基礎入門、爬蟲、web開發、大資料分析方面的視訊(适合小白學習)

⑤ Python學習路線圖(告别不入流的學習)

All done~詳見個人簡介或者私信擷取完整源代碼。。

繼續閱讀