外星人来了

和我们之前制作宇宙飞船中发射的子弹和飞船类似,外星人的创建也是先起一个文件,在文件里面进行初始化,加载图片,设置位置这些步骤。

import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
	def __init__(self,ai_game):
		super().__init__()
		self.screen=ai_game.screen
		#加载外星人图片,并且设置其rect属性
		self.image=pygame.image.load('images/alien.bmp')
		self.rect=self.image.get_rect()
		#设置每个外星人最初都出现在屏幕的左上角附近
		self.rect.x=self.rect.width
		self.rect.y=self.rect.height
		#存储外星人精确的水平位置
		self.x=float(self.rect.x)

外星人的绘制

现在我们有了外星人的信息,就需要在主文件中实现绘制。让外星人出现在屏幕上。

def __init__(self):
		#初始化背景设置,让pygame能够正常的工作
		pygame.init()
		# #创建显示窗口,将显示窗口赋给属性screen,这样整个类中所有方法都能够使用他。
		# #传递给screen的对象是一个surface,是屏幕的一部分,用于显示游戏元素
		# self.screen=pygame.display.set_mode((600,400))
		# self.bg_color=(230,230,230)
		self.settings=Settings()
		# self.screen=pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
		#让pygame生成一个覆盖整个显示器的屏幕
		self.screen=pygame.display.set_mode((0,0),pygame.FULLSCREEN)
		#使用屏幕的rect属性来更新对象settings
		self.settings.screen_width=self.screen.get_rect().width
		self.settings.screen_height=self.screen.get_rect().height
		pygame.display.set_caption("Alien Invasion")
		self.ship=Ship(self)
		self.bullets=pygame.sprite.Group()
		self.aliens=pygame.sprite.Group()
		self._create_fleet()
		
	def _create_fleet(self):
		#创建外星人
		alien=Alien(self)
		self.aliens.add(alien)
def _update_screen(self):
		#每次循环都需要重绘屏幕
		self.screen.fill(self.settings.bg_color)
		#绘制飞船
		self.ship.blitme()
		#遍历编组,绘制子弹
		for bullet in self.bullets.sprites():
			bullet.draw_bullet()
		#绘制外形人
		self.aliens.draw(self.screen)
		#让程序绘制的屏幕可见
		pygame.display.flip()

我们在初始化和绘制的方法中添加了外星人相关信息,这是我们运行程序,就会看到,屏幕左上角有一个外星人了。

创建一行外星人

def _create_fleet(self):
		#创建外星人
		alien=Alien(self)
		#创建一个外星人并计算一行可以容纳多少个外星人
		alien_width=alien.rect.width
		available_space_x=self.settings.screen_width-2*(alien_width)
		number_aliens_x=available_space_x//(2*alien_width)

		#创建第一行外星人
		for alien_number in range(number_aliens_x):
			#创建一个外星人并将其假如当前行
			alien=Alien(self)
			alien.x=alien_width+2*alien_width*alien_number
			alien.rect.x=alien.x
			self.aliens.add(alien)

我们对于生成外星人的方法进行了修改,现在他可以生成一行外星人了。

射杀外星人

对于外星人的设置其实还有很多改进的空间,但是我已经等不及用我们飞船的子弹还射杀他们了,所以在完成了一行外星人的生成之后我们就来编写射杀外形人的方法吧。

def _update_bullets(self):
		
		#用来更新子弹位置
		self.bullets.update()
		#删除消失的子弹
		#for循环过程中间本身不可以修改列表或编组的元素,所以我们使用的是副本(copy)
		for bullet in self.bullets.copy():
			if bullet.rect.bottom<=0:
				self.bullets.remove(bullet)
		#检查是否有外星人被子弹击中,如果有,则删除相应的子弹和外星人
		collisions=pygame.sprite.groupcollide(self.bullets,self.aliens,True,True)

这里我们使用了sprite.groupcollide(),这个函数的功能大致可以理解为如果发生碰撞,就同时消去碰撞的两个元素,当人我们可以通过调整后两个参数来实现消去的控制。这样我们就已经达成了一个游戏最基本的功能——射击

这次的有些简陋,主要是最近课程答辩,提交报告有些事情比较麻烦,之后内容会丰富起来的。