Java Swing游戏开发学习19

内容来自RyiSnow视频讲解

这一节讲的是**Entity ArrayList(Render Order Revised)**实体数组列表(渲染顺序修改)。

前言

  由于NPC和player的实体碰撞区域比他们本身的大小要小,所以会造成一个bug,当前的绘制顺序是,NPC先绘制,player后绘制,导致player从npc上面向下碰到npc的时候,2者的绘制出现了重叠现象。

下图红色部分为player或npc的实体碰撞检测区域。比他们的实际尺寸大小要小。
在这里插入图片描述

重叠问题如下图所示:
在这里插入图片描述

实现

  创建一个ArrayList,把npc, objects, player都放进去,按每个Entity的worldY坐标从小到大排序,前面的小,越往后面worldY越大。这样向上图老人npc就会排在player后面,按这个顺序绘制,老人就不会被他上面的player遮挡了,更合理。

这里为了方便实现,将SuperObject类删除,替换为了Entity类,必要的属性做了保留。

看作者的代码,修复了一次这个bug了,但是如果有多个npc还是会出这个问题。根据作者代码实际验证了一下,1个npc,没有问题,如果多个就不行了。不过看下面代码这个逻辑也不该再出现这个问题啊,感觉很蹊跷,略有些迷茫。另外,估计作者有修改代码,视频讲解没出,以至于有些地方改了,视频上没反应出来。

作者上传了一个修改渲染顺序的视频,但是这个解决方案不完善,没有彻底解决绘制不合理的bug,作者删除了前一个视频又重新修改代码彻底解决了这个问题,制作了新的视频。

// npc
for (int i = 0; i < npc.length; i++) {
    if (npc[i] != null) {
        int npcY = npc[i].worldY;
        if (playerY < npcY) {
            player.draw(g2);
            npc[i].draw(g2);
        } else {
            npc[i].draw(g2);
            player.draw(g2);
        }
    }
}

重新修改,按worldY坐标排序

// sort
Collections.sort(entityList, new Comparator<Entity>() {
     @Override
     public int compare(Entity e1, Entity e2) {
         int result = Integer.compare(e1.worldY, e2.worldY);
         return result;
     }
 });

//draw entities
for (int i = 0; i < entityList.size(); i++) {
    entityList.get(i).draw(g2);
}
// empty entity list
entityList.clear();

这里出现了一个jdk很方便的比较方法。

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

接下来即可遍历entityList进行绘制,绘制结束后,清空entityList,不然它会重复添加元素,持续膨胀。

为了测试新的渲染效果,增加了很多测试代码,测试完可以删除掉。

测试

增加了几扇门和几个老人NPC,门缩小了一些solidArea碰撞检测区域。
在这里插入图片描述

代码

参考第6篇文章最后,可以使用git clone或直接下载获得完整项目

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

Linux文件(系统)IO(含动静态库的链接操作)

文章目录 Linux文件&#xff08;系统&#xff09;IO&#xff08;含动静态库的链接操作&#xff09;1、C语言文件IO操作2、三个数据流stdin、stdout、stderr3、系统文件IO3.1、相关系统调用接口的使用3.2、文件描述符fd3.3、文件描述符的分配规则3.3、重定向3.4、自制shell加入重…

Web框架开发-Django中间件

一、中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。 Django的中间件的定义: Middleware is a framework of hooks into Dj…

9.HelloWorld案例常见问题

文章目录 一、BUG二、BUG的解决三、HelloWorld常见问题 一、BUG BUG&#xff08;小甲虫&#xff09;。计算机刚开始出现的时候&#xff0c;因为体积比较大&#xff0c;一些小虫子很容易转进去。有一天有一只蟑螂钻到了计算机当中&#xff0c;从而导致计算机不能正常运行&#…

git reset版本回退后悔药(图文例子)

目录 版本回退前期测试样例准备git reset --soft 不撤销add,撤销commit,保留修改git reset --mixed 或 git reset () 撤销add,撤销commit,保存修改git reset --hard 撤销add,撤销commit,不保存修改git reset --merge 取消合并git reset --keep 不撤销add,撤销commit,根据情况判…

单链表的插入和删除

一、插入操作 按位序插入&#xff08;带头结点&#xff09;&#xff1a; ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct LNode{ElemType data;struct LNode *next; }LNode,*LinkList;//在第i 个位置插插入元素e (带头结点) bool Li…

String类相关oj练习

1.第一次只出现一次的字符 做题首先看清要求和提示&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 提示&#xff1a; 1 < s.length < 105s 只包含小写字母 这就要用到我们所学…

win11 查看 wifi 密码

** win11 查看 wifi 密码 ** 第一种方法&#xff1a; 1.点击桌面左下角的开始菜单&#xff0c;选择“设置”。 2.在网络和internet中选择“高级网络设置”。 3.在相关设置下方点击“更多网络适配器选项”。 4.右击“WLAN”&#xff0c;在WLAN信息窗口点击“状态”。 5.…

月入10.5k;36岁生物专业转行网优,选择真的比努力更重要!

张雪峰说&#xff1a;普通家庭的孩子选择专业首要要考虑的是能不能就业&#xff1f;能不能拿到高薪&#xff1f;因为除了你的父母&#xff0c;没人会对你的未来负责。 学历和专业哪个更重要&#xff1f;不同的人往往会有不同的解答&#xff0c;今天故事的主人公H先生毕业于武汉…

关于使用vscode搭建c/c++编程环境

目录 关于使用vscode搭建c/c编程环境一、前言二、安装 IDE 二、安装TDM-GCC安装三、安装C/C环境四、编写代码并进行编译 关于使用vscode搭建c/c编程环境 一、前言 一直觉得vscode是生产强有力的生产工具&#xff0c;基于此&#xff0c;做一篇学习笔记进行记录。 二、安装 ID…

centos7系统下nginx1.24.0升级

如果没有这些目录&#xff0c;请先创建: mkdir /data/software mkdir /data/program提前下载所需的软件&#xff1a; cd /data/software wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz wget https://nginx.org/download/nginx-1.24.0.tar.gz安装nginx cd /data/soft…

正弦实时数据库(SinRTDB)使用(3)-用户管理

通过实时数据库管理工具登录后&#xff0c;在头部功能区的用户管理或左侧导航菜单的用户管理都可以打开用户管理功能界面&#xff0c;用户管理功能界面展示在中部主窗口区。 用户管理界面如下所示&#xff1a; 用户管理顶部包含刷新、添加用户、修改角色、修改密码及删除用户等…

【CASS精品教程】CASS添加标准图幅(50×50cm+50×40cm)

大比例尺地形图图幅一般分为正方形和矩形分幅两种,本文讲解CASS中添加标准图幅(5050cm、5040cm)的方法。 文章目录 一、CASS参数配置二、添加标准图幅(5050cm)三、添加标准图幅(5040cm)打开基于CASS自带案例数据study.dat绘制好的地形图study.dwg,如下图所示,下面来演示两种…

近年来,常见5大软件开发项目管理工具

时代进步&#xff0c;技术进步&#xff0c;汇总下近几年5大常用的软件开发项目管理工具。 1、微软项目管理软件 Microsoft Project&#xff08;或MSP&#xff09;是由微软开发销售的项目管理软件程序。软件设计目的在于协助项目经理制定发展计划、为任务分配资源、跟踪进度、管…

2024年给Mac电脑提速小妙招

经常听到小伙伴在抱怨PC电脑很慢&#xff0c;但是其实Mac电脑随着用的时间增长&#xff0c;运行速度也会越来越慢&#xff0c;那么造成Mac运行慢的原因有很多&#xff0c;可能是操作系统过时未更新&#xff0c;也可能是内存&#xff08;RAM&#xff09;不足&#xff0c;以下小编…

IDEA2023版本整合SpringBoot热部署

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

Avue-crud表格操作栏不显示修改、删除按钮

2024-03-28 奇了怪了&#xff0c;CSDN自动把我之前的文章设置为VIP了&#xff0c;怪不得有时候搜东西看着看着要收费&#xff0c;现在找东西都不好找&#xff0c;我已经反馈不同意了&#xff0c;看看能不能给我取消吧 今天用Avue的时候发现操作栏的按钮没了&#xff0c;按照文…

mysql进阶查询

按关键字排序 PS:类比于windows 任务管理器 使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来&#xff0c;如果对查询的结果进行排序&#xff0c;可以使用 ORDER BY 语句来对语句实现排序&#xff0c;并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某…

vue3动态绑定style

vue3动态绑定style :style"{属性名&#xff1a;变量}"直接引用对象 :style"对象"绑定一个含多个样式的数组 :style"[styleA, styleB]" :style“{属性名&#xff1a;变量}” 变量的赋值可以根据自己的业务做出调整 直接引用对象 :style“对象”…

Transformer的前世今生 day06(Self-Attention和RNN、LSTM的区别)

Self-Attention和RNN、LSTM的区别 RNN的缺点&#xff1a;无法做长序列&#xff0c;当输入很长时&#xff0c;最后面的输出很难参考前面的输入&#xff0c;即长序列会缺失上文信息&#xff0c;如下&#xff1a; 可能一段话超过50个字&#xff0c;输出效果就会很差了 LSTM通过忘…