【UGUI】Unity 背包系统实现02:道具信息提示与显示
在游戏开发中,背包系统是一个常见的功能模块,用于管理玩家拾取的物品。本文将详细介绍如何在 Unity 中实现一个简单的背包系统,包括道具信息的提示和显示功能。我们将通过代码和场景搭建来逐步实现这一功能。
1. 功能需求清单
在实现背包系统时,我们需要满足以下功能需求:
-
初始化物品栏:在游戏启动时,初始化背包界面,并添加一些启动物资。
-
拾取物体到背包:玩家可以拾取场景中的物体,并将其添加到背包中。
-
鼠标滑入显示道具信息:当鼠标滑入背包中的道具时,显示该道具的名称和图标。
-
鼠标点击显示道具信息:当鼠标点击背包中的道具时,显示该道具的详细信息。
2. 程序逻辑过程
2.1 初始化物品栏
在游戏启动时,我们需要动态生成背包格子,并为每个格子设置图标和名称。这些格子将作为道具的容器。
2.2 拾取物体到背包
玩家可以通过某种方式(如点击、碰撞等)拾取场景中的物体,并将其添加到背包中。这个功能可以通过扩展代码来实现,本文暂不详细讨论。
2.3 鼠标滑入显示道具信息
当鼠标滑入某个道具格子时,我们需要显示一个提示框,提示框中包含该道具的名称和图标。提示框的位置需要跟随鼠标移动。
2.4 鼠标点击显示道具信息
当鼠标点击某个道具格子时,我们需要显示一个详细信息面板,面板中包含该道具的名称和图标。
3. 必要的场景搭建
在 Unity 中,我们需要搭建一个简单的场景来测试背包系统。场景中需要包含以下元素:
-
Canvas:用于显示 UI 元素。
-
Grid Layout Group:用于排列背包格子。
-
提示框和信息面板:用于显示道具信息。
-
道具格子模板:用于动态生成背包格子。
4.代码步骤解释
## 1. 初始化物品栏
### 代码片段
```csharp
private void Awake()
{
// 通过标签找到提示框和信息面板
OneTip = GameObject.FindGameObjectWithTag("OneTip");
InfoRect = GameObject.FindGameObjectWithTag("InfoRect");
// 初始化系统数据
for (int i = 0; i < 10; i++)
{
GameObject TempCloneGrid = GameObject.Instantiate(GridMuban, GridParentTrans);
// 修改道具的图标
TempCloneGrid.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite = oneIamge[i];
// 修改道具的名字
TempCloneGrid.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text = Name[i];
// 为每个道具添加侦听功能
TempCloneGrid.AddComponent<UInterMaager232>();
}
}
```
### 解释
1. **查找提示框和信息面板**:
```csharp
OneTip = GameObject.FindGameObjectWithTag("OneTip");
InfoRect = GameObject.FindGameObjectWithTag("InfoRect");
```
通过 `GameObject.FindGameObjectWithTag` 方法查找场景中带有特定标签的对象,分别赋值给 `OneTip` 和 `InfoRect`。
2. **动态生成背包格子**:
```csharp
for (int i = 0; i < 10; i++)
{
GameObject TempCloneGrid = GameObject.Instantiate(GridMuban, GridParentTrans);
```
循环生成 10 个背包格子,使用 `GameObject.Instantiate` 方法克隆 `GridMuban` 模板,并将其父物体设置为 `GridParentTrans`。
3. **修改道具的图标**:
```csharp
TempCloneGrid.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite = oneIamge[i];
```
获取克隆的格子的子物体的子物体的 `Image` 组件,并设置其 `sprite` 属性为 `oneIamge` 数组中的对应图标。
4. **修改道具的名字**:
```csharp
TempCloneGrid.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text = Name[i];
```
获取克隆的格子的子物体的子物体的 `TextMeshProUGUI` 组件,并设置其 `text` 属性为 `Name` 数组中的对应名称。
5. 添加交互管理脚本**:
TempCloneGrid.AddComponent<UInterMaager232>();
为每个克隆的格子添加 `UInterMaager232` 脚本,以便处理交互事件。
2. 鼠标滑入显示道具信息
代码片段
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("鼠标滑入了");
MoveTip();
// 显示提示框并设置内容
if (!InventoryManager.OneTip.activeSelf)
{
InventoryManager.OneTip.SetActive(true);
InventoryManager.OneTip.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = this.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text;
InventoryManager.OneTip.transform.GetChild(1).GetComponent<Image>().sprite = this.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite;
}
}
```
解释
1. **显示提示框**:
if (!InventoryManager.OneTip.activeSelf)
{
InventoryManager.OneTip.SetActive(true);
```
检查提示框是否处于激活状态,如果未激活则激活提示框。
2. **设置提示框内容**:
```csharp
InventoryManager.OneTip.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = this.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text;
InventoryManager.OneTip.transform.GetChild(1).GetComponent<Image>().sprite = this.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite;
```
设置提示框中的文本和图标,使其与鼠标滑入的道具格子内容一致。
3. **跟随鼠标移动**:
```csharp
MoveTip();
```
调用 `MoveTip` 方法,使提示框跟随鼠标移动。
## 3. 鼠标点击显示道具信息
### 代码片段
```csharp
public void OnPointerClick(PointerEventData eventData)
{
// 关闭提示框
InventoryManager.OneTip.SetActive(false);
Debug.Log("鼠标点击了");
// 切换信息面板的显示状态
if (InventoryManager.InfoRect.activeSelf)
{
InventoryManager.InfoRect.SetActive(false);
}
else
{
InventoryManager.InfoRect.SetActive(true);
// 设置信息面板的内容
InventoryManager.InfoRect.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = this.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text;
InventoryManager.InfoRect.transform.GetChild(1).GetComponent<Image>().sprite = this.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite;
}
}
解释
1. **关闭提示框**:
```csharp
InventoryManager.OneTip.SetActive(false);
```
关闭提示框,避免与信息面板重叠。
2. **切换信息面板的显示状态**:
```csharp
if (InventoryManager.InfoRect.activeSelf)
{
InventoryManager.InfoRect.SetActive(false);
}
else
{
InventoryManager.InfoRect.SetActive(true);
```
检查信息面板是否处于激活状态,如果已激活则隐藏,否则显示信息面板。
3. **设置信息面板内容**:
```csharp
InventoryManager.InfoRect.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = this.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text;
InventoryManager.InfoRect.transform.GetChild(1).GetComponent<Image>().sprite = this.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite;
```
设置信息面板中的文本和图标,使其与鼠标点击的道具格子内容一致。
## 4. 提示框跟随鼠标移动
### 代码片段
```csharp
void MoveTip()
{
RectTransform TipObject = InventoryManager.OneTip.GetComponent<RectTransform>();
// 获取鼠标在屏幕上的位置
Vector3 mousePosition = Input.mousePosition;
// 将屏幕坐标转换为画布坐标
Vector2 canvasPosition;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
TipObject.parent as RectTransform, // 使用父对象的RectTransform
mousePosition,
null, // 如果Canvas是Overlay模式,可以传null
out canvasPosition);
// 计算对象在鼠标右下角的位置
Vector2 offset = new Vector2(TipObject.rect.width / 2, -TipObject.rect.height / 2f); // 右下角偏移
// 设置对象的位置
TipObject.localPosition = canvasPosition + offset;
}
```
### 解释
1. **获取鼠标位置**:
```csharp
Vector3 mousePosition = Input.mousePosition;
```
获取鼠标在屏幕上的位置。
2. **转换坐标**:
```csharp
RectTransformUtility.ScreenPointToLocalPointInRectangle(
TipObject.parent as RectTransform, // 使用父对象的RectTransform
mousePosition,
null, // 如果Canvas是Overlay模式,可以传null
out canvasPosition);
```
将屏幕坐标转换为画布坐标。
3. **计算偏移**:
```csharp
Vector2 offset = new Vector2(TipObject.rect.width / 2, -TipObject.rect.height / 2f); // 右下角偏移
```
计算提示框在鼠标右下角的位置偏移。
4. **设置位置**:
```csharp
TipObject.localPosition = canvasPosition + offset;
```
设置提示框的位置,使其跟随鼠标移动。
## 总结
通过以上步骤和代码解释,我们实现了一个简单的背包系统,包括道具信息的提示和显示功能。通过动态生成背包格子、处理鼠标事件,我们可以在 Unity 中轻松实现这一功能。希望本文对你在 Unity 中开发背包系统有所帮助。
5. 完整代码 + 注释
5.1 InventoryManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;public class InventoryManager : MonoBehaviour
{public GameObject GridMuban; // 背包格子模板public Transform GridParentTrans; // 背包格子的父物体public Sprite[] oneIamge = new Sprite[10]; // 道具图标数组public string[] Name = new string[10]; // 道具名称数组public static GameObject OneTip; // 提示框public static GameObject InfoRect; // 信息面板private void Awake(){// 通过标签找到提示框和信息面板OneTip = GameObject.FindGameObjectWithTag("OneTip");InfoRect = GameObject.FindGameObjectWithTag("InfoRect");// 初始化系统数据for (int i = 0; i < 10; i++){GameObject TempCloneGrid = GameObject.Instantiate(GridMuban, GridParentTrans);// 修改道具的图标TempCloneGrid.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite = oneIamge[i];// 修改道具的名字TempCloneGrid.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text = Name[i];// 为每个道具添加侦听功能TempCloneGrid.AddComponent<UInterMaager232>();}}private void Start(){// 初始状态下隐藏提示框和信息面板if (OneTip.activeSelf){OneTip.SetActive(false);}if (InfoRect.activeSelf){InfoRect.SetActive(false);}}
}
5.2 UInterMaager232.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using TMPro;
using UnityEngine.UI;public class UInterMaager232 : MonoBehaviour, IPointerEnterHandler, IPointerClickHandler, IPointerExitHandler
{public void OnPointerClick(PointerEventData eventData){// 关闭提示框InventoryManager.OneTip.SetActive(false);Debug.Log("鼠标点击了");// 切换信息面板的显示状态if (InventoryManager.InfoRect.activeSelf){InventoryManager.InfoRect.SetActive(false);}else{InventoryManager.InfoRect.SetActive(true);// 设置信息面板的内容InventoryManager.InfoRect.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = this.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text;InventoryManager.InfoRect.transform.GetChild(1).GetComponent<Image>().sprite = this.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite;}}public void OnPointerEnter(PointerEventData eventData){Debug.Log("鼠标滑入了");MoveTip();// 显示提示框并设置内容if (!InventoryManager.OneTip.activeSelf){InventoryManager.OneTip.SetActive(true);InventoryManager.OneTip.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = this.transform.GetChild(1).GetChild(0).GetComponent<TextMeshProUGUI>().text;InventoryManager.OneTip.transform.GetChild(1).GetComponent<Image>().sprite = this.transform.GetChild(0).GetChild(0).GetComponent<Image>().sprite;}}public void OnPointerExit(PointerEventData eventData){// 关闭提示框if (InventoryManager.OneTip.activeSelf){InventoryManager.OneTip.SetActive(false);}}void MoveTip(){RectTransform TipObject = InventoryManager.OneTip.GetComponent<RectTransform>();// 获取鼠标在屏幕上的位置Vector3 mousePosition = Input.mousePosition;// 将屏幕坐标转换为画布坐标Vector2 canvasPosition;RectTransformUtility.ScreenPointToLocalPointInRectangle(TipObject.parent as RectTransform, // 使用父对象的RectTransformmousePosition,null, // 如果Canvas是Overlay模式,可以传nullout canvasPosition);// 计算对象在鼠标右下角的位置Vector2 offset = new Vector2(TipObject.rect.width / 2, -TipObject.rect.height / 2f); // 右下角偏移// 设置对象的位置TipObject.localPosition = canvasPosition + offset;}
}
6. 脚本挂载和赋值
6.1 场景搭建
-
Canvas:在场景中创建一个
Canvas
,用于显示 UI 元素。 -
Grid Layout Group:在
Canvas
下创建一个Panel
,并添加Grid Layout Group
组件,用于排列背包格子。 -
提示框和信息面板:在
Canvas
下创建两个Panel
,分别命名为OneTip
和InfoRect
,并分别添加TextMeshPro
和Image
组件。 -
道具格子模板:在
Canvas
下创建一个Panel
,命名为GridMuban
,并添加Image
和TextMeshPro
组件,用于显示道具的图标和名称。
6.2 脚本挂载
-
InventoryManager:将
InventoryManager
脚本挂载到Canvas
上,并将GridMuban
、GridParentTrans
、oneIamge
和Name
字段赋值。 -
UInterMaager232:该脚本会自动挂载到每个生成的背包格子上,无需手动挂载。
6.3 赋值
-
GridMuban:将
GridMuban
对象拖拽到InventoryManager
脚本的GridMuban
字段。 -
GridParentTrans:将
GridParentTrans
对象拖拽到InventoryManager
脚本的GridParentTrans
字段。 -
oneIamge:将道具图标拖拽到
InventoryManager
脚本的oneIamge
数组中。 -
Name:将道具名称填入
InventoryManager
脚本的Name
数组中。
总结
通过以上步骤,我们实现了一个简单的背包系统,包括道具信息的提示和显示功能。通过动态生成背包格子、处理鼠标事件,我们可以在 Unity 中轻松实现这一功能。希望本文对你在 Unity 中开发背包系统有所帮助。
相关文章:
【UGUI】Unity 背包系统实现02:道具信息提示与显示
在游戏开发中,背包系统是一个常见的功能模块,用于管理玩家拾取的物品。本文将详细介绍如何在 Unity 中实现一个简单的背包系统,包括道具信息的提示和显示功能。我们将通过代码和场景搭建来逐步实现这一功能。 1. 功能需求清单 在实现背包系…...
掌握移动端性能测试利器:深入JMeter手机录制功能
引言 在当今移动互联网时代,应用程序的性能和用户体验至关重要。为了确保应用程序在不同设备和网络环境下都能稳定运行,性能测试成为了不可或缺的一环。Apache JMeter作为一款强大的开源性能测试工具,不仅支持传统的PC端性能测试,…...
springboot010大学生入学审核系统的设计与实现(源码+包运行+LW+技术指导)
项目描述 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本站是一个B/S模式系统,采用Spring Boot框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,…...
Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
一、前言说明 在地图应用中,有很多时候是需要断网环境中离线使用的,一般会采用两种做法,一种是只下载好离线瓦片地图,然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持,只需要拿到瓦片即可&…...
从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发
从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发 在深度学习开发中,尤其是使用 PyTorch 时,我们常常需要编写大量样板代码来管理训练循环、验证流程和模型保存等任务。PyTorch Lightning 作为 PyTorch 的高级封装库,帮助…...
UE5 第一人称射击项目学习(完结)
这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图,这里要引入C的面向对象思想,建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个print your name 在这里生成成员函数后&am…...
Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计
概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术,选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发,搭载了先进的勘智 K230D 芯片。 K230…...
【vim】使用 gn 组合命令实现搜索选中功能
gn是Vim 7.4新增的一个操作(motion),作用是跳到并选中下一个搜索匹配项。 具体说,Vim里执行搜索后,执行n操作只会跳转到下一个匹配项,而不选中它。但是我们往往需要对匹配项执行一些修改操作,例…...
【Python刷题】广度优先搜索相关问题
题目描述 小A与小B 算法思路 小A一次移动一步,但有八个方向,小B一次移动两步,只有四个方向,要求小A和小B最早的相遇时间。用两个队列分别记录下小A和小B每一步可以走到的位置,通过一个简单的bfs就能找到这些位置并…...
竞赛思享会 | 2024年第十届数维杯国际数学建模挑战赛D题【代码+演示】
Hello,这里是Easy数模!以下idea仅供参考,无偿分享! 题目背景 本题旨在通过对中国特定城市的房产、人口、经济、服务设施等数据进行分析,评估其在应对人口老龄化、负增长趋势和极端气候事件中的韧性与可持续发展能力。…...
早期超大规模语言模型的尝试——BLOOM模型论文解读,附使用MindSpore和MindNLP的模型和实验复现
背景 预训练语言模型已经成为了现代自然语言处理pipeline中的基石,因为其在少量的标注数据上产生更好的结果。随着ELMo、ULMFiT、GPT和BERT的开发,使用预训练模型在下游任务上微调的范式被广泛使用。随后发现预训练语言模型在没有任何额外训练的情况下任…...
二分查找题目:有序数组中的单一元素
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:有序数组中的单一元素 出处:540. 有序数组中的单一元素 难度 4 级 题目描述 要求 给定一个仅由整数…...
springboot基于Android的华蓥山旅游导航系统
摘 要 华蓥山旅游导航系统是一款专为华蓥山景区设计的智能导览应用,旨在为用户提供便捷的旅游信息服务。该系统通过整合华蓥山的地理信息、景点介绍、交通状况等数据,实现了对景区的全面覆盖。用户可以通过该系统获取实时的旅游资讯、交流论坛、地图等。…...
面向对象编程(OOP)深度解析:思想、原则与应用
🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 面向对象编程(OOP)深度解析:思想、原则与应用 一、面向对象编程的基本…...
iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录
我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”,Jeff Pu在报告中提到,我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的,那么将有几个值得注意的方面。 首先,iPhone…...
「OpenCV交叉编译」ubuntu to arm64
Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本,本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…...
Stable Diffusion的解读(二)
Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...
amd显卡和nVidia显卡哪个好 amd和英伟达的区别介绍
AMD和英伟达是目前市场上最主要的两大显卡品牌,它们各有自己的特点和优势,也有不同的适用场景和用户群体。那么,AMD显卡和英伟达显卡到底哪个好?它们之间有什么区别?我们又该如何选择呢?本文将从以下几个方…...
软件测试—— Selenium 常用函数(一)
前一篇文章:软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中,我们介绍了自动化的一些基础知识&a…...
为什么verilog中递归函数需要定义为automatic?
直接上代码 module automatic_tb;reg [7:0] value;initial begin #0 value < 8d5;#10 $display("result of automatic: %0d", factor_automatic(value));$display("result of static: %0d", factor_static(value));#50 $stop; endfunction reg[7:0] fa…...
23种设计模式-状态(State)设计模式
文章目录 一.什么是状态模式?二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图: 状态设计模式类图 一.什么是状态模式? 状态模式(State Pattern&…...
EventListener与EventBus
EventListener JDK JDK1.1开始就提供EventListener,一个标记接口,源码如下: /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject࿱…...
Facebook为什么注册失败了?该怎么解决?
有时候用户在尝试注册Facebook账号时可能会遇到各种问题,导致注册失败或遇到困难。小编会为大家分析Facebook注册失败的可能原因,并提供解决方法,帮助大家顺利完成注册流程。 一、Facebook注册失败的可能原因 1. 账号信息问题: …...
前端数据可视化思路及实现案例
目录 一、前端数据可视化思路 (一)明确数据与目标 (二)选择合适的可视化图表类型 (三)数据与图表的绑定及交互设计 (四)页面布局与样式设计 二、具体案例:使用 Ech…...
【DVWA】Brute Force暴力破解实战
问尔辈 何等样人 自摸心头 再来求我;若汝能 克存忠孝 持身正直 不拜何妨 1.Brute Force(Low) 相关的代码分析 if( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Check the database$query "SELECT * FROM users WHERE user $…...
23种设计模式速记法
前言 在软件开发的过程中,设计模式作为解决常见问题的通用模板,一直是开发者的重要工具。尤其是在面临复杂系统架构和需求变化时,设计模式不仅能够提升代码的可复用性和扩展性,还能大大提高团队之间的协作效率。然而,…...
第7章硬件测试-7.3 功能测试
7.3 功能测试 7.3.1 整机规格测试7.3.2 整机试装测试7.3.3 DFX测试 功能测试包括整机规格、整机试装和整机功能测试,是整机结构和业务相关的测试。 7.3.1 整机规格测试 整机规格测试包括尺寸、重量、温度、功耗等数据。这些测试数据与设计规格进行比对和校验&…...
动态规划子数组系列一>等差数列划分
题目: 解析: 代码: public int numberOfArithmeticSlices(int[] nums) {int n nums.length;int[] dp new int[n];int ret 0;for(int i 2; i < n; i){dp[i] nums[i] - nums[i-1] nums[i-1] - nums[i-2] ? dp[i-1]1 : 0;ret dp[i…...
《Python浪漫的烟花表白特效》
一、背景介绍 烟花象征着浪漫与激情,将它与表白结合在一起,会创造出别具一格的惊喜效果。使用Python的turtle模块,我们可以轻松绘制出动态的烟花特效,再配合文字表白,打造一段专属的浪漫体验。 接下来,让…...
什么是RESTful API,有什么特点
RESTful API 概述 什么是 RESTful API? RESTful API 是基于 Representational State Transfer(表现层状态转移)架构风格的 Web 服务接口。REST 是一种设计风格,而不是具体的协议或标准。它定义了一组约束和最佳实践,…...
门户网站模板源码/如何做品牌推广方案
对于list里面的数据,假定是int,然后量比较大,如果使用双层的循环来去除重复项,性能不佳。 一个比较好的方法,就是将list的数据添加到set里,set会自动除去重复的数据项,也就是重复的数据只能添加…...
手机网站 普通网站/seopeixun com cn
比特币区块结构解析20前言 本文主要具体分析一个区块的值,通过逐字节分析,找出与比特币区块字段对应的部分,我们就可以加深对比特币区块的了解。 准备工作 我们在https://webbtc.com网站上查询区块哈希值为00000000d1145790a8694403d4063f323…...
高端办公室装修公司/seo网站营销公司哪家好
专题5:Java序列化 1、什么是java序列化,如何实现java序列化? 2、保存(持久化)对象及其状态到内存或者磁盘 3、序列化对象以字节数组保持-静态成员不保存 4、序列化用户远程对象传输 5、Serializable 实现序列化 6、writeObject 和 readO…...
网件路由器设置网址/上海搜索引擎优化公司排名
上周末,发现多个shp文件操作后,竟然崩溃, 今天查了一天,原以为是std::vector没有释放掉,最后发现原来是 OGRFeature * pFeature poLayer->GetFeature(featureID);后,会载入内存,但是不销毁…...
怎么快速做网站/武汉网站设计十年乐云seo
TCP VS UDP tcp基于链接通信 基于链接,则需要listen(backlog),指定连接池的大小基于链接,必须先运行的服务端,然后客户端发起链接请求对于mac系统:如果一端断开了链接,那另外一端的链…...
wordpress安卓源码/百度知道合伙人答题兼职入口
文章目录前言一、Kafka的使用1.安装包2.注入3.封装3.1 IKafkaConsumer和IKafkaProducer3.2 KafkaConsumer和KafkaProducer3.3 KafkaConfig配置类3.4 KafkaHelper帮助类4.使用前言 Kafka是一个分布式流处理平台,主要用于处理实时数据流。它可以用于日志收集、数据流…...