Java Swing游戏开发学习19

news2024/11/24 12:29:57

内容来自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或直接下载获得完整项目

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

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

相关文章

进程的基础知识

1).进程:一个正在运行中的程序; 2).PCB:进程控制块,进程描述符(PID:进程唯一的标识符) 进程控制块是用一个结构体struct task_struct来实现; 3).进程的状态: 就绪,阻塞,运行; 时间片轮转调度; 时间片轮转调度是一种最古老&#xff0c;最简单&#xff0c;最公平且使用最广的…

一文即可帮助你认识进程和线程~

本文的重点&#xff1a;什么是&#xff1a;进程、进程调度、线程和他们之间的联系。主讲概念知识&#xff0c;不讲代码实现 目录 一、认识进程 1.什么是进程 2.进程的信息 3.进程调度(***) 4.进程调度的基本过程 二、线程 1.线程的引入 2.什么是线程 3.进程于线程的联…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

【功能实现】新年贺卡(蓝桥)

题目分析&#xff1a; 想要实现一个随机抽取功能 功能拆解&#xff1a;题目给了数组&#xff0c;我们采用生成随机数的方式&#xff0c;随机数作为数组的索引值访问数组的值。 并返回获取到的值&#xff0c;将获取到的值插入到页面中。 document.addEventListener(DOMConten…

Diffusion添加噪声noise的方式有哪些?怎么向图像中添加噪声?

添加噪声的方式大致分为两种&#xff0c;一种是每张图像在任意timestep都加入一样的均匀噪声&#xff0c;另一种是按照timestep添加不同程度的噪声 一、在任意timestep都加入一样的noise batch_size 32x_start torch.rand(batch_size,3,256,256) noise torch.randn_like(x_…

【spring】@Autowired注解学习

Autowired介绍 Spring框架是Java领域中一个非常重要的企业级应用开发框架&#xff0c;它提供了全面的编程和配置模型&#xff0c;旨在帮助开发者更快速、更简单地创建应用程序。在Spring框架中&#xff0c;Autowired是一个非常重要的注解&#xff0c;它用于实现依赖注入&#…

保研线性代数机器学习基础复习1

1.什么是代数&#xff08;algebra&#xff09;? 为了形式化一个概念&#xff0c;构建出有关这个概念的符号以及操作符号的公式。 2.什么是线性代数&#xff08;linear algebra&#xff09;&#xff1f; 一项关于向量以及操作向量的公式的研究。 3.举一些向量的例子&#x…

我的编程之路:从非计算机专业到Java开发工程师的成长之路 | 学习路线 | Java | 零基础 | 学习资源 | 自学

小伙伴们好&#xff0c;我是「 行走的程序喵」&#xff0c;感谢您阅读本文&#xff0c;欢迎三连~ &#x1f63b; 【Java基础】专栏&#xff0c;Java基础知识全面详解&#xff1a;&#x1f449;点击直达 &#x1f431; 【Mybatis框架】专栏&#xff0c;入门到基于XML的配置、以…

C语言运算符和表达式——赋值运算符

目录 变量的定义 赋值运算符 赋值表达式 如何给变量赋值 变量的定义 声明变量的名字和类型 变量的类型决定了 *占用内存空间的大小 *数据的存储形式 *合法的表数范围 *可参与的运算种类 *变量名标识了内存中的一个存储单元 问题&#xff1a;未被初始化的变量的值是什么&a…

yolov8 pose keypoint解读

yolov8进行关键点检测的代码如下&#xff1a; from ultralytics import YOLO# Load a model model YOLO(yolov8n.pt) # pretrained YOLOv8n model# Run batched inference on a list of images results model([im1.jpg, im2.jpg]) # return a list of Results objects# Pr…

PCL拟合并绘制平面(二)

使用RANSAC拟合点云平面 1、C实现2、效果图 普通的点云平面拟合方式在一般情况下可以得到较好的平面拟合效果&#xff0c;但是容易出现平面拟合错误或是拟合的平面不是最优的情况。此时就需要根据自己的实际使用情况&#xff0c;调整平面拟合的迭代次数以及收敛条件。 使用RAN…

浏览器工作原理与实践--调用栈:为什么JavaScript代码会出现栈溢出

在上篇文章中&#xff0c;我们讲到了&#xff0c;当一段代码被执行时&#xff0c;JavaScript引擎先会对其进行编译&#xff0c;并创建执行上下文。但是并没有明确说明到底什么样的代码才算符合规范。 那么接下来我们就来明确下&#xff0c;哪些情况下代码才算是“一段”代码&am…

TheMoon 恶意软件短时间感染 6,000 台华硕路由器以获取代理服务

文章目录 针对华硕路由器Faceless代理服务预防措施 一种名为"TheMoon"的新变种恶意软件僵尸网络已经被发现正在侵入全球88个国家数千台过时的小型办公室与家庭办公室(SOHO)路由器以及物联网设备。 "TheMoon"与“Faceless”代理服务有关联&#xff0c;该服务…

46秒AI生成真人视频爆火,遭在线打假「换口型、声音」

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站 每天给大家更新可用的国内可用chatGPT资源 更多资源欢迎关注 是炒作还是真正的 AI 视频能力进化&#xff1f; AI 生成视频已经发展到这个程度了吗&#xff1f; 前段时间&#xff0c;英国王室凯特…

每天能提醒自己做事的app有哪个?

在忙碌的日常生活和工作中&#xff0c;我们时常面临各种任务和琐事。一旦处理不及时&#xff0c;很容易导致遗忘&#xff0c;进而给自己带来不必要的麻烦和损失。因此&#xff0c;拥有一款能够高效提醒我们做事的提醒app显得尤为重要。 敬业签就是这样一款实用的提醒软件。它不…

零基础10 天入门 Web3之第1天

10 天入门 Web3 Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&#xff0c;可帮助大家入门 Web3&#xff1a; 想要一起探讨学习的…

【氮化镓】位错对氮化镓(GaN)电子能量损失谱(EEL)的影响

本文献《Influence of dislocations on electron energy-loss spectra in gallium nitride》由C. J. Fall等人撰写&#xff0c;发表于2002年。研究团队通过第一性原理计算&#xff0c;探讨了位错对氮化镓&#xff08;GaN&#xff09;电子能量损失谱&#xff08;EEL&#xff09;…

python——修改注册表

如图&#xff1a;想要修改Public的值为2.2.1.1 import winreg# 定义要修改的键和新值 key_path rSOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList key_name Public new_name 2.2.1.1# 打开指定的键 # 注意此处是注册表路径拼接&#xff0c;此处是HKEY_LOCAL_MACH…

docker部署ubuntu

仓库&#xff1a; https://hub.docker.com/search?qUbuntu 拉一个Ubuntu镜像 docker pull ubuntu:18.04 查看本地镜像&#xff1a; docker images 运行容器 docker run -itd --name ubuntu-18-001 ubuntu:18.04 通过ps命令可以查看正在运行的容器信息 docker ps 进入容器 最…

Obsidian插件:增加目录栏 flating toc

一、插件介绍 增加目录栏 插件市场搜索 flating toc安装即可 二、使用 写文档时候可以看到左边默认出现目录 可以自己配置一些相关设置 最后也可以安装一下插件样式设置插件&#xff0c;自己按照自己喜好调整