【Godot4自学手册】第四十二节实现拖拽进行物品交换和数量叠加

这一节我们主要学习背包系统中的物品拖拽后,物品放到新的位置,或交换物品位置,如果两个物品属于同一物品则数量相加。具体效果如下:
请添加图片描述

一、修改item.tscn场景

给item.tscn场景的根节点Item添加Label子节点,命名为NumverCount,用于显示物品数量。然后修改根节点的代码如下:

extends Node2D
@export var number=1  #表示物品的数量
@export var icoUrl="" #表示物品图片
@export var itemname=""  #表示物品的名称@onready var texture_rect = $TextureRect
@onready var numver_count = $NumverCountfunc _ready(): #随机载入2张物品图片if randi()%2==0:#产生个随机数,用2除,余数为0itemname="宝剑"icoUrl = "res://Sprites/Inventory/Iron Sword.png"		else:#产生个随机数,用2除,余数不为0itemname="树枝"icoUrl = "res://Sprites/Inventory/Tree Branch.png"setIco(icoUrl)setNumber(number)
#设置显示数量
func setNumber(numvercount):number = numvercountnumver_count.text=str(numvercount)
#设置图片
func setIco(icoUrlstr):texture_rect.texture=load(icoUrlstr)

改代码主要增加了三个属性,一个是物品数量,一个是物品的图片地址,最后一个是物品的名称。增加了2个方法,一个是setNumber方法用于显示物品数量;另一个是setIco函数设置物品图片。

二、修改slot.gd代码。

slot.gd代码修改如下:

extends Panel#背包背景格子图片,default_text有物品的时候背景格子;empty_text无物品的时候背景格子
var default_text = preload("res://Sprites/Inventory/item_slot_default_background.png")
var empty_text = preload("res://Sprites/Inventory/item_slot_empty_background.png")var default_style:StyleBoxTexture =null #有物品的时候格子样式
var empty_style:StyleBoxTexture =null  #五物品的时候格子样式var itemClass = preload("res://Scenes/item.tscn")  #预加载物品
var item =null  #定义物品func _ready():default_style = StyleBoxTexture.new()  #初始化有物品时候的格子样式empty_style = StyleBoxTexture.new()  #初始化无物品时候的格子样式default_style.texture = default_text  #将有物品时的格子与样式联系起来empty_style.texture = empty_text  #将无物品时的格子与样式联系起来if randi()%2==0:  #产生一个随机数,用2求余  当余数为0时item = itemClass.instantiate()  #实例化物品add_child(item)  #在插槽内加载物品refresh_style()  #刷新样式函数func refresh_style():  #刷新样式函数if item==null: #物品为空时,对应设置样式set("theme_override_styles/panel",empty_style)else:#物品不为空时,对应设置样式set("theme_override_styles/panel",default_style)func getitem(): #返回节点return itemfunc removeNode(): #移出节点if item!=null:remove_child(item)item=nullset("theme_override_styles/panel",empty_style)	func PutIntoSlot(textureFrom):#物品拖放功能if item==null:#如果目标物品栏为空item = itemClass.instantiate()  #实例化物品	add_child(item)item.texture_rect.texture = textureFrom.item.texture_rect.textureitem.setNumber(textureFrom.item.number)textureFrom.removeNode()else:#如果目标物品栏不为空,则物品进行交换		if item.texture_rect.texture==textureFrom.item.texture_rect.texture:#如果目标物品跟拖放物品数同一商品,则数量相加item.setNumber(item.number+textureFrom.item.number)textureFrom.removeNode()passelse:#如果目标物品跟拖放物品不同,则交换var tempItem =  item.texture_rect.texturevar tempnumber =  item.numberitem.texture_rect.texture = textureFrom.item.texture_rect.textureitem.setNumber(textureFrom.item.number)textureFrom.item.texture_rect.texture = tempItemtextureFrom.item.setNumber(tempnumber)

三、修改一下Inventory场景

在根节点下添加一个Control控件,在该节点上单击右键选择设为场景根节点,这样该场景就变成了Control为根节点了,然后将原来根节点下的子节点拉入到Control节点下,最后删除原来的Node2d节点,并把Control节点命名为Inventory。
最后目录结构如下:
请添加图片描述

修改根节点代码如下:

extends Control
@onready var grid_container = $GridContainer#拖拽开始
func _get_drag_data(at_position):var dragSlotNode = get_slot_node_at_position(at_position)  #获取哪个节点被拖放if dragSlotNode.getitem()==null : return  #如果未有物品直接退出#复制物品节点下的图片作为拖动预览节点var dragPreviewNode = dragSlotNode.getitem().get_child(0).duplicate()dragPreviewNode.custom_minimum_size=Vector2(16,16)  #设置最小值为16像素set_drag_preview(dragPreviewNode)  # 函数用于设置当节点被拖动时显示的预览图像。return dragSlotNode#用于确定一个控件是否能够接受拖放操作中放置的数据。这个函数在控件接收到拖放数据时被调用,允许您根据数据的类型或来源决定是否接受数据。
func _can_drop_data(at_position, data):var targetSlotNode = get_slot_node_at_position(at_position)	return targetSlotNode !=null#用于处理拖放操作中数据被放置到控件上时的逻辑。当用户将数据拖放到控件上,并且 can_drop_data() 返回 true 时,_drop_data() 函数会被调用。
#at_position表示接收拖放的坐标数据,dragSloteNode表示从哪个节点拖放过来
func _drop_data(at_position, dragSloteNode):var targetSlotNode = get_slot_node_at_position(at_position) #获取接收拖放的节点targetSlotNode.PutIntoSlot(dragSloteNode)

这样我们就实现物品拖拽功能,下节见。

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

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

相关文章

vue3基于axios配置请求拦截器响应拦截器以及无感刷新token的实现

vue3基于axios配置请求拦截器响应拦截器以及无感刷新token的实现 一、下载并引入 axios二、引入 element-plus 消息提示三、配置基础地址四、创建 axios 实例五、配置请求拦截器六、定义是否刷新 token 的变量以及存储请求队列的数组七、配置响应拦截器以及实现无感刷新 token八…

Linux CentoS安装RabbitMQ:一键安装指南

有两种安装方法,官方推荐使用 docker安装RabbitMQ 一、Docker安装RabbitMQ 1、安装docker 参考我之前的文章:Centos7.5搭建docker并且部署Lnmp环境(小白入门docoker)_centos7.5安装docker和docker-compose-CSDN博客 2、安装Ra…

【实用软件】Paragon NTFS for Mac 15下载及安装教程

​习惯上来说所有操作只需轻轻一点:轻量级的快捷菜单栏,可访问所有NTFS驱动器并执行最常见的卷操作,如挂载,卸载和验证,从菜单栏中快速启动NTFS for Mac界面,一键点击,更加方便。11510182322410…

Scope XY Project的使用

1.Scope XY Project的功能介绍与使用方法 添加监控变量 绘制成一个三角形 XY进行对调操作 修改XY轴的比例修改显示输出 2.Cursor的使用方法 游标线的添加测量 3.Reporting功能的使用方法 到处对应的报表数据 添加对应的报告数据

一、Jquery入门(超详)

* [5.3 jQuery 对象和 DOM 对象之间的相互转换](about:blank#53_jQuery__DOM__271)* * [5.3.1 jQuery 对象转换为 DOM 对象](about:blank#531_jQuery__DOM__282)* [5.3.2 DOM 对象转换为 jQuery 对象](about:blank#532_DOM__jQuery__295)六、 解决 jQuery 和其他库的冲…

vue3 中v-model语法糖(2024-06-21)

一、 vue2 中 v-model 语法糖 实现父子组件双向数据绑定&#xff0c;一个输入框或者组件指定绑定一个 v-model 1. 父组件写法 <template><div><h1>App</h1><h2>{{ count }}</h2><input type"text" v-model"count&quo…

Apache Calcite - 使用框架Sql解析器解析Sql

前言 Calcite提供了org.apache.calcite.sql.parser.SqlParser来解析sql&#xff0c;通过访问者模式&#xff0c;在解析过程中访问Sql中的不同元素&#xff0c;最终完成特定的功能。 使用举例 使用Calcite解析SQL主要涉及以下几个步骤&#xff1a; 创建SqlParser对象&#xf…

Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载)

上次介绍了基础IO&#xff08;二&#xff09;&#xff1a;Linux&#xff1a;基础IO&#xff08;二.缓冲区、模拟一下缓冲区、详细讲解文件系统&#xff09; 文章目录 1.软硬链接1.1硬链接1.2软链接使用场景 2.动态库和静态库1.1回顾1.2静态库的制作和使用为什么要有库制作者角度…

重学java 85.Java反射、注解、枚举总结

凡事往好处想&#xff0c;人生便会豁达 —— 24.6.24 一、Junit单元测试 1.概述: Junit是一个单元测试框架,可以代替main方法去执行其他的方法 2.使用 a.导入jar包 b.注解 Test —— 单独执行一个方法 Before —— 在Test之前执行.有多少个Test执行.Before对应的方法就执行多少…

常见排序算法及其C语言实现

排序算法在计算机科学中是一个非常重要的主题。本文将详细介绍几种常见的排序算法&#xff0c;包括快速排序、归并排序、堆排序、冒泡排序、选择排序、插入排序、桶排序和二分查找插入排序&#xff0c;并提供每种算法的C语言实现代码。 1. 快速排序&#xff08;Quick Sort&…

毫米波移动通信系统中的波束赋形—模数混合的波束赋形架构

模数混合的波束赋形将波束赋形分为了模拟波束赋形与数字波束赋形两部分&#xff0c;其模拟部分通过移相器实现&#xff0c;数字部分通过基带预编码实现&#xff0c;&#xff0c;其结构如图2所示。当射频链路数目NRF为1时&#xff0c;认为其是一种特殊的模数混合的波束赋形。 此…

【计算机视觉】人脸算法之图像处理基础知识【七】

直方图均衡化 直方图均衡化是一种常用的图像处理技术&#xff0c;用于改善图像的对比度&#xff0c;特别是在图像的细节被埋没在暗部或亮部区域时。通过重新分配图像的像素强度值&#xff0c;使得图像的整体对比度增强&#xff0c;从而让更多的细节变得可见。 import cv2 imp…

最小生成树模板(prim,heap-prim,kruskal)

prim 出圈法&#xff0c;时间复杂度 O ( n 2 ) O(n^2) O(n2) #include<iostream> #include<vector> using namespace std; #define MAX_N 5000 #define inf 100000000 struct edge{int v,w; }; vector<edge>e[MAX_N5]; int d[MAX_N5],vis[MAX_N5]; int n,m…

IO-Iink事件

IO-LINK事件功能 IO-Link的事件功能是其通信协议中的一项重要特性&#xff0c;主要用于传输设备的故障信息和维护信息。IO-Link支持三种数据类型&#xff1a;过程数据、参数数据和事件数据。其中&#xff0c;事件数据就是用于此目的。 当IO-Link设备&#xff08;如传感器或执…

NepnepxCATCTF Pwn-Chao

文章目录 参考类型混淆异常处理的栈回退机制虚表和类的恢复假想的程序结构逆向工程场景步骤解析 idabug检查找虚表strupsc_str()alloca异常逆向maindisplayupdatecreate 新东西exp和思路 参考 https://www.cnblogs.com/winmt/articles/17018284.html 类型混淆 关于C中由虚函…

Java中如何解决BadPaddingException异常?

Java中如何解决BadPaddingException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;BadPaddingException异常是一个…

HarmonyOS Next开发学习手册——应用启动框架AppStartup

概述 AppStartup提供了一种简单高效的初始化组件的方式&#xff0c;开发者可以使用AppStartup来显示的设置组件的初始化顺序以及之间的依赖关系&#xff0c;支持异步初始化组件加速应用的启动时间。开发者需要分别为待初始化的组件实现AppStartup提供的 StartupTask 接口&…

DoubleSummaryStatistics 及其相关类之-简介

1. DoubleSummaryStatistics 使用简介 在Java 8中&#xff0c;DoubleSummaryStatistics 类被引入作为 java.util 包的一部分。它是一个用于收集统计数据&#xff08;如计数、最小值、最大值、和、平均值等&#xff09;的类&#xff0c;特别适用于处理 double 类型的数据。 Do…

【OpenGauss源码学习 —— (ALTER TABLE(修改表空间))】

ALTER TABLE&#xff08;列存删除列&#xff09; ALTER TABLE ... SET TABLESPACEExecChangeTableSpaceForRowTable 函数ATExecSetTableSpace 函数 ExecChangeTableSpaceForRowPartition 函数ATExecSetTableSpaceForPartitionP3 函数 ExecChangeTableSpaceForCStoreTable 函数C…

DeepSeek-Coder-v2击败GPT-4 Turbo,成为竞技场最强开源编码模型!

目录 01 编码与数学击败GPT-4 Turbo 02 深度求索&#xff1a;价格战的导火索 就在刚刚&#xff0c;竞技场排名再次刷新&#xff1a;深度求索的DeepSeek-Coder-v2成为竞技场最强开源编码模型&#xff01; 它在Coding Arena中已攀升至第4名&#xff0c;水平接近GPT-4 Turbo。 没…