简单的移动阵型补全

2023-11-18

需求:模拟企鹅群以一种三角形的阵型移动,并向目标发动冲击。冲击时候的企鹅不在跟随阵型移动,阵型内的企鹅跟随阵型移动,并且会自动补全阵型。

企鹅群体大概是这样的阵型:
  o
 o o
o o o

可以抽象成一个数组:


    fromation = new int[,]{
    { 0,0,1,0,0 },
    { 0,1,0,1,0 },
    { 1,0,1,0,1 }
    };


	class PenguinComp
	{
	  Vector2Int index;
	  bool isMoving;
	}

1记为有企鹅的位置,0记为没企鹅的位置,给企鹅的类加入一个二维数组的索引,用来判断企鹅所在的位置,并通过比对来判定目标位置是否有可用的企鹅。

那么formation的数组的每个位置有三种情况:
1.这个位置不需要企鹅:记为0
2.这个位置需要且被企鹅占用:记为 1
3.这个位置需要且没被企鹅占用:记为 -1

在每一帧的时候去查找目标位置,在若对应位置 为-1的时候则从下一行获取为1的位置来记录来进行往上偏移的队伍补全。
然后当企鹅在移动的时候把对应的-1格子置为1,企鹅原来的格子置为-1,并且把企鹅isMoving设置为true。
表示目标对象的位置被企鹅占用了,但是占用的企鹅还在路上。
这样只要搜索到位置为-1的位置,并在下一排找到位置为1且占用的企鹅已经抵达的格子进行补全就行了。


然后会发现,进行移动的企鹅都是最左边的位置的企鹅进行移动。按道理来讲,若有企鹅补全,应该是在后面一行的临近位置进行补全的。
在补全的时候添加一个范围,
例如:
若要在(i,j)补全一只企鹅 则后面搜索企鹅的范围应该先在(i-1,j+1) 和(i+1,j+1)之间进行搜索,然后再从其他位置进行搜索。


进行了上述改动之后又会发现,这次所选择的企鹅变成限制了范围后的最左边的企鹅。讲道理的话应该需要轮流使用。
这样不妨使用权重的方式进行:
每次有企鹅从这个位置出发时候就先进行+1在进行相反数处理,则第N次出发后这个位置的值就会变成 -N,那么在它抵达之后把当前位置再进行一个相反数,则当前位置的数值变成N。
这样的话,数值越大,证明这个位置移动的企鹅越多,这样的话,下次这个遍历(i-1,j+1) 和(i+1,j+1)之间选择企鹅的时候,选择数值小的,就可以使得左右两边的企鹅移动次数更加平均。

最后代码大概这样:

  void LineUpPengineGroup()
  {
    //PrintDoubleArray(fromation);
    for (int i = 0; i < fromationHeight;i++)
    {
      for(int j = 0;j< fromationWidth; j++)
      {
        //不需要排新的企鹅
        if (fromation[i, j] >= 0) continue;
        PenguinComp penguin = null;
        //最后一排之前用后面排得企鹅排
        if (i < fromationHeight - 1)
        {
          // 检索的左右边界
          int left = ((j - 1) >= 0)? j - 1: 0;
          int right = ((j + 1) < fromationWidth) ? j + 1: fromationWidth - 1;
          //选择之前没移动过的企鹅
          int weight = 999;           
          for(int k = left; k <= right; k++)
          {
            
            PenguinComp penguinTemp = FindPenguinByIndex(new Vector2Int(i + 1, k));
            if ((weight < fromation[i + 1, k] || fromation[i + 1, k] < 1) || penguinTemp == null) continue;
            weight = fromation[i + 1, k];
            penguin = penguinTemp;
          }
        }
        //最后一排的企鹅
        else
        {
          penguin = PopPenguinOutOfScreen();
          if (penguin == null) break;
        }
        //计算坐标并归位
        if (penguin != null) LineUpPengine(penguin, new Vector2Int(i, j));
      }
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的移动阵型补全 的相关文章

  • 一些个人常用的网站网址

    一些个人常用的网站网址 GitHub https github com Gitee https gitee com 1 书栈网 https www bookstack cn explore cid 27 tab popular 2 Unit
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • Unity WebGL错误集锦

    ips 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace 可以在打出的包中的浏览器的webgl打印出错
  • Unity Animator 动画没切换

    恶魔射手 Survival Shooter 项目 有两个动画 一个是静止时的Idle 一个是走路时候的Move 如下图 设置好动画状态机后发现按方向键后还是Idle 没反应 而一直按着方向键后呢又动起来了 最后找到了真相 原来选中了 Has
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜

随机推荐

  • Vite 和 Webpack 的区别

    Vite 和 Webpack 都是前端打包工具 它们的作用类似 但实现方式和使用方法有所不同 以下是它们之间的一些区别 构建速度 Vite 的构建速度比 Webpack 更快 因为 Vite 在开发环境下使用了浏览器原生的 ES 模块加载
  • 浏览器油猴插件Tampermonkey下载安装

    没有插件的浏览器 不是真正的浏览器 当我们的浏览器装上插件之后 瞬间强大了许多 下面给大家介绍一下浏览器插件神器油猴插件Tampermonkey的下载安装 油猴Tampermonkey插件下载安装方法一 直接打开油猴Tampermonkey
  • 为什么要用box-sizing: border-box?一般什么时候用?

    1 新建一个HTML文档 并定义一个块元素 CSS示例 normal width 100px height 100px background blue 步骤阅读 2 保存文件 预览效果 步骤阅读 3 再次加入一个DIV并在原有的CSS上复制
  • 二十三、SQL 数据分析实战(10个简单的SQL题目)

    文章目录 题目1 比赛名单整理 题目2 热门游戏排行 题目3 社区生鲜App覆盖分析 题目4 社区团购行为分析 题目5 统计字符出现次数 题目6 找出各类别商品销量最高的商品 题目7 找出每个部门薪资第二高的员工 题目8 游戏玩家登录情况分
  • Java面向对象编程

    在单处理器系统中 如果同时存在有12个进程 则处于就绪队列中的进程数量最多为 A 1 B 9 C 10 D 11 答案 D 以下关于多线程的叙述中错误的是 A 线程同步的方法包括使用临界区 互斥量 信号量等 B 两个线程同时对简单类型全局变
  • 约瑟夫环问题(报数问题)

    先说一下什么是约瑟夫环问题 这是百科的解释 约瑟夫环 约瑟夫问题 是一个数学的应用问题 已知n个人 以编号1 2 3 n分别表示 围坐在一张圆桌周围 从编号为k的人开始报数 数到m的那个人出列 他的下一个人又从1开始报数 数到m的那个人又出
  • 如何在csdn免费下载资料?

    1 可以在个人设置里 绑定手机账号奖励整整50分 点下头像一个人中心一账号设置一手机绑定 2 完成任务 任务要在http task csdn net 里才能看到 3 上传有效 有效啊 别上个广告啊 非法啥的 反而还扣了 资源 4 评论资源
  • QT 5.8

    QT与Qt Creator 前者是框架 类似与MFC 而后者是QT的编译器 也可以使用Visual studio编辑 编译需要其他的 Index of new archive qt 5 8 5 8 0
  • MySQL的体系架构

    文章目录 前言 MySQL的Server层 MySQL的存储引擎 1 InnoDB 存储引擎 2 MyISAM 存储引擎 3 Memory 存储引擎 前言 在学习一种事务之前 我们需要先了解事物的基本组成结构 清楚了事物的基本组成结构之后
  • Linux或者ubuntu子系统中OpenMPI的安装

    在Linux中安装MPI Message Passing Interface 需要以下步骤 检查依赖项 首先 确保系统已经安装了必要的编译工具和库文件 运行以下命令更新软件包并安装所需依赖项 sudo apt update sudo apt
  • 【C语言】实现字符串逆序输出(包含空格的字符串)

    1 目的 实现字符串的逆序输出 比如I believe you 变为you believe I的形式 2 基本思路 这里我们先创建一个可以实现逆序打印的函数 将字符串逆序变为 uoy eveileb I 然后再将每个字符串逆序 从而变为yo
  • java 基础重学(一)-面向对象

    一 什么是面向过程 面向过程 是一种以事件为中心的编程思想 编程的时候把解决问题的步骤分析出来 然后用函数把这些步骤实现 在一步一步的具体步骤中再按顺序调用函数 自顶向下 逐步求精 模块化封装函数主张按功能把软件系统逐步细分 对每个涉及到的
  • 华为OD机试真题 Java 实现【整数对最小和】【2022Q4 100分】,附详细解题思路

    一 题目描述 给定两个整数数组array1 array2 数组元素按升序排列 假设从array1 array2中分别取出一个元素可构成一对元素 现在需要取出k对元素 并对取出的所有元素求和 计算和的最小值 注意 两对元素如果对应于array
  • 在win10, win11 家庭版中安装远程桌面服务

    win10 win11 家庭版中提供远程桌面服务 简介 在windows家庭版中 是不提供远程桌面服务的 你没有办法使用远程桌面连接到windows家庭版中 当然 你可用升级windows 版本到专业版 这样就可用享受到windows自带的
  • MySQL从5.6版本到5.7版本的升级过程

    MySQL从5 6版本到5 7版本的升级过程 二进制升级过程 1 介绍 此处因原有的版本就是5 6的 就不再赘述5 6的安装过程了 原有数据库5 6的目录情况 basedir usr local mysql base目录是做的软链 指向my
  • Matplotlib输出中文显示问题

    Matplotlib输出中文显示问题 试过觉得有用的办法 http www 360doc com content 14 0713 12 16740871 394080556 shtml
  • ggplot2读书笔记6:第四章 语法 基础理论

    碎碎念ing 终于结束了 ggplot2 的第一部分 Getting Started 今天开始看第二部分 语法 第四章 Mastering the Grammar 介绍了ggplot2的一些基础语法知识 大概是对前期内容在理论上做一个总结
  • x390拆机 升级内存和硬盘_战66拆机加内存折腾手记

    前言 今年6 18时入HP 战66二代AMD版时就在计划双十一时升级内存到16G 并顺带加个机械硬盘 结果用了4个多月后感觉目前硬盘空间尚无压力 所以只计划加内存 晒单 之前有朋友用过芝奇 说还不错 既有逼格也有保障 没有等到11 11当天
  • openGL增强表面细节----高度贴图

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 代码 主程序c 效果 前言 现在我们扩展法线贴图的概念 从纹理图像用于扰动法向量到扰乱顶点位置本身 实 际上 以这种方式修改对象的几何体具有一定的优势 例如使表面特征沿
  • 简单的移动阵型补全

    需求 模拟企鹅群以一种三角形的阵型移动 并向目标发动冲击 冲击时候的企鹅不在跟随阵型移动 阵型内的企鹅跟随阵型移动 并且会自动补全阵型 企鹅群体大概是这样的阵型 o o o o o o 可以抽象成一个数组 fromation new int