Pygame实战外星人入侵1.1——添加飞船


现在开始开发游戏《外星人入侵》,创建一个空的Pygame窗口,导入模块sys和pygame,其中sys模块用于退出游戏。

关于背景的设置放在Settings类中,以免在代码中添加设置。在下面主程序文件中导入Settings类。同样创建一个Ship类,它负责管理飞船的大部分行为,并在主程序中导入Ship类。

pygame.init()用于初始化背景设置,创建一个Settings实例并储存在ai_settings中。我们调用pygame.display.set_mode()来创建一个名为screen的显示窗口,参数是一个元组使用了ai_settings的属性用于指定游戏窗口的尺寸,我们可以在Settings类中进行修改。接着创建一个名为ship的Ship实例,一定要在循环之前,防止每次循环都创建一艘飞船。在后面调用ship.blitme()将飞船绘an制在屏幕上。

这个游戏由一个循环控制,包含一个事件循环和管理屏幕的代码。事件使用户游戏时的操作,如按键及鼠标的移动。使用pygame.event.get()访问pygame检测到的事件。当玩家单击游戏窗口的关闭按钮时即检测到pygame.QUIT事件,将调用sys.exit()退出游戏。调用 pygame.display.flip()不断更新屏幕,调用screen.fill()用背景颜色填充屏幕,此方法只接受一个实参,即一种颜色。最后调用run_game()初始化游戏并开始主循环。

# _*_ coding:gb2312 _*_
import sys
import pygame

from settings import Settings
from ship import Ship

def run_game():
	#初始化游戏并创建一个屏幕对象
	pygame.init()
	ai_settings=Settings()
	screen=pygame.display.set_mode(
	    (ai_settings.screen_width,ai_settings.screen_height))
	pygame.display.set_caption("Alien Invasion")
	
	#创建一搜飞船
	ship=Ship(screen)

	#开始游戏的主循环
	while True:
		
		#监视键盘和鼠标事件
		for event in pygame.event.get():
			if event.type==pygame.QUIT:
				sys.exit()
				
		#每次循环时重绘屏幕
		screen.fill(ai_settings.bg_color)
		ship.blitme()
				
		#让最近绘制的屏幕可见
		pygame.display.flip()
		
run_game()

Settings类中,背景色以RGB值指定,这种颜色由红、绿、蓝组成,每个值的范围为0~255,(255,0,0)表示红色,(0,255,0)

表示绿色,(0,0,255)代表蓝色。可创建1600万种颜色,(230,230,230)是一种浅灰色。

# _*_ coding:gb2312 _*_ 
class Settings():
	"""储存《外星人入侵》的所有设置的类"""
	
	def __init__(self):
		"""初始化游戏的设置"""
		#屏幕设置
		self.screen_width=1200
		self.screen_height=600
		self.bg_color=(230,230,230)

在选用游戏素材时,其图像文件使用位图最简单,将飞船的位图图像名为ship.bmp并储存在主项目文件夹下,名新的文件夹为images。为加载图像调用pygame.image.load(),返回的surface储存在self.image中,使用get_rect()获取相应飞船属性储存在self.rect中,将表示屏幕的矩形储存在self.screen_rect中。

为使放在屏幕底部中央飞船将表示飞船中心的x坐标self.rect.centerx设置为表示屏幕矩形的属性centerx。将表示飞船下边缘的y坐标self.rect.bottom设置为表示屏幕矩形的属性bottom。

最后定义方法blitme(),根据self.rect指定的位置将图像绘制到屏幕上。

# _*_ coding:gb2312 _*_
import pygame

class Ship():
	def __init__(self,screen):
		"""初始化飞船并设计其初始位置"""
		self.screen=screen
		#加载飞船图像并获取其外接矩形
		self.image=pygame.image.load('images/ship.bmp')
		self.rect=self.image.get_rect()
		self.screen_rect=screen.get_rect()
		
		#将每艘新飞船放在屏幕底部中央
		self.rect.centerx=self.screen_rect.centerx
		self.rect.bottom=self.screen_rect.bottom
		
	def blitme(self):
		"""在指定位置绘制飞船"""
		self.screen.blit(self.image,self.rect)

结果如图所示:

为简化代码的结构,进行重构,模块game_functions。即将主程序中管理事件和屏幕更新的代码放到模块game_functions中,对代码进行重构会使其更容易扩展。

代码如下:

# _*_ coding:gb2312 _*_
import sys
import pygame

from settings import Settings
from ship import Ship
import game_functions as gf

def run_game():
	#初始化游戏并创建一个屏幕对象
	pygame.init()
	ai_settings=Settings()
	screen=pygame.display.set_mode(
	    (ai_settings.screen_width,ai_settings.screen_height))
	pygame.display.set_caption("Alien Invasion")
	
	#创建一搜飞船
	ship=Ship(screen)

	#开始游戏的主循环
	while True:
		gf.check_events()
		gf.update_screen(ai_settings,screen,ship)
		
run_game()
# _*_ coding:gb2312 _*_
#game_funtions模块
import sys
import pygame
def check_events():
	"""响应按键和鼠标事件"""
	for event in pygame.event.get():
		if event.type==pygame.QUIT:
				sys.exit()
				
def update_screen(ai_settings,screen,ship):
	"""更新屏幕上的图像,并且换到新屏幕"""
	#每次循环时重绘屏幕
	screen.fill(ai_settings.bg_color)
	ship.blitme()
				
	#让最近绘制的屏幕可见
	pygame.display.flip()
				

猜你喜欢

转载自blog.csdn.net/IMWTJ123/article/details/81905639