初步学习pygame,使用pygame搭建简单的窗口效果

news2025/2/22 1:29:15

在VSCode上使用pygame

第一步:创建 Python 虚拟环境

  1. 打开 VSCode 中的 Terminal(在菜单栏中选择 View > Terminal)
  2. 使用 cd 命令切换到你的项目文件夹
  3. 输入以下命令来创建一个新的虚拟环境:
   python3 -m venv env

这将在你的项目目录中创建一个名为 env 的文件夹,其中包含了你的 Python 环境。

第二步:激活虚拟环境

在 VS Code 的 Terminal 中,根据你的操作系统,运行适合的激活命令:

    .\env\Scripts\activate

你会注意到终端提示符改变,显示你已在 ‘env’ 环境中。

第三步:安装 pygame

在你的虚拟环境中,通过 Terminal 输入以下命令来安装 pygame:

python3 -m pip install pygame

到这里我们搭建好vscode上使用pygame库的基本条件,开始我们的pygame之路!

创建窗口

现在创建python文件,开始我们的代码。

# 导入 pygame 库
import pygame

# 初始化所有 pygame 模块,此步在使用任何其他 pygame 函数之前都是必需的
pygame.init()

# 创建一个 500x500 pix 的游戏窗口。参数是一个二元元组,表示窗口的宽度和高度
screen =  pygame.display.set_mode([500,500])

# 这是一个用来控制主程序循环运行的开关变量
running = True
while running:  # 主程序循环

    # 内部事件循环,处理程序中发生的所有事件,比如鼠标点击。
    # get() 方法将获取 pygame 事件队列中的所有事件
    for event in pygame.event.get():
        # pygame.QUIT 是一个 pygame 特定的事件,由窗口 '关闭' 按钮点击触发
        if event.type == pygame.QUIT:
            running = False  # 用户点击 '关闭',开关变量 running 设置为 False 退出主程序循环
    
    # fill 方法会对整个屏幕进行清洗(或填充颜色)。三个参数分别对应 RGB 三种颜色,范围都是 0-255
    # 255 255 255 是白色
    screen.fill((255,255,255))
    
    # 画一个蓝色的圆。第二个参数是圆心的位置坐标,第三个参数是圆的半径
    # 圆的RGB颜色是 (0,0,255),即蓝色
    pygame.draw.circle(screen, (0,0,255), (250,250), 75)

    # flip() 是一个很重要的函数。它用来更新整个窗口的显示。
    # pygame 在操作窗口时常常需要采取先在“后台”完成所有绘制,再一次性刷新到屏幕上的方式。
    # flip 函数会将所有后台的绘制结果更新到屏幕上,使我们可以看到结果
    pygame.display.flip()

# 离开主程序循环后,退出 pygame,清理内存
pygame.quit()

运行这个代码,我们可以得到一个白色的窗口,并且中间有一个蓝色的圆,如图:
在这里插入图片描述

蓝色方块

下面我们将编写一个显示四个蓝色方块的屏幕程序,如图
在这里插入图片描述
代码:

# 导入 pygame 库和对应的常量
import pygame
from pygame.locals import *

# 定义一个自定义的 Square 类,这个类继承自 pygame.sprite.Sprite
class Square(pygame.sprite.Sprite):
    def __init__(self):
        # 调用父类(pygame.sprite.Sprite)的构造函数
        super(Square, self).__init__()

        # 创建一个 25x25 像素的 surface 对象,surface 在 pygame 中代表一个影像对象
        self.surf = pygame.Surface((25,25))

        # 使用 fill 方法,可以只填充一种颜色。将 surface 对象填充为 RGB = (0,200,255) 的颜色
        self.surf.fill((0,200,255))
        
        # 获取当前 surface 对象的矩形界限(rect 对象)
        self.rect = self.surf.get_rect()

# 初始化 pygame
pygame.init()

# 创建一个 800x600 像素的游戏窗口
screen = pygame.display.set_mode((800,600))

# 创建四个 Square 实例
square1 = Square()
square2 = Square()
square3 = Square()
square4 = Square()

# 设置游戏循环开关
gameOn = True

# 游戏主循环
while gameOn:
    # 事件循环,处理游戏过程中发生的所有事件
    for event in pygame.event.get():
        # 如果检测到键盘输入的事件类型
        if event.type == KEYDOWN:
            # 判断如果按下的键是退格键(Backspace 键)
            if event.key == K_BACKSPACE:
                # 则将游戏循环开关 gameOn 设置为 False,退出游戏主循环
                gameOn = False

        # 如果检测到的事件类型是窗口关闭事件
        elif event.type == QUIT:
            # 则将游戏循环开关 gameOn 设置为 False,退出游戏主循环
            gameOn = False
        
    # 使用 screen 对象的 blit 功能,将四个 Square 对象绘制到指定的坐标处
    screen.blit(square1.surf, (40,40))
    screen.blit(square2.surf, (40, 530))
    screen.blit(square3.surf, (730, 40))
    screen.blit(square4.surf, (730, 530))

    # 更新整个屏幕,实现动画效果
    pygame.display.flip()

# 退出游戏
pygame.quit()

针对几个关键的差异进行解释。

  • 精灵(Sprites): 在第二段代码中,使用了 Pygame 的精灵(Sprite)计数概念。精灵在游戏开发中是一个非常常见的概念,通常用于表示在屏幕上可以看到并可以与之交互的对象,如玩家角色、敌人、子弹等。在代码中,我们创建了一个精灵类 Square,它用一个代表其视觉表现形式的 surface 和一个代表其在屏幕上位置的 rect 对象来定义。并在后面的代码中创建了四个 Square 精灵。
  • 自定义类: 在第二段代码中,创建了一个自定义的 Square 类,这是面向对象编程的一部分。用这种方式,我们可以将可重用的代码打包到一个对象中,这样可以很容易地创建多个类似的实体(在这种情况下是 Square )。
  • 用户交互: 虽然两段代码都有事件循环来处理用户输入,但在第二段代码中,增加了对键盘的事件处理,这允许用户通过按下 “Backspace” 键来退出游戏。
  • 屏幕绘制(Blitting): “blit” 是 “block image transfer” 的简称,指的是把图像从一处复制到另一处。在第二段代码中,使用 blit() 函数将每一个 Square 精灵的视觉表现形式绘制或复制到定义的坐标处。

总的来说,第一段代码更加基础,主要向你展示了如何设置 Pygame 环境、初始化游戏窗口和基本的绘图功能。第二段代码则展示了如何创建和使用自定义的精灵类,以及如何处理更复杂的用户输入和在屏幕上绘制对象。

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

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

相关文章

机械臂与Realsense D435 相机的手眼标定ROS包

本教程主要介绍机械臂与 Realsense D435 相机手眼标定的配置及方法。 系统:Ubuntu 20.0.4 ◼ ROS:Noetic ◼ OpenCV 库:OpenCV 4.2.0 ◼ Realsense D435:librealsense sdk(2.50.0)、realsense-ros 功能包&…

electron调试自动更新,不触发下载进度解决方案

调试时候删除掉后缀是.blockmap的文件。如果你的代码在改动不大的情况下发布一个新版本。那个安装器可能会根据这个数据自动合成一个包,而不走网络路径。从而不触发下载进度。

初阶数据结构之双向链表详解

目录 一:双向链表的概念 1.什么是双向链表? 2.双向链表的优点 3.双向链表的结构 二:双向链表的实现 1.定义链表结点 2.初始化双向链表 3.添加结点 4.尾插 5.头插 6.打印双向链表 7.查找链表结点 8.在指定结点后插入新结点 9.删…

KMP算法【C++】

KMP算法测试 KMP 算法详解 根据解释写出对应的C代码进行测试&#xff0c;也可以再整理成一个函数 #include <iostream> #include <vector>class KMP { private:std::string m_pat;//被匹配的字符串std::vector<std::vector<int>> m_dp;//状态二维数组…

【iceberg】数据湖与iceberg调研与实战

文章目录 一. 为什么现在要强调数据湖1. 大数据架构发展历史2. Lambda架构与kappa架构3. 数据湖所具备的能力 二. iceberg是数据湖吗1. iceberg的诞生2. iceberg设计之table format从如上iceberg的数据结构可以知道&#xff0c;iceberg在数据查询时&#xff0c;1.查找文件的时间…

三、自定义信号和槽函数(无参和有参)

需求&#xff1a; 下班后&#xff0c;小明说请小红吃好吃的&#xff0c;随便吃&#xff0c;吃啥买啥 无参&#xff1a;小红没有提出吃啥 有参&#xff1a;小红提出自己想吃的东西&#xff0c;吃啥取决于一时兴起&#xff08;emit触发&#xff09; 思路&#xff1a; 1&#xff…

【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)

目录 0. 前情提醒&#xff1a; 1. 插入排序 1.1 基本思想&#xff1a; 1.2 直接插入排序 实现步骤&#xff1a; 动图演示&#xff1a; 特性总结&#xff1a; 代码实现&#xff1a; 1.3 希尔排序&#xff08;缩小增量排序&#xff09; 基本思想&#xff1a; 步骤演示&…

谷歌上架,个人号比企业号好上?“14+20”封测如何解决,你知道了吗

在Google Play上架应用&#xff0c;对开发者而言&#xff0c;既是挑战也是机遇。随着谷歌政策的不断更新&#xff0c;特别是要求2023年11月13日后注册的个人开发者账号在发布正式版应用前&#xff0c;必须经过20人连续14天的封闭测试。 这一政策的改变使得许多开发者开始考虑使…

适合小白入门的AI扩图(创成式填充)工具

近期&#xff0c;发现许多人对AI扩图工具的需求比较大&#xff0c;为了满足大家的需求&#xff0c;本期天祺为大家整理了一些好用的AI扩图工具&#xff0c;各个设配的扩图工具都有介绍哦&#xff0c;电脑&#xff0c;手机端都能用&#xff0c;大家可以根据自己的喜好和需求进行…

Linux程序开发(十):文件分类器趣味设计

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

搜索插入位置 ---- 二分查找

题目链接 题目: 分析: 因为数排序数组, 所以具有"二段性", 可以使用二分查找题目中, 我们如果找到目标值 , 则返回下标, 如果没找到目标值, 应该返回的是>target的第一个位置, 所以应该将数组分成< target 和 > target当<target时, 应该移动left, left…

Marin说PCB之POC电路layout设计仿真案例---03

今天中午午休我刚要打开手机的准备刷抖音看无忧传媒的学生们的“学习资料”的时候&#xff0c;看到CSDN -APP上有提醒&#xff0c;一看原来是一位道友发的一个问题&#xff1a; 本来小编最近由于刚刚从国外回来&#xff0c;手上的项目都已经结束了&#xff0c;这周开始学习仿真…

Xcode=> 安装 simulator

XCode xcode中下载 simulator 点击加号➕&#xff0c;选择对应的版本&#xff0c;即可下载 下载完成&#xff1a; 其他下载办法 因为使用上述下载&#xff0c;会经常性的出现断开&#xff0c;再次下载又是从头开始&#xff0c;太费时费力。下面使用下载地址&#xff0c;然后用…

软考中级-软件设计师-真题详解【2023年上半年】

2023上半年真题记忆点详解 本片不涉及解题法&#xff0c;只整理记忆背诵点&#xff0c;记住即可拿分。 上午题部分&#xff1a; 片内总线&#xff1a;用于芯片内部各主要部件连接&#xff1b; 系统总线&#xff1a;用于CPU、主存、外设见的数据传输&#xff1b; 通讯总线&…

百度信息流 - 成本保障未生效?

今天创建百度信息流单元时&#xff0c;发现一个细节&#xff0c;创建好后&#xff0c;成本保障未生效&#xff08;“保”字没有出现&#xff09; 过了一会&#xff0c;再进来看&#xff0c;成本保障生效了。 分析原因 &#xff1a; 展现为 1 &#xff0c;也就是说&#xff0c;一…

建筑施工突发事故应急处置vr安全培训平台

在不断发展的时代背景下&#xff0c;掌握必要的应急安全知识已成为我们生活中不可或缺的一部分。由央企携手我们华锐推出的3D线上应急宣教虚拟体验馆&#xff0c;标志着民众应急安全教育的全新里程碑&#xff0c;不仅突破了传统学习模式的局限&#xff0c;还让每个人都能在灵活…

GpuMall智算云:Ubuntu 实例桌面版

基于 ubuntu18.04 安装的桌面版本&#xff0c;桌面使用 xfce4 &#xff0c;集成了 Pytorch2.3.0、cuda11.8、Python3.10、VNC、noVNC、VSCode-Server。 在 镜像市场 选择xfce4-desktop镜像&#xff0c;然后进行创建实例 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall…

这八个步骤,有效进行防错管理

导读 在产品实际的生产过程中&#xff0c;因零件相似而错装、因零件又小又多而漏装等现象时有发生&#xff0c;需要防止或尽可能避免错误发生。 试想&#xff0c;一个操作人员每天进行同样的装配工作上百次千次甚至上万次&#xff0c;如果产品设计和过程设计开发不能防止提前预…

vue.js状态管理和服务端渲染

状态管理 vuejs状态管理的几种方式 组件内管理状态&#xff1a;通过data&#xff0c;computed等属性管理组件内部状态 父子组件通信&#xff1a;通过props和自定义事件实现父子组件状态的通信和传递 事件总线eventBus&#xff1a;通过new Vue()实例&#xff0c;实现跨组件通…

Pytorch入门(7)—— 梯度累加(Gradient Accumulation)

1. 梯度累加 在训练大模型时&#xff0c;batch_size 最大值往往受限于显存容量上限&#xff0c;当模型非常大时&#xff0c;这个上限可能小到不可接受。梯度累加&#xff08;Gradient Accumulation&#xff09;是一个解决该问题的 trick梯度累加的思想很简单&#xff0c;就是时…