当前位置: 首页 > news >正文

【用unity实现100个游戏之6】制作一个战旗自走棋类游戏(附源码)

文章目录

  • 前言
  • 导入素材
  • 开始
      • 1. 设置瓦片间隙
      • 2. 放置全图瓦片
      • 3. 美化瓦片地图
      • 4. 添加树木障碍物
      • 5. 设定不同的排序图层
      • 6. 瓦片交互
      • 6. 瓦片交互优化
      • 6. 瓦片是否允许角色
      • 7. 添加角色
      • 8. 新增游戏管理脚本
      • 9. 角色移动范围逻辑
      • 10. 角色移动范围可视化
      • 11. 角色移动
      • 12. 重置瓦片颜色
      • 12. 限制移动次数
      • 13. 最终效果
  • 其他
  • 源码下载
  • 参考
  • 完结

前言

探索战争与策略的无穷魅力,让我们一同踏入一个充满战旗的世界!战旗游戏作为战棋类游戏的翘楚,引领了一股独特的战斗风潮。你是否曾经想过,如果能够自己设计并实现一个属于自己的战旗游戏,该是何等的创造与乐趣?

在本文中,我们将使用Unity引擎,探索如何快速构建一个简单而富有策略的战旗游戏Demo。通过本教程的指引,你将学习如何使用Unity的强大功能和库,创造出一个令人着迷的战旗世界。

在这个Demo中,我们将以一个虚拟的大陆为背景,玩家将担任敌对阵营的指挥官,通过战略布局和英勇的决策,争夺控制权。你可以选择完善这个demo,如每个棋子具有独特的能力和特点,如守护剑士的高生命值、魔法师的强大攻击力等,通过购买、升级和精心安排棋子的位置,引领你的队伍战胜对手,达到最终的胜利目标!

另外,最近很火的自走棋也属于战旗游戏的一种。自走棋是战棋类游戏的变种,它保留了战旗游戏的核心元素,如策略布局和战斗对抗,同时加入了自动化的棋子行动机制。

为了帮助你更好地理解,我们特别准备了一些战旗游戏的精彩截图和GIF动画,展示了战旗游戏的精彩瞬间。这些截图将带你亲身体验游戏的视觉效果和紧张的战斗氛围。

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

无论是战旗游戏爱好者还是对Unity开发感兴趣的朋友,本教程都将为你揭开战旗游戏的奥秘,帮助你构建一个引人入胜的战旗游戏Demo。

照例先来看看本文实现的最终效果,以觉得你是否还要看下去
在这里插入图片描述

好了,让我们开始我们的战旗之旅吧!
源码放在文章底部了

导入素材

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

开始

1. 设置瓦片间隙

新建一个2d项目,打开以后,将所需要的【图片】拖入到项目中
我们首先将这张【Tile瓦片】拖入场景窗口中
由于这张图片的原始大小过大,我们可以手动的去调整图片的大小
至于这个瓦片大小,究竟要调整到什么样的程度,我建议确保四周的相邻瓦片他们之间的
相对距离为【一个单位】就可以了,并留一点点的间隙就好了
具体的原因会和之后的角色【移动范围】有关
在这里插入图片描述
为了达到这个效果,我们要先去设置Snap Setting,我们希望当我们按住【cmd/Ctrl】后,拖拽物体能够移动【一个单位】长度
2021之前Snap Setting是在Edit栏最下面,我在Unity2021菜单栏里找了半天没找到,最后发现在Scene窗口里
在这里插入图片描述
按下【Cmd/Ctrl+D克隆】当前瓦片游戏对象
然后,当我们要移动该对象时,(首先)按住【cmd/ctrl】按钮
然后拖拽,实现"Snap Moving”,即【一个单位】距离长度的移动
在这里插入图片描述
如果你觉得,相邻的两个瓦片之间的间隙,还是稍微有一点大的
我们还可以稍微放大一点,这张图片的大小

2. 放置全图瓦片

设置瓦片为预制体,如下图,配置好全图的瓦片地图
在这里插入图片描述

3. 美化瓦片地图

现在我们的(地图)图片,看上去还是有一点【枯燥】的,我们希望每次运行游戏后,地图上的【每一张瓦片】,他都能够随机生成不一样的瓦片图片,供我们欣赏

在Sprites文件夹中,将Tilesi这张图片设置为多图模式以后
在精灵编辑器中进行【自动的裁切】
在这里插入图片描述
在Scripts文件夹中,新建一个C#脚本:Tile

public class Tile : MonoBehaviour
{private SpriteRenderer spriteRenderer;//瓦片[SerializeField] private Sprite[] sprites;//瓦片集private void Start(){spriteRenderer = GetComponent<SpriteRenderer>();int randomNum = Random.Range(0, sprites.Length);//随机获取0-9下标spriteRenderer.sprite = sprites[randomNum];//赋值给瓦片}
}

挂载脚本和对象,运行游戏,现在每次开始游戏我们都会(随机)生成不一样的地图了
在这里插入图片描述

4. 添加树木障碍物

我们现在希望在图片上添加更多的树木,而有的树木他会作为实体,有的会作为【障碍物】的形式
障碍物在之后的角色移动当中起到【阻止角色移动】到这个瓦片上的功能

我们新建三个空物体树木,背景,障碍物,负责管理所有树木以及障碍物
将树木游戏对象作为它们的【父物体】来使用

我们先建立一些美观的树木
选择【多图模式】后进行裁剪
在这里插入图片描述

5. 设定不同的排序图层

由于之后还会创建人物,我们希望所有【有关背景的图片】,都会渲染在人物的后方
在这里插入图片描述
配置不同的排序层级
在这里插入图片描述
瓦片和树木排序图层我们都设置为background,因为树木肯定显示在瓦片前面,我们可以把图层排序设置为50,放置不同的树木,丰富一下场景,如下
在这里插入图片描述

6. 瓦片交互

为了能够更好的交互,我们希望当我们的鼠标【选择到】每一个瓦片时,瓦片能给我们一定的反馈,我们希望鼠标【进入瓦片】时,瓦片能放大,当我们【离开瓦片】时,瓦片能回到原来的大小

我们可以使用Unity内置的【OnMouseEnter】和【OnMouseExit】方法来实现
大家只要记住一点,实现这两个方法呢,是有一个前提的,那就是我们鼠标要检测的对象,也就是这里的瓦片,他必须添加【Collider2D】碰撞器组件

我们先给瓦片添加碰撞器,记得应用全部预制体
在这里插入图片描述
完善Tile脚本代码

private void OnMouseEnter()
{transform.localScale += Vector3.one * 0.05f;}private void OnMouseExit(){transform.localScale -= Vector3.one * 0.05f;}

效果
在这里插入图片描述

6. 瓦片交互优化

我们还可以去观察一个细节,现在部分放大的瓦片时,还是会被相邻的瓦片渲染在下方
为了能够保证当我们放大每一个瓦片时,这个瓦片都可以渲染在【最上方】,我们还可以调整它的渲染层顺序

瓦片位于Background层的0号位置(顺序)
而实体的树木呢,顺序是50号
我们只需要去保证放大的瓦片顺序
在其他瓦片之上,实体树木之下就可以了(即在0到50之间),我们这里设置为【25】

完善Tile脚本代码

private void OnMouseEnter()
{transform.localScale += Vector3.one * 0.05f;spriteRenderer.sortingOrder = 25;}private void OnMouseExit(){transform.localScale -= Vector3.one * 0.05f;spriteRenderer.sortingOrder = 0;}

最终效果
在这里插入图片描述

6. 瓦片是否允许角色

我们就要开始最重要的第一步判断了,这个瓦片是否允许角色去行走
如果这个瓦片上有【树木】,那我们的角色是不能够行走到这个瓦片上的
我们判断的依据是,如果瓦片上存在【树木】或者【人】,那么这个瓦片【不允许】再站人,玩家是不能够移动到这个瓦片上的

完善Tile脚本代码

public bool canWalk;//是否能走
public LayerMask obLayerMask;//检测层private void Start()
{CheckObstacle();
}private void CheckObstacle()
{//参数1:圆形检测的中心点位置,那也就是我们瓦片的中心点位置//参数2:范围,spriteRenderer.bounds.extents.x获取图片一半的长度//参数3:检测层Collider2D collider = Physics2D.OverlapCircle(transform.position, spriteRenderer.bounds.extents.x, obLayerMask);if (collider != null)//检测不为空,说明有障碍物在这个瓦片上呀canWalk = false;elsecanWalk = true;//这个瓦片,我们的角色是可以行走的
}

回到Unity当中,新建一个Layer层,命名为Obstacle,全选中所有【实体树木】游戏对象,设置为Obstacle层
在这里插入图片描述
回忆一下有关【Physics:2D.Raycast】或者【Physics:2D.OverlapCircle】的定义
他们的方法检测的都是添加了【Collider组件】的游戏对象

还有别忘记了,要给每个树木加碰撞体
在这里插入图片描述

7. 添加角色

添加角色,随便找个人物角色图片就可以了,也可以用我准备的
在这里插入图片描述
注意:角色裁剪时记得把锚点设置在人物脚的位置,这个很关键,开始我就是没注意,当设置人物位置时,会发生偏移
在这里插入图片描述
直接拖拽锚点肯定是不精准,每张图片不同位置锚点的偏差会使角色出现晃得的情况,所以最好是手动修改锚点的位置,我这里设置的是0.5x0.15
在这里插入图片描述

想默认把角色放在哪个瓦片上,就设置角色xy坐标为对应即可,切记不要拖拽,不然xy坐标会不准确,后面渲染行走路线会不准确
在这里插入图片描述
给角色添加对应动画和碰撞器,记得修改排序图层为Forground
在这里插入图片描述

8. 新增游戏管理脚本

我们希望的是当鼠标点击角色时,角色能够显示相应的可移动范围,有障碍物,则这个瓦片呢不可以移动

我们首先需要遍历所有的瓦片
然后去筛选出所有满足要求的瓦片
然后对这些瓦片呢进行高亮
然后就可以显示出:我们角色可以移动的这些瓦片了
由于需要遍历所有的瓦片
之后呢,我们也会去需要对所有的瓦片进行高亮和重置等操作
我们会反反复复的一遍一遍的去用到所有瓦片这一数组

我们新建一个C#脚本GameManager
来管理游戏中的一些核心的变量和一些常用的方法
tiles其实可以通过动态生成比较好,这里为了方便我就直接使用拖拽了

设置为单例

public class GameManager : MonoBehaviour
{public static GameManager instance;public Tile[] tiles;//在这个游戏中所有的贴图public Unit selectedUnit;//被选中的角色private void Awake(){if(instance == null){instance = this;}else{if(instance != this){Destroy(gameObject);}}DontDestroyOnLoad(gameObject);}
}

新建一个C#脚本Unit将Unit脚本,添加到角色游戏对象中
鼠标要点击的呢,是Unit对象(所以写在Unit脚本中)

我们鼠标是点击我们的角色
当我们鼠标进入角色Collider范围
并且按下鼠标左键时,则会调用这个方法(OnMouseDown】
所以方法内部呢
当我们点击这个角色后,显示可移动的瓦片

声明一个整数类型,int类型的变量moveRange
表示当前角色可移动的格子数
我们先设置为三
如果之后我们创建不同的角色
我们还可以去使用
【ScriptableObject】)或者【继承】
的方式来进行代码上的重构

我们还可以利用特性【Range】
将这个变量的可选择范围呢,控制在1~7这几个整数当中
在【ShowWalkableTiles】)方法中
我们要获取角色周围以自身为中心的一个菱形
菱形的大小呢,由角色的移动范围来决定
Unit代码
在这里插入图片描述

9. 角色移动范围逻辑

我们应该如何去获取,角色移动可行走的瓦片呢

我们可以先做一个这样的判断

如果我们的角色移动范围等于1
那么我们角色可以行走范围呢,应该是这个样子的
在这里插入图片描述
如果我们的角色移动范围等于2
那么我们可以行走的范围,可以到达额外的这八个点
在这里插入图片描述
我们将所有可移动的瓦片位置坐标,标示在了图片上
我们可以发现,我们可达到的瓦片的位置坐标呢X和Y值相加会小于等于角色的移动范围
在这里插入图片描述
我们可以分别去通过角色与每个瓦片之间的x轴的距离
角色与每个瓦片之间Y轴的距离,相加进行比较
如果X轴和Y轴的距离相加之后,小于等于角色的移动范围
那么这些瓦片呢,就是我们可以移动的范围了
其他的瓦片就是在我们角色移动范围之外的这些瓦片

10. 角色移动范围可视化

完善Unit代码

public class Unit : MonoBehaviour
{[SerializeField] [Range(1,7)]private int moveRange = 3;private void OnMouseDown(){ShowWalkableTiles();}private void ShowWalkableTiles(){for (int i = 0; i < GameManager.instance.tiles.Length; i++){float distX = Mathf.Abs(transform.position.x - GameManager.instance.tiles[i].transform.position.x);float distY = Mathf.Abs(transform.position.y - GameManager.instance.tiles[i].transform.position.y);if(distX + distY <= moveRange){//Tile is Walkable or not (without obstacle)if (GameManager.instance.tiles[i].canWalk)GameManager.instance.tiles[i].HighlightTile();}}}

Tile脚本定义可行走区域高亮显示方法

public void HighlightTile()
{if (canWalk){spriteRenderer.color = highlightColor;}else{spriteRenderer.color = Color.white;}}

挂载脚本,绑定参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果发现一切设置都没错,但是点击没有效果,也没有调用OnMouseDown方法,可以将角色z轴适当调高,防止遮挡
在这里插入图片描述
效果,可以看到,被障碍物树木占据的瓦片禁止行走,是我们想要的效果
在这里插入图片描述

11. 角色移动

下一步就是:我们要让我们的角色能够真正的移动到我们想要移动到的点
当我们选中角色后,点击瓦片时,角色才能移动
意思就是说,我们移动的方法应该写在Tile瓦片脚本内部
我们可以在瓦片这个Tile脚本当中,使用OnMouseDown方法来执行角色的移动
我们的角色,会移动到我们点击的这个瓦片位置上

由于之后呢
我们可能会不止有一个角色
我们在GameManager脚本当中呢
声明一个Unit类型的变量selectedUnit
表示我们当前鼠标点击的这个角色

public Unit selectedUnit;//被选中的角色

在Unit脚本中,创建一个Move方法

由于角色的移动,是需要一个【过程】的,并且,我们希望角色的移动是根据瓦片的路线来进行移动的,而不是点对点的直接移动,这里我们就需要去使用协程函数,【协程函数】可以将一个函数分割成多个帧去执行(按一定顺序去执行),优先去进行【水平方向】的移动

在这里插入图片描述
在这里插入图片描述

[SerializeField] private float moveSpeed;//MARKER 这个方法会在【Tile脚本】中OnMouseDown函数中被【调用】
public void Move(Transform _trans)
{StartCoroutine(MoveCo(_trans));
}IEnumerator MoveCo(Transform _trans)
{//角色先水平方向移动while (transform.position.x != _trans.position.x){transform.position = Vector2.MoveTowards(transform.position, new Vector2(_trans.position.x, transform.position.y), moveSpeed * Time.deltaTime);yield return new WaitForSeconds(0);}//水平方向到达目的地X后,再垂直方向移动while (transform.position.y != _trans.position.y){transform.position = Vector2.MoveTowards(transform.position, new Vector2(transform.position.x, _trans.position.y), moveSpeed * Time.deltaTime);yield return null;}
}

12. 重置瓦片颜色

在角色完成移动后,我们当然希望将我们一开始【高亮】的瓦片,能够重置回原本的颜色,来保证之后的所有操作

我们可以在Tile脚本中,创建一个ResetTile方法
对【颜色属性】进行一次修改

public void ResetTile()
{spriteRenderer.color = Color.white;
}

在Unit脚本中创建一个ResetTiles方法
遍历所有瓦片,将他们重置回原本的颜色

private void ResetTiles()
{for (int i = 0; i < GameManager.instance.tiles.Length; i++){GameManager.instance.tiles[i].ResetTile();}
}

在角色完成移动后再调用这个方法

IEnumerator MoveCo(Transform _trans)
{//。。。ResetTiles();
}

在tile脚本中调用move方法

private void OnMouseDown()
{//Player Move to "this" TILE 当我们选择了角色,点击这块瓦片,那么角色就会移动到这个瓦片上!if (GameManager.instance.selectedUnit != null)GameManager.instance.selectedUnit.Move(this.transform);}

最后别忘了一点,我们还需要在这个角色的Unit脚本当中的OnMouseDown中指明
GameManager.instance.selectedUnit = this;

private void OnMouseDown()
{GameManager.instance.selectedUnit = this;//。。。
}

效果
在这里插入图片描述
ps:上图演示有个瓦片没有显示,是因为我下面的障碍物树木碰撞体设置过大,影响了上面的瓦片,我自己调整了,这里说明一下

12. 限制移动次数

最后还遗留了一个问题,我们的角色可以进行无限次数的移动

在Tile引入canMove参数,判断哪个瓦片人物是可移动的,以此来限制角色的移动次数

public bool canMove;public void HighlightTile()
{if (canWalk){canMove = true;spriteRenderer.color = highlightColor;}else{spriteRenderer.color = Color.white;}
}public void ResetTile()
{spriteRenderer.color = Color.white;//重置所有的canMove为falsecanMove = false;
}
private void OnMouseDown()
{//Player Move to "this" TILE 当我们选择了角色,点击这块瓦片,那么角色就会移动到这个瓦片上!if (canMove && GameManager.instance.selectedUnit != null)GameManager.instance.selectedUnit.Move(this.transform);
}

13. 最终效果

在这里插入图片描述

其他

其实后面还有很多开发的空间,比如增加不同的角色、敌人,完善角色移动和攻击动画等,这里我就不在赘述了,留给大家自由去扩展,结束

源码下载

https://gitcode.net/unity1/battleflag
在这里插入图片描述

参考

【视频】https://www.bilibili.com/video/BV1vQ4y1M7gy/

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

相关文章:

【用unity实现100个游戏之6】制作一个战旗自走棋类游戏(附源码)

文章目录 前言导入素材开始1. 设置瓦片间隙2. 放置全图瓦片3. 美化瓦片地图4. 添加树木障碍物5. 设定不同的排序图层6. 瓦片交互6. 瓦片交互优化6. 瓦片是否允许角色7. 添加角色8. 新增游戏管理脚本9. 角色移动范围逻辑10. 角色移动范围可视化11. 角色移动12. 重置瓦片颜色12. …...

W5100S-EVB-PICO 做TCP Server进行回环测试(六)

前言 上一章我们用W5100S-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试&#xff0c;那么本章将用开发板做TCP服务器来进行数据回环测试。 TCP是什么&#xff1f;什么是TCP Server&#xff1f;能干什么&#xff1f; TCP (Transmission Control Protocol) 是一种面向连…...

dinput8.dll导致游戏打不开的解决方法,快速修复dinput8.dll文件

当你尝试启动某个游戏时&#xff0c;如果遇到dinput8.dll文件缺失或损坏的错误提示&#xff0c;可能会导致游戏无法正常运行。dinput8.dll是DirectInput API的一部分&#xff0c;它提供了游戏手柄、键盘和鼠标等输入设备的支持。本文将详细介绍dinput8.dll的作用、导致游戏无法…...

NAS相关

Debian11 更换软件源 备份 #备份软件源列表 cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑sources.list nano /etc/apt/sources.list替换文件内容 deb http://mirrors.163.com/debian/ bullseye main non-free contrib deb http://mirrors.163.com/debian/ bull…...

26.Netty源码之ThreadLocal

highlight: arduino-light JDK ThreadLocal 如果你需要变量在多线程之间隔离&#xff0c;或者在同线程内的类和方法中共享&#xff0c;那么 ThreadLocal 大显身手的时候就到了。ThreadLocal 可以理解为线程本地变量&#xff0c;它是 Java 并发编程中非常重要的一个类。 ThreadL…...

Mysql SUBSTRING_INDEX - 按分隔符截取字符串

作用&#xff1a; 按分隔符截取字符串 语法&#xff1a; SUBSTRING_INDEX(str, delimiter, count) 属性&#xff1a; 参数说明str必需的。一个字符串。delimiter必需的。分隔符定义&#xff0c;是大小写敏感&#xff0c;且是多字节安全的count必须的。大于0或者小于0的数值…...

封装Ellipsis组件,亲测使用各种场景

自己封装了Ellipsis组件 基于reacttaro&#xff0c;以下是实现代码&#xff0c;分为JSX和CSS文件 JSX代码如下&#xff1a; import { FC, Fragment, JSX, useState } from react; import { Image, StandardProps, Text, View } from tarojs/components;import iconDropDown fr…...

Kendo UI for jQuery,一个现代的jQuery UI组件!

Kendo UI for jQuery是什么&#xff1f; Kendo UI for jQuery是完整的jQuery UI组件库&#xff0c;可快速构建出色的高性能响应式Web应用程序。Kendo UI for jQuery提供在短时间内构建现代Web应用程序所需要的工具&#xff0c;从多个UI组件中选择&#xff0c;并轻松地将它们组…...

C++初阶语法——类和对象

前言&#xff1a;C语言中的结构体&#xff0c;在C有着更高位替代者——类。而类的实例化叫做对象。 本篇文章不定期更新扩展后续内容。 目录 一.面向过程和面向对象初步认识二.类1.C中的结构体2.类的定义类的两种定义方式 3.类的访问限定符及封装访问限定符说明 4.类的实例化对…...

linux学习(进程创建)[8]

创建进程 myproc.c #include <stdio.h> #include <unistd.h>int main() {printf("我是父进程\n");pid_t id fork();if(id < 0){printf("创建子进程失败\n");return 1;}else if(id 0){while(1){printf("我是子进程&#xff1a; pid…...

Linux基础与应用开发系列九:各类系统函数

open_close函数 OPEN函数 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 函数原型&#xff1a; 当文件存在时 int open(const char* pathname,int flags) 当文件不存在时 int open (const char* pathname,int f…...

国产数据库排行

目录 一、理论 1.国产数据库排行 2.数据 一、理论 1.国产数据库排行 &#xff08;1&#xff09;墨天轮榜单 墨天轮国产数据库流行度排行于2019年6月推出&#xff0c;通过近50个维度的数据来考察近300个国产数据库的流行度排行&#xff0c;每月1日更新排行数据&#xff0c…...

数学符号说明——三角等号(≜)

三角等号 &#xff0c;LaTex语法宏 (\triangleq&#xff09;&#xff0c;Unicode(U225C)&#xff0c;又称 "delta equal to(Δ 等)"。可以读作 "等于"、"根据定义 x 等于 y "。 有时候&#xff0c;用在数学(和物理学)的某种定义中。例如&#…...

健启星|医学营养的市场先行者

随着《“健康中国2030”规划纲要》、《国民营养计划&#xff08;2017-2030年&#xff09;》等政策的陆续发布&#xff0c;标志着以传统药物治疗为中心的医疗模式时代正式转型到以预防和康复为中心的新的医学营养时代。在此背景下&#xff0c;符合时代需求的特医食品成为“医学营…...

从 GPT4All 体验 LLM

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 什么是 GPT4All&#xff1f; 术语“GPT”源自 Radford 等人 2018 年论文的标题“通过生成预训练提高语言理解”。本文描述了如何证明变压器模型能够理解人类语言。 从那时起&#xff0c;许多人尝试使用转…...

QGraphicsView实现简易地图4『局部加载-地图漫游』

前文链接&#xff1a;QGraphicsView实现简易地图3『局部加载-地图缩放』 当鼠标拖动地图移动时&#xff0c;需要实时增补和删减瓦片地图&#xff0c;大致思路是计算地图从各方向移动时进出视口的瓦片坐标值&#xff0c;根据变化后的瓦片坐标值来增减地图瓦片&#xff0c;以下将…...

ubuntu 安装 nvidia 驱动

ubuntu 安装 nvidia 驱动 初环境与设备查询型号查询对应的驱动版本安装驱动验证驱动安装结果 本篇文章将介绍ubuntu 安装 nvidia 驱动 初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统&#xff1a;ubuntu 设备&#xff1a;Nvidia GeForce RTX 4090 查询型…...

探索APP界面布局的艺术与技巧:从入门到精通

引言 在当今数字化时代&#xff0c;移动应用程序&#xff08;APP&#xff09;成为人们生活中不可或缺的一部分。而一个成功的APP界面布局是吸引用户、提升用户体验的关键因素之一。本文将带您深入探索APP界面布局的艺术与技巧&#xff0c;从入门到精通&#xff0c;让您能够轻松…...

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门…...

15.3.2 【Linux】系统的配置文件:/etc/crontab,/etc/cron.d/*

这个“ crontab -e ”是针对使用者的 cron 来设计的&#xff0c;如果是“系统的例行性任务”时&#xff0c; 该怎么办呢&#xff1f;是否还是需要以 crontab -e 来管理你的例行性工作调度呢&#xff1f;当然不需要&#xff0c;你只要编辑/etc/crontab 这个文件就可以。有一点需…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...