Pygame库中Surface 对象介绍

Pygame库中Surface 对象介绍

关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520

Pygame库中Surface 对象

在Pygame库中,Surface 对象是一个非常核心的概念,它代表了一个二维的矩形画布,可以在上面绘制图像、图形、文本等内容。每个 Surface 都有自己的像素格式和尺寸,它们可以被用来表示游戏中的任何可见元素,比如背景、角色、物品等。

创建Surface对象

你可以通过多种方式创建一个 Surface 对象:

  1. 通过 pygame.display.set_mode() 创建主显示 Surface,这通常是游戏窗口的画布。
  2. screen = pygame.display.set_mode((width, height))
  3. 通过 pygame.Surface() 直接创建一个新的 Surface 对象。
  4. new_surface = pygame.Surface((width, height))
  5. 通过加载一个图像文件创建 Surface 对象。
  6. image_surface = pygame.image.load('image.png')

Surface对象的属性和方法

Surface 对象有很多属性和方法,以下是一些常用的:

  • get_size(): 返回 Surface 对象的尺寸,即宽和高。
  • get_width(): 返回 Surface 对象的宽度。
  • get_height(): 返回 Surface 对象的高度。
  • fill(): 使用单一颜色填充整个 Surface。
  • blit(): 将一个 Surface 对象绘制到另一个上面,这是图像合成的基本操作。
  • convert(): 改变 Surface 的像素格式,以更好地匹配显示设备,这可以提高绘制速度。
  • set_alpha(): 设置 Surface 的透明度。
  • get_rect(): 获取一个矩形对象,其大小与 Surface 相同,常用于处理位置和碰撞检测。

绘制和更新Surface

在Pygame中,当你对 Surface 进行绘制操作后,这些操作不会立即反映到屏幕上。你需要调用 pygame.display.flip() 或 pygame.display.update() 来更新显示的内容。

  • pygame.display.flip(): 更新整个屏幕的内容。
  • pygame.display.update(): 可以更新屏幕的一个区域或多个区域。

Pygame 中 Surface 对象的基本使用方法如下:

1、创建 Surface 对象

要在 Pygame 中创建一个 Surface 对象,你可以使用 pygame.Surface() 函数,并传入一个元组,指定你希望创建的 Surface 的宽度和高度:

import pygame

# 初始化pygame
pygame.init()

# 创建一个Surface对象
surface_width = 800
surface_height = 600
my_surface = pygame.Surface((surface_width, surface_height))

 

2、绘制 Surface 对象

你可以使用各种 Pygame 的绘图函数来在 Surface 上绘制图形。例如,你可以在一个 Surface 上绘制一个矩形:

# 设置颜色
color = (255, 0, 0) # RGB颜色,这里是红色

# 绘制一个矩形
# pygame.draw.rect(Surface, color, Rect, width=0)
pygame.draw.rect(my_surface, color, (10, 10, 50, 50))

 

3、显示 Surface 对象

创建和绘制 Surface 之后,你需要将它绘制到主显示 Surface 上,这通常是你通过 pygame.display.set_mode() 获取的 Surface。你可以使用 blit 方法来完成这个操作:

# 创建主显示Surface
screen = pygame.display.set_mode((800, 600))

# 把我们创建的Surface对象绘制到主显示Surface上
screen.blit(my_surface, (0, 0))

# 更新整个待显示的 Surface 对象到屏幕上
pygame.display.flip()

4、事件循环

在 Pygame 中,你需要设置一个事件循环来保持游戏的运行,并在适当的时候处理事件(如按键和退出):

# 游戏主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 其他游戏逻辑和渲染

    # 更新显示
    pygame.display.flip()

# 退出pygame
pygame.quit()

使用Python的pygame库画花

例1、效果图:

源码如下:

import pygame
import sys# 初始化pygame
pygame.init()# 设置窗口尺寸
width, height = 400, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('画花')# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
BROWN = (139, 69, 19)# 绘制背景
screen.fill(WHITE)# 画花
pygame.draw.circle(screen, RED, (200, 200), 30)  # 花心
pygame.draw.circle(screen, YELLOW, (170, 170), 30)  # 花瓣1
pygame.draw.circle(screen, YELLOW, (230, 170), 30)  # 花瓣2
pygame.draw.circle(screen, YELLOW, (170, 230), 30)  # 花瓣3
pygame.draw.circle(screen, YELLOW, (230, 230), 30)  # 花瓣4# 画枝条
pygame.draw.rect(screen, BROWN, (195, 250, 10, 100))  # 枝条# 画叶子
pygame.draw.polygon(screen, GREEN, [(100, 200), (150, 280), (195, 300)])  # 左叶子
pygame.draw.polygon(screen, GREEN, [(280, 200), (250, 280), (205, 300)])  # 右叶子# 刷新屏幕
pygame.display.flip()# 保持窗口打开
while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()

例2、效果图:

源码如下:

import pygame
import sys# 初始化 Pygame
pygame.init()# 设置屏幕大小
screen = pygame.display.set_mode((600, 400))# 设置标题
pygame.display.set_caption("花")# 定义樱花的颜色
red = (255, 0, 0)
Green = (0, 255, 0)
# 定义枝条的颜色
brown = (139, 69, 19)def draw_cherry_blossom(x, y):# 绘制樱花的五个瓣pygame.draw.ellipse(screen, red, (x, y, 10, 20))pygame.draw.ellipse(screen, red, (x+10, y-10, 20, 10))pygame.draw.ellipse(screen, red, (x+20, y, 10, 20))pygame.draw.ellipse(screen, red, (x+5, y+10, 20, 10))pygame.draw.ellipse(screen, red, (x-10, y+10, 20, 10))# 绘制花的中心pygame.draw.circle(screen, (255, 255, 255), (x+15, y+15), 5)# 绘制枝条pygame.draw.line(screen, Green, (x+15, y+1), (x+15, y+35), 2)pygame.draw.line(screen, brown, (x+10, y+35), (x+20, y+35), 4)# 游戏主循环
running = True
while running:# 处理事件for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 填充背景screen.fill((255, 255, 255))# 绘制花draw_cherry_blossom(150, 200)draw_cherry_blossom(250, 250)draw_cherry_blossom(300, 180)draw_cherry_blossom(320, 280)draw_cherry_blossom(400, 200)# 更新屏幕pygame.display.flip()# 退出 Pygame
pygame.quit()
sys.exit()

说明:pygame.draw.line(screen, Green, (100,200),(220,320),2)的意思:

pygame.draw.line: 这是pygame库中的一个函数,用于绘制线段。

screen: 这是一个pygame的Surface 对象,通常是你想要绘制线的屏幕或窗口。

Green: 这是一个颜色元组,表示线的颜色。在这个例子中,线将是绿色的。

(100,200): 这是线段起始点的坐标。

(220,320): 这是线段终点的坐标。

2: 这是线段的宽度。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LSTM时间序列预测

本文借鉴了数学建模清风老师的课件与思路,可以点击查看链接查看清风老师视频讲解:【1】演示:基于LSTM深度学习网络预测时间序列(MATLAB工具箱)_哔哩哔哩_bilibili % Forecast of time series based on LSTM deep learn…

2024美赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法,其…

推荐两个工具:DeepSpeed-FastGen和DataTrove

DeepSpeed-FastGen 通过 MII 和 DeepSpeed-Inference 加速LLM生成文本 仓库地址:https://github.com/microsoft/DeepSpeed/tree/master/blogs/deepspeed-fastgen GPT-4 和 LLaMA 等大型语言模型 (LLM) 已成为服务于各个级别的人工智能应用程序的主要工作负载。从一…

C++PythonC# 三语言OpenCV从零开发(2):教程选择

文章目录 相关专栏前言视频教学和官方文档视频教程OpenCV 官方教程最终选择我的最终选择 相关专栏 C&Python&Csharp in OpenCV 前言 OpenCV 有官方的教程和简单的视频教程: OpenCV 官方教程 B站也有相关的视频教学 OpenCV4 C 快速入门视频30讲 - 系列合集 …

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件,其对应有UE引擎的插件(Plugin_XV3dGS)可以把相关格式的文件导入到引擎; 首先Polycam的官网为:My Captures | Polycam 可以下载各种用户扫描文件&#xff…

解锁黑匣子:Chain-of-Note如何为(RAG)带来透明度

英文原文地址:https://ai.plainenglish.io/unlocking-the-black-box-how-chain-of-note-brings-transparency-to-retrieval-augmented-models-rag-ae1ebb007876 论文地址:https://arxiv.org/pdf/2311.09210.pdf 2023 年 11 月 16 日 介绍 检索增强语…

树形结构下拉框组件vue-treeselect的使用(安装、模糊匹配、单选、多选、延迟加载、异步搜索等)

一、基本使用流程 首先npm安装依赖 npm install riophae/vue-treeselect --save然后在需要使用的组件中引入 import Treeselect from riophae/vue-treeselect import riophae/vue-treeselect/dist/vue-treeselect.css声明组件 components: { Treeselect }使用 <treesele…

JDK 动态代理(Spring AOP 的原理)(面试重点)

代理模式 也叫委托模式.定义&#xff1a;为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们 在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调⽤&#xff0c;在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对…

为什么 HTTPS 协议能保障数据传输的安全性?

HTTP 协议 在谈论 HTTPS 协议之前&#xff0c;先来回顾一下 HTTP 协议的概念。 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议&#xff0c;它位于 OSI 网络模型中的应用层。 HTTP 协议是通过客户端和服务器的请求应答来进行通讯&#xff0c;目前协议由之前的 RFC 2616 拆…

电压检测芯片适用于哪些应用领域?

原文链接&#xff1a; 电压检测芯片适用于哪些应用领域&#xff1f; - 知乎 (zhihu.com) 电压检测基本涉及到电子世界的方方面面。 我上一份工作是做无人机飞控研发&#xff0c;无人机在使用过程中是需要事件监测电压的&#xff0c;还需要针对电压对航行进行预估&#xff0c;…

WebDriverWait太强大

selenium webdriver及wait 1 implicitly包打天下2 Linkedin无法登录返回值很乱&#xff0c;怎么破&#xff1f; 1 implicitly包打天下 有了implicitly之后&#xff0c;基本上不再关注网速之类的影响。 self.driver.implicitly_wait(511)2 Linkedin无法登录返回值很乱&#xf…

.net core 6 集成nacos的服务注册和配置中心

1、安装nuget包 2、加上配置文件 "nacos": {"ServerAddresses": [ "http://127.0.0.1:8848" ],"GroupName": "DEFAULT_GROUP","ClusterName": "DEFAULT","ServiceName": "webapi"…