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


    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('imagesship.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))
  • 相关阅读:
    通过git向github提交项目
    git连接github mac
    char如何储存3个字节或者4个字节
    centOS 7安装jdk
    在移动端语言react中使用video.js
    小程序自定义头部navbar组件
    git常用指令汇总学习
    react表单
    react从入门到熟悉(回顾react)
    react生命周期
  • 原文地址:https://www.cnblogs.com/charliedaifu/p/9948416.html
Copyright © 2020-2023  润新知