【Godot4.2】CanvasItem绘图函数全解析 - 3.绘制纹理

概述

前两节我们讲述了常见几何图形绘制以及对几何图形应用变换的基础知识。
本节我们来讲如何在CanvasItem中绘制纹理。

系列目录

  • 0.概述
  • 1.绘制简单图形
  • 2.设定绘图变换
  • 3.绘制纹理
  • 4.绘制样式盒
  • 5.绘制字符和字符串
  • 6.TextLine和TextParagraph详解
  • 7.自定义节点TextBoard
  • 8.绘制点索引
  • 9.绘制表格

纹理绘制函数

CanvasItem纹理绘制函数有3个,参数以及效果有所差异:

draw_texture()

draw_texture(),在给定的位置以原尺寸绘制纹理。3个参数:

  • texture:要绘制的纹理图片,Texture2D类型
  • position:图片绘制的位置(左上角)
  • modulate:调制颜色,与纹理的颜色相乘,默认为Color(1, 1, 1, 1)
extends Node2D

const ICON = preload("res://icon.svg")  # Godot图标

func _draw() -> void:
	# 修改绘图坐标原点
	draw_set_transform(Vector2(200,200))
	
	# 直接原样绘制
	draw_texture(ICON,Vector2())

上面的代码中:

  • 我们首先加载Godot的图标并存储为ICON常量
  • 然后用draw_set_transform()将绘图的原点设为(200,200)
  • 接着用draw_texture()直接原样绘制ICON

绘制效果:
image.png

draw_texture_rect()

  • draw_texture_rect(),在给定矩形范围中进行纹理的绘制,会对图片进行缩放,参数如下:
    • texture:要绘制的纹理图片,Texture2D类型
    • rect: Rect2类型,给定绘图的位置和尺寸
    • tile: bool类型,决定图片是否平铺
    • modulate: 调制颜色
    • transpose: bool类型,默认为false,决定是否交换 X 和 Y 坐标
extends Node2D

const ICON = preload("res://icon.svg")  # Godot图标

func _draw() -> void:
	# 修改绘图坐标原点
	draw_set_transform(Vector2(200,200))
	
	# 在一个给定矩形范围中进行绘制
	var rect = Rect2(Vector2(200,0),Vector2(200,300))
	draw_texture_rect(ICON,rect,false)

上面的代码中:

  • 我们同样首先加载Godot的图标并存储为ICON常量
  • 然后用draw_set_transform()将绘图的原点设为(200,200)
  • 然后我们用draw_texture_rect()(200,200)为起始点(需要加上绘图原点的(200,200)),尺寸为(200,300)的矩形区域内,绘制ICON

绘制效果如下:
image.png

颠倒X、Y坐标

通过为draw_texture_rect()传入transpose=true,则绘制时图像的XY轴会翻转,类似与将图形逆时针旋转90度效果。

extends Node2D

const ICON = preload("res://icon.svg")  # Godot图标

func _draw() -> void:
	# 修改绘图坐标原点
	draw_set_transform(Vector2(200,200))
	
	# 在一个给定矩形范围中进行绘制
	var rect = Rect2(Vector2(0,0),Vector2(200,300))
	draw_texture_rect(ICON,rect,false,Color.WHITE,true)

绘制效果:
image.png

重复纹理

通过将tile参数设为true,可以开启纹理的重复模式。

extends Node2D

const ICON = preload("res://icon.svg")  # Godot图标

func _draw() -> void:
	# 修改绘图坐标原点
	draw_set_transform(Vector2(200,200))
	
	# 在一个给定矩形范围中进行绘制
	var rect = Rect2(Vector2(0,0),Vector2(200,300))
	draw_texture_rect(ICON,rect,true)

绘制效果:
image.png

draw_texture_rect_region()

  • draw_texture_rect_region(),可以看做是在draw_texture_rect()基础上,用另一个Rect2定义裁切矩形,然后在指定的矩形中绘制指定裁切矩形所定义的纹理的局部。

以下面代码为例:

extends Node2D

const ICON = preload("res://icon.svg")  # Godot图标

func _draw() -> void:
	# 修改绘图坐标原点
	draw_set_transform(Vector2(200,200))
	
	# 在一个给定的矩形范围内绘制纹理的一个区域
	var rect = Rect2(Vector2(500,0),Vector2(200,200))
	var clip_rect = Rect2(Vector2(0,0),Vector2(100,100))
	draw_texture_rect_region(ICON,rect,clip_rect)

上面的代码中:

  • 我们同样首先加载Godot的图标并存储为ICON常量
  • 然后用draw_set_transform()将绘图的原点设为(200,200)
  • 最后我们用draw_texture_rect_region()(500,0)为起始点(需要加上绘图原点的(200,200)),尺寸为(200,200)的矩形区域内,绘制ICON从左上角(0,0)开始,尺寸为(100,100)区域的纹理。

绘制效果如下:
image.png

纹理绘制函数的应用

借由三个纹理绘制函数,我们将可以在CanvasItem中绘制图形,并与几何图形联合使用。

创建平铺背景纹理

通过使用某些图片,通过平铺就可以创建无缝的背景纹理,可以使用小图片创建大背景。

extends Node2D

const WL = preload("res://wl.jpg")

func _draw() -> void:
	
	# 在一个给定的矩形范围内绘制纹理的一个区域
	var rect = Rect2(Vector2(10,10),Vector2(1100,600))
	draw_texture_rect(WL,rect,true)

image.png

自定义2D节点显示图片

我们通过设定一个名叫texture的导出变量来接收从文件系统和监视器面板设定的图片。
然后在_draw()中使用draw_texture原样绘制出来。
代码如下:

@tool
extends Node2D

@export var texture:Texture2D:
	set(val):
		texture = val
		queue_redraw()


func _draw() -> void:
	# 绘制texture参数指定的纹理
	if texture:
		draw_texture(texture,Vector2(0,0))

设定后的效果:
image.png

让纹理中心与原点重合
@tool
extends Node2D

@export var texture:Texture2D:
	set(val):
		texture = val
		queue_redraw()

func _draw() -> void:
	# 绘制texture参数指定的纹理
	if texture:
		var img_size = texture.get_size()
		
		draw_texture(texture,-img_size/2.0)
  • 通过texture.get_size()获取纹理的尺寸,存储到变量img_size
  • 并将纹理的绘制位置设为-img_size/2.0,来使图片的中心与Node2D的原点重合

绘制后的效果:
image.png

显示图片区域

在上面代码的基础上,我们继续添加纹理区域相关的参数。

@tool
extends Node2D

@export var texture:Texture2D:
	set(val):
		texture = val
		queue_redraw()

@export_group("region")

## 是否启用显示图形区域
@export var region_enabled:= false:
	set(val):
		region_enabled = val
		queue_redraw()

## 区域的起始点
@export var region_pos:Vector2:
	set(val):
		region_pos = val
		queue_redraw()

## 区域的尺寸		
@export var region_size:Vector2:
	set(val):
		region_size = val
		queue_redraw()


func _draw() -> void:
	# 绘制texture参数指定的纹理
	if texture:
		var img_size = texture.get_size()  # 纹理的尺寸
		if region_enabled: # 开启了纹理区域
			
			var clip_rect = Rect2(region_pos,region_size)
			var texture_rect = Rect2(-region_size/2.0,region_size)
			draw_texture_rect_region(texture,texture_rect,clip_rect)
		else:  # 未开启纹理区域
			draw_texture(texture,-img_size/2.0)

效果如下:
image.png
只要启用region_enabled,会按照region_posregion_size指定的矩形区域显示图片的局部。
而禁用region_enabled后,则会显示原图:
image.png

总结

  • 本节内容比较简单,主要涉及绘制纹理相关的3个函数。
  • 通过这3个函数,能实现很多自定义节点或绘图时的功能需要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 函数——函数封装与程序的健壮性

目录 函数封装(Encapsulation) 如何增强程序的健壮性? 如何保证不会传入负数实参? 函数设计的基本原则 函数封装(Encapsulation) 外界对函数的影响——仅限于入口参数 函数对外界的影响——仅限于一个…

MySQL前缀索引(3/16)

前缀索引 前缀索引:MySQL支持前缀索引,允许定义字符串的一部分作为索引。如果不指定前缀长度,索引将包含整个字符串。前缀索引可以节省空间,但可能会增加查询时的记录扫描次数(因为会查询到多个前缀相同的数据&#x…

MySQL数据库的增删改查(进阶)

1.新增 将一个表中的内容插入到另一个表中. 这里需要确保查询集合的列数,类型,顺序要和插入表的列数,类型,顺序一致,这里列的名称可以不一样. values 替换成了select 查询的临时表. 2. 查询 2.1 聚合查询 2.1.1 聚合查询 函数 说明COUNT([DISTINCT] expr)返回…

python爬虫--------Beautiful Soup 案列(二十一天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

同城O2O系统搭建实战:外卖跑腿APP发全攻略

在同城服务领域,外卖和跑腿服务成为了人们生活中不可或缺的一部分。接下来小编将带领读者进入同城O2O系统搭建的实战领域,详细介绍如何打造一款外卖跑腿APP。 第一步:需求分析 这包括对目标用户群体的调研,明确用户的需求和痛点。…

FreeFileSync|本地自动备份设置教程,终于可以不用手动同步了

前言 昨天小白给各位小伙伴分享了FreeFileSync软件,由于篇幅过长,所以整个教程中并没有教小伙伴们如何设置自动同步的办法。 今天小白就来唠唠:如何让FreeFileSync自动同步。 教程分为几种: 开机自动同步 开机之后自动执行一次…

OpenHarmony南向嵌入式:【XR806开发板指导文档】

一. 简介 芯片介绍 XR806是全志科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集成度无线MCU芯片,支持OpenHarmony轻量设置系统。具有集成度高、硬件设计简单、BOM成本低、安全可靠等优点。可广泛满足 智能家居、智慧楼宇、工业互联、儿童玩具、电子竞…

【uniapp】省市区下拉列表组件

1. 效果图 2. 组件完整代码 <template><view class="custom-area-picker"><view

C语言函数指针应用——计算器(转移表)的使用

对与上一节&#xff0c;我们对指针函数已经有了深刻意识了&#xff1b;练一练吧 如果还没有学习到&#xff0c;也是没有关系的&#xff0c;可以看一看这一篇 C语言详解指针-CSDN博客https://blog.csdn.net/Asuku_/article/details/137690083希望能提高你对指针的理解 计算器的实…

在Windows下面的vscode配置cmake使用vcpkg包管理器

安装 vscode下载地址 cmake下载地址 vcpkg下载地址 创建CMake项目 // main.cpp #include <fmt/core.h>int main() {fmt::print("Hello World!\n");return 0; }// CMakeLists.txtcmake_minimum_required(VERSION 3.10)project(HelloWorld)find_package(fmt…

详解“国九条3.0版”重磅落地:A股这些方向或有新气象

围绕资本市场下一阶段的重大改革举措&#xff0c;正在从更高层面赫然开启。 4月12日&#xff0c;国务院发布《关于加强监管防范风险推动资本市场高质量发展的若干意见》&#xff08;以下简称“意见”&#xff09;&#xff0c;全文围绕新股上市发行、上市公司监管、退市机制、强…

nacos 安装保姆级教程

安装nacos nacosVersion:2.2.3 需要的java版本较高&#xff0c; 所以这里直接安装jdk17&#xff1b; 安装链接见nacos 和jdk 官网&#xff0c;具体选择下面图片中的两个版本哈 本来想直接传到csdn的&#xff0c;结果这边的资料审核还是有点繁琐&#xff0c;然后上传的速度也有点…

生产环境中秒杀接口并发量剧增与负载优化策略探讨

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 1. 实施限流措施 1.1 令牌桶算法&#xff1a; 1.2 漏…

精品资料-2024护网HVV实战教程资料合集(共20章)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/19vwYrf4t 精品推荐&#xff0c;2024护网HVV实战教程资料合集&#xff0c;压缩包内涵大量实战资料&#xff0c;共20章。星球内会持续更新教程包。 01-HW介绍.zip 02-HTTP&Bu…

第六季:RTSP协议详解与实时流视频预览(2)

目录 前言1 网络传输基本知识1.1 OSI七层模型1.2 TCP/IP四层模型1.3 总结 2 RTSP协议详解 前言 经过上篇文章的学习&#xff0c;我们已经了解了H.264标准的基本组成与原理&#xff0c;知道了发送的数据的格式与组成&#xff0c;即NALU。但是数据的发送要通过RTSP协议进行发送&…

Project Euler_Problem 160_Factorial Trailing Digits_费马小定理,威尔逊定理,左右互搏

原题目&#xff1a; 题目大意&#xff1a;1e12的阶乘&#xff0c;不算末尾的0&#xff0c;后5位数字为多少 解题思路&#xff1a; 暴力运算也能算&#xff0c;就是有点慢&#xff0c;优化过后可能也得算个几十分钟 这里考虑使用威尔逊定理费马小定理 用这个方法我们就可以得到…

使用Riverpod在Flutter中创建Todo列表

使用Riverpod在Flutter中创建Todo列表 视频 https://youtu.be/mlbeSD1KSIo https://www.bilibili.com/video/BV1jj42197c8/ 前言 原文 https://ducafecat.com/blog/flutter-todo-list-with-riverpod-guide-02 学习如何使用Riverpod在Flutter中构建一个功能完整的Todo列表应用…

VMware EXSI

VMware ESXI是一款行业领先、专门构建的裸机hypervisor。 它直接通过安装在物理服务器上并将其划分为多个逻辑服务器&#xff0c;也就是虚拟机。 创建过程&#xff1a;就是F11Enter 输入账号密码 添加网卡 配置网卡地址 vsphere Client工具来连接EXSI EXSI资源分割&…

4. Django 探究FBV视图

4. 探究FBV视图 视图(Views)是Django的MTV架构模式的V部分, 主要负责处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示. 也可以理解为视图是MVC架构里面的C部分(控制器), 主要处理功能和业务上的逻辑. 我们习惯使用视图函数处理HTTP请求, 即在视图里定义def…

c++的学习之路:23、多态(2)

摘要 多态的抽象类、原理以及虚表。 目录 摘要 一、抽象类 1、 概念 2、接口继承和实现继承 二、多态的原理 1、虚函数表 2、动态绑定与静态绑定 三、单继承和多继承关系的虚函数表 1、单继承中的虚函数表 2、多继承中的虚函数表 四、思维导图 一、抽象类 1、 概…