• Python小游戏——外星人入侵(保姆级教程)第一章 07调整飞船速度 08限制飞船活动范围


    系列文章目录

    第一章:武装飞船

    07调整飞船速度
    08限制飞船活动范围

    一、代码及演示

    1.修改settings

    修改文件:settings.py

    点击查看代码
    #渗透小红帽python的学习之路
    #外星人入侵小游戏
    #创建设置类Setting()
    #存储外星人入侵小游戏的所有设置的类
    
    class Setting():
        def __init__(self): #__init__ 注意是两个短下划线
            # 屏幕设置
            self.screen_width = 1200
            self.screen_height = 800
            self.bg_color = (230, 230, 230)
            self.ship_speed_factor = 1.5 #飞船速度设置为1.5,则移动时每次移动1.5像素
            # 因为rect的centerx等属性只能存储整数值,所以需要对ship类做修改
    

    image

    2.修改ship

    修改文件:ship.py

    点击查看代码
    #渗透小红帽python的学习之路
    #外星人入侵小游戏
    #ship.py
    #管理飞船行为的类
    
    import pygame
    
    class Ship():
        def __init__(self,ai_settings,screen):
            #参数screen用来指定将飞船绘制到什么地方
            #参数ai_settings让飞船能获取到速度设置
            self.screen = screen
            #加载飞船图片并获取其外接矩形
            self.ai_settings = ai_settings
            self.image = pygame.image.load('F:/PythonProject/pythongame/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
    
            #在飞船的属性centerx中存储小数值
            self.center = float(self.rect.centerx)
    
            # 移动标志,玩家按下右箭头键时,将标志设为true,松开时重新设置为false
            self.moving_right = False
            self.moving_left = False
    
        # 方法update()检查标志状态,标志为true时调整飞船位置
        def update(self):
            #更新飞船的center值,而不是rect
            #在修改self.center的值前检查飞船的位置
            if self.moving_right and self.rect.right < self.screen_rect.right:
                self.center += self.ai_settings.ship_speed_factor
            if self.moving_left and self.rect.left > 0:
                self.center -= self.ai_settings.ship_speed_factor
            #根据self.center更新rect的对象
            self.rect.centerx = self.center
    
        def blitme(self):
            # 在指定位置绘制飞船
            self.screen.blit(self.image, self.rect)
    
    

    image

    3.修改alien_invasion

    修改文件:alien_invasion.py

    点击查看代码
    #渗透小红帽python的学习之路
    #外星人入侵小游戏
    #创建pygame窗口以及响应用户输入
    
    import sys
    #模块sys用来退出游戏
    import pygame
    
    from settings import Setting
    #导入刚创建的设置类
    from ship import Ship
    #导入管理飞船行为的类
    import game_functions as gf
    
    def run_game():
        pygame.init() #初始化屏屏幕对象
        ai_settings = Setting()
        # 创建Setting类的实例,并存储在ai_settings变量中
    
        screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) #创建显示窗口
        pygame.display.set_caption("Alien Invasion")
        ship = Ship(ai_settings,screen) #绘制一艘飞船
    
        #开始游戏主循环
        while True:
            gf.check_events(ship)
            ship.update()
            # 飞船移动已经设置完成
    
            gf.update_screen(ai_settings,screen,ship)
    
    run_game()
    # 代码重构完成
    

    image

    4.运行效果

    A:按下右箭头键后飞船向右移动,直到移动到游戏界面右边缘后停止。

    image

    B:按下左箭头键后飞船向左移动,直到移动到游戏界面左边缘后停止

    image

    二、学习笔记

    1. 调整飞船速度

    A:需要在setting类中添加控制飞船速度的属性。

    B:因为rect的centerx等属性只能存储整数值,所以需要对ship类做修改。

    C:参数ai_settings让飞船能获取到速度设置。

    D:在飞船的属性centerx中存储小数值。

    E:更新飞船的center值,而不是rect。

    self.center = float(self.rect.centerx)

    F:使用函数float()将self.rect.centerx的数值转换为小数,将结果存储在self.center中。

    2. 限制飞船活动范围

    A:如果玩家长时间按住箭头键,则飞船有可能移动到屏幕外面,所以需要限制飞船的活动范围,让飞船在到达屏幕边缘后停止移动。

    self.rect.right < self.screen_rect.right

    B:self.rect.right返回飞船外接矩形右边缘的x坐标。如果这个值小于self.screen_rect.right的值说明飞船没有触及屏幕右侧边缘。

    self.rect.left > 0

    C:如果rect的左边缘x坐标大于0,说明飞船没有触及左边缘。

    有什么不懂的地方在评论区留言哦!希望我的文章能对你有所帮助,如果喜欢我的文章,请点赞收藏并关注!你的认可是对我创作最大的鼓励!
    2022-08-23 22:01:39 星期二

  • 相关阅读:
    高等数学(第七版)同济大学 总习题四(后半部分) 个人解答
    SPI通信总线
    ArrayBlockingQueue源码分析
    机柜的一些基本知识点
    是时候回答【我为什么要学习 Go 语言(golang)】这个问题了
    nvme安装
    Future源码一观-JUC系列
    Hive学习笔记1
    Redisson 的主要方法
    去哪里找JAVA项目练手?
  • 原文地址:https://www.cnblogs.com/Penetration-redhat/p/16617992.html