窗口游戏《外星人入侵》学习笔记

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))

 

posted @ 2018-11-12 19:09  Charlie大夫  阅读(2425)  评论(0编辑  收藏  举报