Python学习笔记44:游戏篇之外星人入侵(五)

news2025/2/22 11:18:52

前言

上一篇文章中,我们成功的设置好了游戏窗口的背景颜色,并且在窗口底部中间位置将飞船加载出来了。

今天,我们将通过代码让飞船移动。

移动飞船

  1. 想要移动飞船,先要明白飞船位置变化的本质是什么。

    通过上一篇文章,我们已经知道了飞船实际上是通过在窗口指定x,y坐标轴位置渲染出的一张外接矩形的图片。外接矩形的图片,就是飞船的"本质",移动飞船的本质,就是移动这张图片。

  2. 怎么移动飞船?

    在理解了移动飞船的本质就是移动图片后,我们要做的就是使用代码,实现图片移动的功能。而图片的渲染是通过图片外接矩形的坐标调用blit函数实现的,所以我们想要移动图片,就要修改飞船图片外接矩形的坐标实现,具体到我们的代码就是通过修改属性self.rect.centerxself.rect.bottom的值,调用blit函数重新加载图片,从而实现图片的移动,展现出飞船移动的效果。

    飞船x,y值变化反馈到飞船移动的方向如下(不要搞混了,窗口左上顶点的坐标是(0,0)):

    • 向右移动x坐标值增加
    • 向左移动x坐标值减少
    • 向上移动y坐标值减少
    • 向下移动y坐标值增加

代码编写

在之前基础模块的编写中,我们已经定义了一个move函数,并且用pass进行占位,那么我们就要对这个函数进行业务代码实现编写。

  1. 首先我们需要定义四个标识字段,这几个字段用于标识飞船当前应该往哪移动。这四个字段属于飞船对象自身的属性。

      # 移动标志
            self.moving_right = False
            self.moving_left = False
            self.moving_top = False
            self.moving_bottom = False
    
  2. 我们在move函数中通过当前移动标志的值判断应该往哪里移动,并且进行坐标值的修改。

    def move(self):
        """移动飞船"""
        if self.moving_right:
            self.rect.centerx += 1
        if self.moving_left:
            self.rect.centerx -= 1
        if self.moving_top:
            self.rect.bottom -= 1
        if self.moving_bottom:
            self.rect.bottom += 1
    
  3. 函数修改好以后,我们需要处理监听事件中按键相关的时候。我们按下对应的方向键按钮以后,需要将对应方向移动标识设置与True,弹起按键时设置移动标识为False。

    def check_event(ship):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    ship.moving_right = True
                elif event.key == pygame.K_LEFT:
                    ship.moving_left = True
                elif event.key == pygame.K_UP:
                    ship.moving_top = True
                elif event.key == pygame.K_DOWN:
                    ship.moving_bottom = True
                elif event.key == pygame.K_q:
                    pygame.quit()
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    ship.moving_right = False
                elif event.key == pygame.K_LEFT:
                    ship.moving_left = False
                elif event.key == pygame.K_UP:
                    ship.moving_top = False
                elif event.key == pygame.K_DOWN:
                    ship.moving_bottom = False
    
  4. 在监听事件之后,屏幕更新之前,调用飞船的move函数。

    def run_game():
        """启动游戏"""
    
        # 初始化pygame
        pygame.init()
        # 定义一个系统设置对象
        setting = Setting()
        # 新建窗口
        screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))
        # 窗口命名
        pygame.display.set_caption(setting.caption)
        # 定义一个飞船对象
        ship = Ship(setting, screen)
    
        while True:
            # 处理监听事件
            gf.check_event(ship)
            # 移动飞船
            ship.move()
            # 刷新屏幕
            gf.update_screen(setting, screen, ship)
    
    
    if __name__ == '__main__':
        run_game()
    

这个时候只要你启动服务,按下方向键,你就可以自由的的控制你的飞船了。

在这里插入图片描述

边界问题

当你正开始的移动你的飞船的时候,你会突然发现:
在这里插入图片描述

实际上,是你的飞船越过了窗口的边界,导致你的飞船消失不见了。因为pygame所有图形和游戏逻辑都将基于这个窗口大小进行计算和渲染。

这个问题怎么解决呢?很简单,在飞船移动的函数中定义,超过边界不允许移动。

优化代码如下:

def move(self):
    """移动飞船"""
    if self.moving_right and self.rect.right < self.screen_rect.right:
        self.rect.centerx += 1
    if self.moving_left and self.rect.left > self.screen_rect.left:
        self.rect.centerx -= 1
    if self.moving_top and self.rect.top > self.screen_rect.top:
        self.rect.bottom -= 1
    if self.moving_bottom and self.rect.bottom < self.screen_rect.bottom:
        self.rect.bottom += 1

代码中的修改就是对修改坐标的条件增加了一个对应方向的限制。
代码解释如下:

  • 向右移动时,飞船的边界要在游戏窗口的边界边才运行飞船向右移动
  • 向左移动时,飞船的边界要在游戏窗口的边界边才运行飞船向左移动
  • 向上移动时,飞船的边界要在游戏窗口的边界边才运行飞船向左移动
  • 向下移动时,飞船的边界要在游戏窗口的边界边才运行飞船向左移动

重新启动,你就会发现你的飞船在窗口边界不会再移动了。

在这里插入图片描述

结尾

那么到目前为止,我们的飞船已经可以在游戏窗口内自由的移动了。

接下来就准备就让我们的飞船发射子弹。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1954877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32的GPIO输入输出方式设置示例

1、GPIO口做基本的输入/输出口使用时&#xff0c;输入有上拉输入、下拉输入、浮空输入&#xff08;既无上拉电阻也无下拉电阻&#xff09;3种输入方式&#xff1b;输出有开漏输出、推挽输出2种输出方式。 2、示例 &#xff08;1&#xff09;示例1&#xff1a;GPIO做输出的设置…

【机器学习】pytorch 常用函数解析

目录 一、基本函数介绍 1.1 nn.Module 类 1.2 nn.Embedding 1.3 nn.LSTM 1.4 nn.Linear 1.5 nn.CrossEntropyLoss 1.6 torch.save 1.7 torch.load 1.8 nn.functional 1.9 nn.functional.softmax 本文主要对 pytorch 中用到的函数进行介绍&#xff0c;本文会不断更新~…

【Redis进阶】主从复制

1. 主从结构引入 在分布式系统中&#xff0c;涉及到一个严重问题&#xff1a;单点问题 即如果某个服务器程序只有一个节点&#xff08;单台机器提供服务&#xff09;&#xff0c;就会出现以下两个问题&#xff1a; 可用性问题&#xff0c;如果这台机器挂了&#xff0c;意味着…

Github 2024-07-27开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-27统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目2C++项目2C项目2TypeScript项目1JavaScript项目1Java项目1Python项目1C#项目1免费编程学习平台:freeCodeCamp.org 创建周期:33…

jQuery入门(一)

一、JQuery介绍 - jQuery 是一个 JavaScript 库。 - 所谓的库&#xff0c;就是一个 JS 文件&#xff0c;里面封装了很多预定义的函数&#xff0c;比如获取元素&#xff0c;执行隐藏、移动等&#xff0c;目的就 是在使用时直接调用&#xff0c;不 需要再重复定义&#xff0c;这…

iPhone 在 App Store 中推出的 PC 模拟器 UTM SE

PC 模拟器是什么&#xff1f;PC 模拟器是一种软件工具&#xff0c;它模拟不同硬件或操作系统环境&#xff0c;使得用户可以在一台 PC 上运行其他平台的应用程序或操作系统。通过 PC 模拟器&#xff0c;用户可以在 Windows 电脑上体验 Android 应用、在 Mac 电脑上运行 Windows …

Python如何获取终端尺寸?

os.get_terminal_size()&#xff0c;无差别获取当前终端长宽&#xff0c;让你为所欲为。 (笔记模板由python脚本于2024年07月27日 08:30:53创建&#xff0c;本篇笔记适合喜欢钻研的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fre…

使用命名管道的通信程序, 加入了日志系统

文章目录 日志系统通信程序运行效果 日志系统 // log.hpp #pragma once #include <time.h> #include <iostream> #include <stdio.h> #include <string> #include <stdarg.h> #include <sys/types.h> #include <sys/stat.h> #inclu…

软设之数据库关系代数

数据库关系代数 基本概念 元祖行&#xff1a;水平方向上每一行为一条记录&#xff0c;这个记录对应1个实体。一般称为元祖&#xff0c;元祖行或者记录 属性列&#xff1a;垂直方向上每一列为一个属性&#xff0c;一般称为属性列&#xff0c;字段等。关系表达式中可以用列序号…

又要起飞,浏览器居然都可以本地 OCR 啦

前言 PaddleOCR&#xff0c;这是一个由百度开发的开源 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;工具&#xff0c;它可以用于从图像中识别文本。 PaddleOCR支持多种语言的文本识别&#xff0c;并且能够处理多种场景下的图像。 现在…

【Web开发手礼】探索Web开发的魅力(十二)-Vue(2)用户动态页面

前言 主要介绍了用vue框架创建用户动态页面的具体过程&#xff0c;可以帮助学习vue框架的基本知识&#xff01;&#xff01;&#xff01;&#xff01; 用户动态页面 用户信息 用户头像 通过 Bootstrap 所提供的 .img-fluid 类让图片支持响应式布局。其原理是将 max-width: 10…

Java面试八股之Spring boot的自动配置原理

Spring boot的自动配置原理 Spring Boot 的自动配置原理是其最吸引人的特性之一&#xff0c;它大大简化了基于 Spring 框架的应用程序开发。以下是 Spring Boot 自动配置的基本原理和工作流程&#xff1a; 1. 启动类上的注解 Spring Boot 应用通常会在主类上使用 SpringBoot…

ZBrush入门使用介绍——4、笔刷选项说明

大家好&#xff0c;我是阿赵。   这次来看看ZBrush的笔刷的选项用法。 一、选择笔刷 点击笔刷&#xff0c;可以打开笔刷选择面板。 在最上面的Quick Pick&#xff0c;有最近使用过的笔刷&#xff0c;可以快速的选择。下面有很多可以选择的笔刷。但由于笔刷太多&#xff0c;…

AJAX之基础知识

目录 AJAX入门及axios使用什么是AJAX怎么用AJAX 认识URL协议域名资源路径URL查询参数 查询参数URL查询参数axios查询参数 常用请求方法axios请求配置 axios错误处理HTTP协议请求报文请求报文-错误排查响应报文HTTP响应状态码 form-serialize插件 AJAX入门及axios使用 什么是AJ…

【Python机器学习】决策树的构造——信息增益

决策树是最经常使用的数据挖掘算法。它之所以如此流行&#xff0c;一个很重要的原因就是不需要了解机器学习的知识&#xff0c;就能搞明白决策树是如何工作的。 决策树的优缺点&#xff1a; 优点&#xff1a;计算复杂度不高&#xff0c;输出结果易于理解&#xff0c;对中间值的…

RabbitMq手动ack的超简单案例+Confirm和Return机制的配置和使用

最简单的例子 先简单介绍一下这三个方法 basicAck 表示确认成功&#xff0c;使用此方法后&#xff0c;消息会被rabbitmq broker删除 basicNack 表示失败确认&#xff0c;一般在消费消息业务异常时用到此方法&#xff0c;可以将消息重新投递入队列 basicReject 拒绝消息&am…

Chainlit一个快速构建成式AI应用的Python框架,无缝集成与多平台部署

概述 Chainlit 是一个开源 Python 包&#xff0c;用于构建和部署生成式 AI 应用的开源框架。它提供了一种简单的方法来创建交互式的用户界面&#xff0c;这些界面可以与 LLM&#xff08;大型语言模型&#xff09;驱动的应用程序进行通信。Chainlit 旨在帮助开发者快速构建基于…

全网最适合入门的面向对象编程教程:25 类和对象的 Python 实现-Python 判断输入数据类型

全网最适合入门的面向对象编程教程&#xff1a;25 类和对象的 Python 实现-Python 判断输入数据类型 摘要&#xff1a; 本文主要介绍了在使用 Python 面向对象编程时&#xff0c;如何使用 type 函数、isinstance 函数和正则表达式三种方法判断用户输入数据类型&#xff0c;并对…

PWA(渐进式网页应用)方式实现TodoList桌面应用

参考&#xff1a; https://cloud.tencent.com/developer/article/2322236 todlist网页参考&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/140657576 实现在线网页当成app应用&#xff1a; 一个 PWA 应用首先是一个网页, 是通过 Web 技术编写出的一个网…