窗口游戏《外星人入侵》学习笔记
1、数据类型转换错误
ValueError: invalid literal for int() with base 10:
a = '10' b = 'ha' c = '' print(int(a)) print(int(b)) print(int(c)) #10 #ValueError: invalid literal for int() with base 10: 'ha' #不能将字符串转换为整数 #ValueError: invalid literal for int() with base 10: '' #不能将空字符转换为整数 #空格和小数也不行,小数如果不在引号内就可以
2、创建一个蓝色背景的游戏窗口
#外星人入侵 import sys import pygame def run_game(): pygame.init()#初始化游戏 screen = pygame.display.set_mode((600,500))#创建屏幕 pygame.display.set_caption("外星人入侵")#命名 bg_color = (0,0,255)#背景色 while True: for event in pygame.event.get():#监视键盘和鼠标事件 if event == pygame.QUIT: sys.exit() screen.fill(bg_color)#每次循环都重绘屏幕 pygame.display.flip()#显示最近绘制的屏幕 run_game()
3、添加飞船图像:在游戏中几乎可以使用任何类型的图像文件,但使用位图(.bmp)最为简单,因为Python默认加载位图。
虽然可配置Python使用其他文件类型,但有些文件类型要求你在计算机上安装相应的图像库。
方法:pygame.image.load('images\ship.bmp'),图片文件最好放在程序的下一级文件夹内
4、get_rect()函数可以获取相应surface的属性rect(外接矩形)。处理rect对象时,可使用矩形四角和中心的x,y坐标的值来指定矩形的位置。
要将游戏元素居中,可设置相应的rect对象的属性center,centerx,centery。
要将游戏元素与屏幕边界对齐,可设置属性top,bottom,left,right。
要调整游戏元素的水平或垂直位置,可使用X和Y,他们分别是相应矩形左上角的x和y坐标。
注意:在Python中,坐标原点(0,0)位于屏幕左上角,向右下方移动时,坐标值增大。
def center_ship(self): '''让飞船在屏幕底部居中''' self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom
5、screen.blit(image,rect)按照指定位置绘制图片
def blitme(self): '''在指定位置绘制飞船''' self.screen.blit(self.image, self.rect)
6、检测鼠标和键盘类型
event.type == pygame.QUIT#退出 event.type == pygame.KEYDOWN#键盘按下 event.type == pygame.KEYUP#键盘松开 event.key == pygame.K_RIGHT#键盘向右键 event.key == pygame.K_LEFT#键盘向左键 event.key == pygame.K_DOWN#键盘向下键 event.key == pygame.K_UP#键盘向上键 event.key == pygame.K_SPACE#空格键 event.key == pygame.K_q#q键 event.type == pygame.MOUSEBUTTONDOWN#鼠标键
7、get_pos() 获取坐标
button.rect.collidepoint(mouse_x,mouse_y) 检查鼠标单击位置是否在按钮的rect内
#获得鼠标点击位置的坐标 mouse_x,mouse_y = pygame.mouse.get_pos() #检测鼠标的单击位置是否在play按钮的rect内 button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
8、模块python.sprite中的Sprite类,通过使用精灵,可将游戏中相关的元素编组,进而同时操作编组中的所有元素。
使用方法:创建一个继承类Sprite的类
from pygame.sprite import Sprite class Bullet(Sprite): '''一个对飞船射出的子弹管理的类,继承精灵类Sprint''' def __init__(self,ai_settings,screen,ship): #在飞船所在的位置创建一个子弹类 super().__init__()
9、pygame.Rect(x,y,width,height) 从空白处创建一个矩形。
创建这个类的实例时,必须提供矩形左上角的x,y坐标,还有矩形的宽度和高度。
#在(0,0)处创建一个表示子弹的矩形,再移到正确位置 self.rect = pygame.Rect(0,0,ai_settings.bullet_width, ai_settings.bullet_height) self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.top
10、draw.rect()该函数使用存储在color中的颜色填充图形的rect占据的屏幕部分
#在屏幕上绘制子弹 pygame.draw.rect(screen,color,rect)
11、bullets.sprites() 函数返回一个列表
# 在屏幕上绘制所有子弹 for bullet in bullets.sprites(): bullet.draw_bullet()
12、pygame.sprite.groupcollide(bullets,aliens,True,True) 函数用于检测两个编组的成员之间的碰撞;
将每颗子弹的rect同每个外星人的rect进行比较,返回一个字典,其中其中包含发生了碰撞的子弹和外星人;
在这个字典中,每个键都是一颗子弹,相应的值都是被击中的外星人。
两个实参True,告诉Python删除发生碰撞的子弹和外星人,如果想让子弹能够穿行到屏幕顶端,可将第一个布尔实参设置为False,这样只删除被击中的外星人。
13、pygame.sprite.spritecollideany(ship,aliens) 函数接受两个实参,一个精灵,一个编组,它检查编组是否有成员与精灵发生碰撞。
14、模块time中的函数sleep(1),可以使游戏暂停,括号内单位为秒。
15、模块python.font,它让pygame能够将文本渲染到屏幕上。
font.render(msg,True,text_color,bg_color)
import pygame.font #先指定用什么字体和字号来渲染文本 button.font = pygame.font.SysFont(None,48) #实参None代表使用默认字体,48指定文本字号 #将文本转换为图像,显示到屏幕上 msg_image = self.font.render(msg,True,self.text_color, self.button_color) #msg为文本内容,布尔实参代表开启反锯齿功能(让文本的边缘更平滑) #剩下两个是文本颜色和背景颜色,如果不指定背景色,默认背景透明
例如:将得分显示到屏幕右上角
def prep_score(self): '''将得分变为10的整数倍,用逗号表示千位分隔符''' rounded_score = round(self.stats.score,-1) # 将数值转换为字符串时,在其中插入逗号 score_str = "{:,}".format(rounded_score) #将得分渲染为一幅图像 self.score_image = self.font.render(score_str,True,self.text_color, self.ai_settings.bg_color) #将得分放在屏幕右上角 self.score_rect = self.score_image.get_rect() self.score_rect.right = self.screen_rect.right - 20 self.score_rect.top = 20 def show_score(self): '''在屏幕上显示得分''' self.screen.blit(self.score_image,self.score_rect)
16、通过向set_visible()传递False,让Python隐藏光标,True,让光标可见
# 隐藏光标 pygame.mouse.set_visible(False)
17、initialize_dynamic_settings() 用来初始化随着游戏进行而变化的属性。
def initialize_dynamic_settings(self): '''初始化随游戏进行而变化的量''' # 飞船的移动速度 self.ship_speed_factor = 1.5 # 子弹的移动速度 self.bullet_speed_factor = 5 # 外星人的移动速度 self.alien_speed_factor = 0.5 self.fleet_direction = 1 # 1表示向右移动,-1表示向左移动 # 记分 self.alien_points = 50
18、游戏每次退出时将最高分存储到文本中,每次点击play按钮,读取文本中的最高得分
#开始游戏时读取最高分 with open('high_score.txt','r') as hs_object: self.high_score = int(hs_object.read()) #游戏结束时,存储最高分 with open("high_score.txt", 'w') as hs_object: hs_object.write(str(stats.high_score))