【极简】Godot4.4 简易仓库B(附完整代码/素材包)

Godot4.4项目Git仓库管理模板:新手开箱即用的最佳实践 在游戏开发与软件工程中,版本控制系统是管理项目代码与资源、实现团队协作的核心工具。Git作为分布式版本控制系统的代表,通过跟踪文件变更、支持分支管理,为项目迭代提供了可靠保障。其技术价值在于确保代码历史可追溯、降低协作冲突风险,广泛应用于开源项目、独立游戏开发等场景。对于使用Godot引擎的开发者而言,合理的项目结构与.gitignore配置是高效利用Git进行项目管理的基础。本文聚焦于Godot4.4项目,提供一个**开箱即用**的仓库模板,详细解析了针对Godot引擎特性的目录设计、资源管理策略以及.g 阅读详情

无望其速成,无诱于势利。

一、展示

在 【极简】Godot4.4 简易仓库A(附完整代码/素材包)基础上,本文拓展了原有的仓库功能,实现物品:1. 拖拽放置 2. 拖拽分割

请添加图片描述

二、复刻

更新脚本

1. event_bus.gd

extends Node

@warning_ignore("unused_signal")
signal inventory_item_added(item: InventoryItem)	# 添加物品
@warning_ignore("unused_signal")
signal slot_item_dropped(index: int)	# 丢弃物品
@warning_ignore("unused_signal")
signal slot_item_divided(index: int)	# 拖拽部分物品

var inventory_items: Array[Resource]	# 存储物品数据的列表

func _ready() -> void:
	inventory_items.resize(6)

2. slot_ui.gd

class_name SlotUI
extends VBoxContainer
## 物品槽,实现拖放

@export var inventory_item: InventoryItem
var is_empty: bool = true  #物品槽默认为空
var slot_index: int = -1  #物品槽索引默认为-1
var current_stack_label_text: String
var is_drag_failed: bool = false  #判断拖放是否成功

@onready var texture_rect: TextureRect = $TextureRect
@onready var stack_label: Label = $TextureRect/StackLabel
@onready var name_label: Label = $NameLabel


# 初始化物品槽
func _ready() -> void:
	if inventory_item.texture != null:
		texture_rect.texture = inventory_item.texture
	if inventory_item.name != null:	
		name_label.text = inventory_item.name
	
	EventBus.slot_item_dropped.connect(_on_self_slot_item_dropped)
	
	
# 当收到InventoryUI节点发送的信号后,更新物品槽
# 命名规范:_on_[发送节点名]_[发送信号名]
func update_slot(item: InventoryItem) ->void:
	texture_rect.texture = item.texture
	stack_label.text = str(item.stack)
	name_label.text = item.name	
	is_empty = false
	
	
# 返回true:可放,false:不可放
func _can_drop_data(_at_position: Vector2, _data: Variant) -> bool:
	return true
	
	
# 拖	
func _get_drag_data(_at_position: Vector2) -> Variant:
	# 验非空,创建拖动预览图,并发送数据
	if !is_empty:
		var drag_preview = TextureRect.new()
		# 【CTRL + 鼠标左键】拾取物品槽中一半物品
		if Input.is_key_pressed(KEY_CTRL):
			# 预览图复制体,确保原物品槽中有图形
			var drag_pre = drag_preview.duplicate(true)
			drag_pre.texture = texture_rect.texture
			set_drag_preview(drag_pre)
			# 改变原物品槽标签,如果拖动则减半
			current_stack_label_text = stack_label.text  # 存储原标签
			var split_stack_label_text: String = str(ceili(int(stack_label.text)/2.0))  # 除以2向上取整
			stack_label.text = str(int(stack_label.text) - int(split_stack_label_text))
			is_drag_failed = true
		
		# 发送数据给_can_drop_data和_drop_data
			return {
				"item": inventory_item,
				"texture": texture_rect.texture,
				"name": name_label.text,
				"stack": split_stack_label_text,
				"is_empty": is_empty,
				"index": slot_index,
				"slot": self,
			}
		else:
			drag_preview.texture = texture_rect.texture
			set_drag_preview(drag_preview)
		
		# 发送数据给_can_drop_data和_drop_data
			return {
				"item": inventory_item,
				"texture": texture_rect.texture,
				"name": name_label.text,
				"stack": stack_label.text,
				"is_empty": is_empty,
				"index": slot_index,
				"slot": self,
			}
			
	return null
	
	
# 放
func _drop_data(_at_position: Vector2, data: Variant) -> void:
	# 如果源物品数据不为空,且放置的对象不为它本身
	if data != null and data["slot"] != self:
		# 存储目标物品数据
		var temp_item: InventoryItem = inventory_item
		var temp_texture: Texture = texture_rect.texture
		var temp_stack: String = stack_label.text
		var temp_name: String = name_label.text
		var temp_is_empty: bool = is_empty
		var remain: int = int(data["stack"])
		# 同名则尝试堆叠
		if name_label.text == data["name"]:
			var available: int = inventory_item.max_stack - int(stack_label.text)
			var add_amount: int = min(available, remain)
			var new_amount: int = int(stack_label.text) + add_amount
			# 更新目标同名物品堆叠后的信息
			update_slot_item(data["item"], data["texture"], str(new_amount), data["name"], data["is_empty"], slot_index)
			remain = remain - available
			if remain > 0:
				# Ctrl+鼠标左键
				if data["slot"].is_drag_failed == true:
					var update_amount: int = int(data["slot"].current_stack_label_text) - int(data["stack"]) + remain
					print(update_amount)
					data["slot"].update_slot_item(data["item"], data["texture"], str(update_amount), data["name"], data["is_empty"], data["index"])
					print_debug("同名/remain>0/Ctrl+鼠标左键:")
				# 鼠标左键
				else:
					data["slot"].update_slot_item(data["item"], data["texture"], str(remain), data["name"], data["is_empty"], data["index"])
			else:
				# Ctrl+鼠标左键
				if data["slot"].is_drag_failed == true:
					# 更新源物品槽物品信息
					var update_amount: int = int(data["slot"].current_stack_label_text) - int(data["stack"])
					data["slot"].update_slot_item(temp_item, temp_texture, str(update_amount), temp_name, temp_is_empty, data["index"])
					data["slot"].is_drag_failed = false
				# 鼠标左键
				else:
					# 清空源物品槽
					data["slot"].update_slot_item(null, null, "", "", true, data["index"])
		# 空
		elif name_label.text == "":
			# Ctrl+鼠标左键
			if data["slot"].is_drag_failed == true:
				if int(data["stack"]) == 1:
					return
				# 把这一半物品放在空槽中
				update_slot_item(data["item"], data["texture"], data["stack"], data["name"], data["is_empty"], slot_index)
				# 更新失去这一半物品的源物品槽
				var update_amount: int = int(data["slot"].current_stack_label_text) - int(data["stack"])
				data["slot"].update_slot_item(temp_item, data["texture"], str(update_amount), data["name"], data["is_empty"], data["index"])
				data["slot"].is_drag_failed = false
			# 鼠标左键
			else:
				# 交换物品信息
				update_slot_item(data["item"], data["texture"], data["stack"], data["name"], data["is_empty"], slot_index)
				data["slot"].update_slot_item(temp_item, temp_texture, temp_stack, temp_name, temp_is_empty, data["index"])
				print_debug(EventBus.inventory_items)
				print_debug(temp_texture, temp_is_empty)
		# 不同名
		else:
			# Ctrl+鼠标左键
			if data["slot"].is_drag_failed == true:
				return
			# 鼠标左键
			else:
				# 交换物品信息
				update_slot_item(data["item"], data["texture"], data["stack"], data["name"], data["is_empty"], slot_index)
				data["slot"].update_slot_item(temp_item,temp_texture, temp_stack, temp_name, temp_is_empty, data["index"])


# 设置拖放进来的物品数据
func update_slot_item(item: InventoryItem, texture: Texture, stack: String, object_name: String, empty: bool, index: int):
	# 更新库存数据
	texture_rect.texture = texture
	stack_label.text = stack
	name_label.text = object_name
	is_empty = empty
	slot_index = index
	
	# 更新全局列表Array[inventory_items]的数据
	# 若空则使得该列表元素为空
	if is_empty:
		EventBus.inventory_items[slot_index] = null
		return
	# 若不为空,更新列表
	else:
		var new_item: InventoryItem = item.duplicate(true)
		new_item.texture = texture
		new_item.stack = int(stack)
		new_item.name = object_name
		EventBus.inventory_items[slot_index] = new_item
		
		
# 丢弃物品
func _on_self_slot_item_dropped(drop_index: int) ->void:
	# 清空列表和物品槽
	update_slot_item(null, null,"", "", true, drop_index)
	# 可扩展丢弃动画


# 如果按Ctrl拖拽失败,没有发生物品信息的变化,则恢复被分割的原标签
func _notification(what: int) -> void:
	if what == NOTIFICATION_DRAG_END:
		if is_drag_failed:
			stack_label.text = current_stack_label_text
			is_drag_failed = false

三、运行测试

搭建测试场景如下:

在这里插入图片描述
请添加图片描述
测试完成!

四、免费开源资产包

某开源网站精灵图资源包链接: 点击此处

  1. 进入链接后点击下图按钮
    下载

  2. 然后点击【No thanks,just take me to the downloads】(不了谢谢,只想下载)
    No thanks,just take me to the downloads

  3. 最后点击下图按钮完成下载(注意导入前需解压缩)
    下载

深入Godot文档仓库:从源码构建到定制化部署的完整指南 开源游戏引擎的文档系统是开发者生态的重要基石,它不仅提供API参考和教程,更是社区协作的知识库。基于Sphinx等文档生成框架,这类系统通过解析结构化源码注释(如XML格式的类定义)自动生成HTML页面,实现了文档与代码的同步更新。其技术价值在于为开发者提供准确、可离线访问、可搜索的权威参考资料,并能通过版本控制进行协作维护。在Godot引擎生态中,文档仓库(godot-docs)采用reStructuredText格式编写内容,结合自定义Sphinx扩展处理引擎特有的类、方法和信号引用。通过搭建本地Pyt 阅读详情

相关推荐

python数据分析与可视化

Python数据分析主要包括数据清洗、数据探索和数据可视化三个部分。数据清洗是数据分析的重要环节,主要是对数据进行预处理,包括缺失值处理、异常值处理、数据类型转换等。数据探索则是通过对数据进行初步分析,了解数据的分布和特征,为后续的数据分析提供基础。数据可视化则是将数据以图形化的方式呈现,帮助人们更好地理解和分析数据。

2301_82032652的博客 7711

Godot编辑器极简主题定制:从视觉降噪到布局优化的全流程实践

在游戏开发与引擎学习中,界面主题定制是提升开发效率与专注度的重要工程实践。其核心原理在于通过系统性的视觉降噪与布局重构,优化人机交互的信息流,减少认知负荷。从技术价值看,一个精心设计的主题不仅能降低新手学习门槛,更能为复杂项目(如AI集成、大型资源管理)提供纯净的创作空间。具体到应用场景,开发者常面临编辑器信息过载、色彩干扰与布局混乱等问题,这正凸显了界面优化的重要性。本文以Godot编辑器为例,深入探讨如何通过修改主题资源、调整配色方案与编写布局脚本,实现从“功能可见性”到“需求可见性”的转变,其中涉及g

weixin_34310369的博客 472

ROS入门(一)——ROS安装(vmware16+ubuntu20.04+ROS-Noetic)

嵌套:ROS可以在Ubuntu上运行,Ubuntu在虚拟机Vmware中安装。 从 虚拟机vmware安装→ubuntu安装→ros安装,逐步介绍安装ROS环境的过程。整个过程是我一步步跟着各种博客安装实现的,亲测可行。 版本: Vmware :Vmware Workstation16 Ubuntu :20.04 ROS :Noetic 其中vmware直接载当前最新版本就好,而ubuntu的版本要注意一下。 在ROS官网(cn - ROS Wiki),我们进入到ROS安装的步骤界面,可以看..

Netceor的博客 9740

4.Godot图片素材的获取和编辑

游戏开发中经常遇到图片素材的需求。

ChoSeitaku的博客 4312

国产SR8201F以太网PHY芯片调试避坑指南:从机贴失败到杜邦线救场的实战记录

本文详细介绍了国产SR8201F以太网PHY芯片的调试避坑指南,涵盖硬件设计、PCB布局、SMT贴片及软件驱动等关键环节。通过实战案例解析,帮助工程师解决MII/RMII接口配置、电源设计、信号完整性等典型问题,提升以太网通信稳定性与EMC性能。

c6d7e8f9g的博客 1214

【极简】Godot4.4 简易仓库A(附完整代码/素材包)

【极简】Godot:简易库存,实现物品堆叠功能

ForBigData的博客 1607

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

【代码】Godot官网入门2D游戏《Dodge the Creeps》(含注解)

本来在学习Unity,看到有网友在推荐这款 godot 游戏引擎,听说是跨平台的框架,性能不错,也容易入门,找到官网上的例子试试。

沧浪之歌2024的博客 1043

ardupilot开发 --- Remote ID 篇

适配ardupilot的Remote ID模块研发,远程标识模块研发。Remote ID模块可以通过蓝牙或wifi向外广播无人机的状态信息、位置信息、任务信息等,并可以通过蜂窝数据向国家无人驾驶航空器一体化综合监管服务平台上报这些信息。Remote ID功能是21年起国家出台的民用无人机适航飞行的基本要求!

记录老板的每次pua,分享领导每天的毒鸡汤... 9607

Python爬虫实战:逆向工程与异步爬虫技术,高效抓取国家知识产权局专利数据

相比于传统的Selenium,Playwright由微软开发,支持多浏览器(Chromium, Firefox, WebKit),API更现代,执行速度更快,并且能轻松录制用户操作生成代码。通常,列表中的摘要信息是缩略的,我们需要进入每个专利的详情页获取完整信息(如主权要求、法律状态等)。我们的第一步是手动操作一遍搜索流程,并用Playwright的“录制”功能或开发者工具,找出真正返回专利数据的那一个或多个网络请求。以友好的、对人类行为模拟的方式爬取数据是基本的网络礼仪,也能有效避免你的IP被封锁。

2201_76125261的博客 2419

【亲测免费】 Godot资源库:开发者必备的开源宝库

Godot资源库是Godot引擎的官方资源库,为开发者提供了一个集中的平台,用于分享和获取Godot引擎的插件、脚本、模型等资源。该项目不仅包括一个强大的REST API,还提供了一个用户友好的前端界面,方便开发者浏览、搜索和下载资源。 ## 项目技术分析 Godot资源库项目采用了现代化的技术栈,确保了高效、稳定和可扩展的性能。以下是项目的主要技术点: - **REST API**: 项目...

gitblog_00149的博客 1547

汇川Easy系列斜坡函数功能块(支持状态输出)

IN rSetValue REAL 0.000000 0.000000 不保持 目标值 1IN rMaxValue REAL 0.000000 0.000000 不保持 最大目标值 2IN rMinValue REAL 0.000000 0.000000 不保持 最小目标值 3IN rSmoothTime REAL 100.000000 100.0000 不保持 最小到最大值平滑时间 单位 秒 4IN diTs DINT 10 10 不保持 函数调用周期采样时间中断时间 5。

RXXW_Dor的博客 455

如何高效提取Godot游戏资源?godot-unpacker让素材获取提速5倍

还在为游戏素材提取耗时发愁?godot-unpacker工具3步搞定PCK文件解包,轻松获取纹理图片、音频等游戏资源。作为一款专为Godot引擎设计的开源工具,它能自动识别并转换多种资源格式,让普通用户也能快速解锁游戏素材宝库。 ## 3分钟环境部署指南 ### 系统要求检查 确保您的Python版本为3.10或更高: ```bash python --version ``` ### 获取工

gitblog_00746的博客 331

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【极简】Godot 4.4 简易仓库C(附完整代码/素材包)

【极简】Godot 简易仓库,在前文基础上实现拖拽丢弃物品功能,包括鼠标左键丢弃与Ctrl+鼠标左键丢弃

ForBigData的博客 913

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何打造清爽高效的Godot开发环境?极简编辑器主题Minimal Theme全攻略

在游戏开发的世界里,一个舒适高效的编辑器界面能让创作过程事半功倍!今天我们要分享的**Godot Minimal Theme**,正是为追求简洁美学与实用功能的开发者打造的终极解决方案。这款轻量级主题通过精心设计的色彩搭配与界面优化,让你的Godot引擎焕然一新,从此告别杂乱界面,专注创意本身! ## ???? 为什么选择Minimal Godot Theme?三大核心优势 ### ✅ 极简设计,...

gitblog_00865的博客 646

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

告别视觉疲劳:5分钟打造专属Godot极简开发环境

还在为Godot编辑器那单调的界面而烦恼吗?每天面对杂乱无章的工具栏和刺眼的配色方案,是否让你在创作时难以保持专注?别担心,今天我要为你介绍一个能够彻底改变开发体验的神奇工具——Godot Minimal Theme。 ## 你的开发痛点,它都懂 长时间编码导致的眼睛疲劳、在复杂项目中找不到关键工具、界面元素过多分散注意力……这些都是开发者们经常遇到的困扰。Godot Minimal Them

gitblog_00015的博客 296

如何为Godot Engine构建LuaScript模块?完整编译指南

LuaScript是一个为Godot Engine 4.x提供Lua 5.4语言支持的模块,它允许开发者在Godot中使用Lua编写游戏逻辑,同时享受Godot强大的游戏开发功能。本文将详细介绍如何编译和安装LuaScript模块,让你快速上手这一强大工具。 ## 📋 准备工作 在开始编译LuaScript之前,你需要确保系统中已经安装了以下工具和环境: - Godot Engine源代码

gitblog_00009的博客 748

Godot Minimal Theme:从社区主题到官方默认的极简UI设计演进

在软件开发领域,用户界面(UI)设计直接影响开发者的工作效率与体验。优秀的UI设计遵循‘少即是多’的原则,通过降低认知负荷、建立清晰的信息层级和保持一致性,来提升工具的可用性。这种设计理念在集成开发环境(IDE)和游戏引擎中尤为重要,它能减少视觉疲劳,帮助开发者更快进入‘心流’状态,从而专注于核心创作。Godot Minimal Theme正是这一理念的杰出实践,它最初作为社区项目,通过极简的视觉设计、统一的配色方案和优化的字体排版,显著改善了Godot编辑器的使用体验。其成功不仅体现在社区的口碑传播上,更

weixin_30682415的博客 458

Godot教程仓库指南

Godot教程仓库指南 概览 本仓库由Mina Pêcheux维护,旨在提供一系列以视频和文字形式发布的Godot引擎结合C#语言的教程资源。这些教程覆盖了从基础到进阶的多个方面,适用于不同水平的Godot开发者,特别是那些希望在Godot 4中使用C#进行游戏开发的学习者。 1. 项目目录结构及介绍 仓库的组织结构清晰地反映了教程的序列,便于学习者跟随每个步骤进行实践。以下是主要的目录和它们...

gitblog_00023的博客 534

5步完成Godot逆向工程:用GDRE Tools从PCK包找回丢失的游戏源码

凌晨一点,你盯着屏幕上弹出的报错发呆。刚才还在正常运行的一个Godot小游戏,因为一次误操作,整个项目文件夹被清得干干净净。唯一庆幸的是,桌面上还躺着一份上周导出给朋友测试的安装包——一个不到20MB的PCK文件。 那一刻你多半会想:打包好的文件还能拆开吗?已经编译成字节码的GDScript脚本,还能还原成人能读懂的代码吗? 答案是肯定的。这正是本文的主角——**GDRE Tools**(也叫

gitblog_00181的博客 1008

为什么 Godot Minimal Theme 成为官方默认主题

Godot Minimal Theme 作为一款备受欢迎的编辑器主题,凭借其简洁现代的设计理念和出色的用户体验,从众多第三方主题中脱颖而出,自 Godot 4.6 版本起正式成为官方默认主题。这一转变不仅体现了社区对极简设计的推崇,更标志着 Godot 引擎在用户界面体验上的重大升级。 ## 极简设计带来的视觉革新 Godot Minimal Theme 以"少即是多"的设计哲学为核心,通过精

gitblog_00460的博客 486

从安装到精通:Godot Orchestrator完整配置指南(兼容Godot 4.4-4.7版本)

Godot Orchestrator是一款专为Godot Engine(4.x版本)打造的视觉脚本插件,它提供了直观的节点式编程界面,帮助开发者无需编写代码即可创建复杂的游戏逻辑。本指南将从安装到高级配置,全面介绍如何在Godot 4.4至4.7版本中使用Orchestrator提升开发效率。 ## 📋 准备工作:环境要求与前置条件 在开始配置前,请确保您的开发环境满足以下条件: - God

gitblog_01106的博客 892

打开就能跑的 Godot 2D/3D 完整示例:godot-demo-projects 演示项目合集手把手

godot-demo-projects 是一套 Godot 引擎的演示项目合集,收录的每个示例都是开箱即跑的完整项目。本指南演示如何在编辑器里找到、打开并修改这些示例游戏,并教你定位其中最影响运行效果的几处配置。 ## 🔍 第一次打开,你能跑起来什么 仓库里每个带 `project.godot` 文件的文件夹,都是一个独立的 Godot 项目:场景、脚本、贴图、音频齐全,加载进编辑器就能运行

gitblog_00461的博客 313

Godot逆向工程:从二进制游戏包恢复可编辑项目的完整指南

在游戏开发与软件工程领域,逆向工程是一项通过分析程序二进制文件来理解其内部结构、逻辑与资源组织的关键技术。其核心原理在于解析可执行文件与数据包的格式,提取并重组其中的代码与资产。这项技术的价值不仅在于技术学习与原理探究,更能应用于软件兼容性维护、安全审计以及合法的二次开发场景。对于使用Godot引擎开发的游戏,其发布的二进制包(如.exe+.pck或.apk)包含了编译后的脚本字节码与打包的资源文件。通过识别引擎版本、使用专用工具(如pckx)解包数据、重建项目框架并处理资源引用,开发者可以系统性地恢复出项

weixin_33713503的博客 1610

Godogen引擎指南:Godot 4 C项目快速构建与运行

Godogen是一款专为Godot、Bevy和Babylon.js打造的自主游戏开发工具,通过Claude Code和Codex技术简化游戏开发流程。本指南将带你快速掌握使用Godogen构建和运行Godot 4 C#项目的完整流程,从环境配置到项目部署,让你轻松开启游戏开发之旅。 ## 📋 准备工作:环境搭建 在开始使用Godogen构建Godot 4 C#项目前,需要确保你的开发环境已正

gitblog_00638的博客 1132
上一篇: 【极简】Godot4.4 简易仓库A(附完整代码/素材包)
下一篇: 【杂谈】Godot4.4对话插件使用教程(dialogue manager 3)
ForBigData
博客等级 码龄7年 221粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForBigData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值