空洞武士3


能帮到你的话,就给个赞吧 😘


文章目录

  • collisionBox.h
  • collisionLayer.h
  • collisionManager.h

collisionBox.h

#pragma once
#include "collisionLayer.h"
#include "vector2.h"
#include <functional>class CollisionManager;
class CollisionBox {friend CollisionManager;
private://碰撞箱不能随意创建//所有的碰撞箱都由管理器统一管理,没有注册到管理器的碰撞箱毫无意义。CollisionBox() = default;~CollisionBox() = default;
public:void setEnable(bool enable);void setLayerSrc(CollisionLayer layer);void setLayerDst(CollisionLayer layer);void setOnCollide(const std::function<void()>& onCollide);void setPosition(const Vector2& position);void setSize(const Vector2& size);
public:const Vector2& getSize();
private:Vector2 position;Vector2 size;bool enable = true;								//是否开启碰撞std::function<void()> onCollide;				//处理碰撞CollisionLayer layerSrc = None;					//自身碰撞层——被撞CollisionLayer layerDst = None;					//目标碰撞层——撞别人
};void CollisionBox::setEnable(bool enable){this->enable = enable;
}void CollisionBox::setLayerSrc(CollisionLayer layer){layerSrc = layer;
}void CollisionBox::setLayerDst(CollisionLayer layer){layerDst = layer;
}void CollisionBox::setOnCollide(const std::function<void()>& onCollide){this->onCollide = onCollide;
}void CollisionBox::setPosition(const Vector2& position){this->position = position;
}void CollisionBox::setSize(const Vector2& size){this->size = size;
}const Vector2& CollisionBox::getSize(){return size;
}

collisionLayer.h

#pragma onceenum CollisionLayer{None,Player,Enemy
};

collisionManager.h

#pragma once#include "collisionBox.h"
#include <vector>
#include <graphics.h>class CollisionManager {private:CollisionManager() = default;~CollisionManager() = default;public:static CollisionManager* getInstance();			//单例CollisionBox* createCollisionBox();				//工厂void destroyCollisionBox(CollisionBox* collisionBox);void processCollide();							//碰撞检测void debugRender();								//调试渲染private:std::vector<CollisionBox*> collisionBoxs;static CollisionManager* collisionManager;};CollisionManager* CollisionManager::getInstance(){if (!collisionManager)collisionManager = new CollisionManager;return collisionManager;
}inline CollisionBox* CollisionManager::createCollisionBox(){collisionBoxs.push_back(new CollisionBox);
}inline void CollisionManager::destroyCollisionBox(CollisionBox* collisionBox){//从collisionBoxs中移除所有与collisionBox相等的元素collisionBoxs.erase(remove(collisionBoxs.begin(), collisionBoxs.end(), collisionBox), collisionBoxs.end());delete collisionBox;
}inline void CollisionManager::processCollide(){//处理 collisionBox 与 其他碰撞箱的碰撞for (auto& collisionBox : collisionBoxs) {if (!collisionBox->enable || collisionBox->layerDst == None)continue;for (auto& collisionBoxDst : collisionBoxs) {if (collisionBox == collisionBoxDst|| !collisionBoxDst->enable|| collisionBox->layerDst != collisionBoxDst->layerSrc)continue;auto xRightCollisionBox = collisionBox->position.x + collisionBox->size.x;auto xRightCollisionBoxDst = collisionBoxDst->position.x + collisionBoxDst->size.x;auto collisionX = max(xRightCollisionBox, xRightCollisionBoxDst)- min(collisionBox->position.x, collisionBoxDst->position.x)<= collisionBox->size.x + collisionBoxDst->size.x;auto yDownCollisionBox = collisionBox->position.y + collisionBox->size.y;auto yDownCollisionBoxDst = collisionBoxDst->position.y + collisionBoxDst->size.y;auto collisionY = max(yDownCollisionBox, yDownCollisionBoxDst)- min(collisionBox->position.y, collisionBoxDst->position.y)<= collisionBox->size.y + collisionBoxDst->size.y;if (collisionX && collisionY && collisionBox->onCollide)collisionBox->onCollide();}}}inline void CollisionManager::debugRender(){for (auto& collisionBox : collisionBoxs) {setlinecolor(collisionBox->enable ? RGB(295, 155, 155) : RGB(115, 115, 175));//rectangle以position为中心rectangle(collisionBox->position.x - collisionBox->size.x / 2,collisionBox->position.y - collisionBox->size.y / 2,collisionBox->position.x + collisionBox->size.x / 2,collisionBox->position.y + collisionBox->size.y / 2);}
}

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

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

相关文章

Linux网络——IO模型和多路转接

通常所谓的IO&#xff0c;其本质就是等待通信和进行通信&#xff0c;即IO 等 拷贝。 那么想要做到高效的IO&#xff0c;就要在单位时间内&#xff0c;减少“等”的比重。 一.五种IO模型 阻塞 IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方…

VM Virutal Box的Ubuntu虚拟机与windows宿主机之间设置共享文件夹(自动挂载,永久有效)

本文参考如下链接 How to access a shared folder in VirtualBox? - Ask Ubuntu &#xff08;1&#xff09;安装增强功能&#xff08;Guest Additions&#xff09; 首先&#xff0c;在网上下载VBoxGuestAdditions光盘映像文件 下载地址&#xff1a;Index of http://…

AI的魔力:如何为开源软件注入智慧,开启无限可能

“AI的魔力&#xff1a;如何为开源软件注入智慧&#xff0c;开启无限可能” 引言&#xff1a; 在科技发展的浪潮中&#xff0c;开源软件生态一直扮演着推动创新与共享的重要角色。从Linux到Python&#xff0c;开源项目赋予了开发者全球协作的机会&#xff0c;推动了技术的飞速…

IThenticate 查重有无免费午餐?深度解析

经历过论文“折磨”的过来人&#xff0c;深知查重工具是写论文不可或缺的助手。而 iThenticate 查重系统&#xff0c;深受出版商、学术机构和研究人员喜爱。不过&#xff0c;每次看到它那昂贵的价格&#xff0c;就让很多小伙伴直呼&#xff0c;IThenticate查重系统就没有免费的…

启动SpringBoot

前言&#xff1a;大家好我是小帅&#xff0c;今天我们来学习SpringBoot 文章目录 1. 环境准备2. Maven2.1 什么是Maven2.2 创建⼀个Maven项⽬2.3 依赖管理2.3.1 依赖配置2.3.2 依赖传递2.3.4 依赖排除2.3.5 Maven Help插件&#xff08;plugin&#xff09; 2.4 Maven 仓库2.6 中…

DHCP服务(包含配置过程)

目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP&#xff08;Dynamic Host Configur…

使用 Certbot 为 Nginx 自动配置 SSL 证书

1.安装Certbot和Nginx插件 sudo apt-get update sudo apt-get install certbot python3-certbot-nginx 2.获取和安装证书 运行Certbot自动安装SSL证书。注意替换 your_domain sudo certbot --nginx -d your_domain Certbot将自动与Lets Encrypt的服务器通信&#xff0c;验证域…

ros2键盘实现车辆: 简单的油门_刹车_挡位_前后左右移动控制

参考: ROS python 实现键盘控制 底盘移动 https://blog.csdn.net/u011326325/article/details/131609340游戏手柄控制 1.背景与需求 1.之前实现过 键盘控制 底盘移动的程序, 底盘是线速度控制, 效果还不错. 2.新的底盘 只支持油门控制, 使用线速度控制问题比较多, 和底盘适配…

DICOM医学影像应用篇——窗宽窗位概念、原理及实现详解

目录 窗宽窗位调整&#xff08;Windowing&#xff09;在DICOM医学影像中的应用 窗宽窗位的基本概念 窗宽&#xff08;Window Width, WW&#xff09; 窗位&#xff08;Window Level, WL&#xff09; 窗宽窗位调整的基本原理 映射逻辑 数学公式 窗宽窗位调整的C实现 代码…

天锐绿盾加密软件与Ping32联合打造企业级安全保护系统,确保敏感数据防泄密与加密管理

随着信息技术的飞速发展&#xff0c;企业在日常经营过程中产生和处理的大量敏感数据&#xff0c;面临着越来越复杂的安全威胁。尤其是在金融、医疗、法律等领域&#xff0c;数据泄漏不仅会造成企业巨大的经济损失&#xff0c;还可能破坏企业的信誉和客户信任。因此&#xff0c;…

HarmonyOS:@Provide装饰器和@Consume装饰器:与后代组件双向同步

一、前言 Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Provi…

【Spring MVC】如何运用应用分层思想实现简单图书管理系统前后端交互工作

前言 &#x1f31f;&#x1f31f;本期讲解关于SpringMVC的编程思想之应用分层~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那…

【Linux】项目自动化构建工具-make/Makefile

【Linux】项目自动化构建工具-make/Makefile make 和 makefile 的概念如何清理项目推导过程Linux第⼀个小程序−倒计时 &#x1f30f;个人博客主页&#xff1a;个人主页 make 和 makefile 的概念 make是一个命令工具&#xff0c;是一个解释makefile中指令的命令工具&#xf…

arcgis for js点击聚合要素查询其包含的所有要素

功能说明 上一篇讲了实现聚合效果, 但是点击聚合效果无法获取到该聚合点包含的所有点信息 这一篇是对如何实现该功能的案例 实现 各属性说明需要自行去官网查阅 官网案例 聚合API 没空说废话了, 加班到12点,得休息了, 直接运行代码看效果就行, 相关重点和注意事项都在代码注…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示&#xff0c;每个矩阵元素代表一个像素&#xff0c;元素的值代表这个位置图像的亮度&#xff1b;其中&#xff0c;彩色图像使用3维矩阵MN3表示&#xff1b;对于图像显示来说&#xff0c;一般使用无符号8位整数来表示图像亮度&…

javaweb-day03-前端零碎

1.Ajax &#xff08;1&#xff09;概述 &#xff08;2&#xff09;原生Ajax-繁琐&#xff0c;现已基本弃用 2.Ajax-Axios &#xff08;2&#xff09;案例 3.前端工程化 3.1 基础 3.2 vue项目 &#xff08;1&#xff09;项目目录结构 &#xff08;2&#xff09;主要开发…

论文阅读:A Software Platform for Manipulating theCamera Imaging Pipeline

论文代码开源链接&#xff1a; A Software Platform for Manipulating the Camera Imaging Pipelinehttps://karaimer.github.io/camera-pipeline/摘要&#xff1a;论文提出了一个Pipline软件平台&#xff0c;可以方便地访问相机成像Pipline的每个阶段。该软件允许修改单个模块…

Python毕业设计选题:基于django+vue的智能停车系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 车主管理 车辆信息管理 车位信息管理 车位类型管理 系统…

使用phpStudy小皮面板模拟后端服务器,搭建H5网站运行生产环境

一.下载安装小皮 小皮面板官网下载网址&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; 安装说明&#xff08;特别注意&#xff09; 1. 安装路径不能包含“中文”或者“空格”&#xff0c;否则会报错&#xff08;例如错误提示&#xff1a;Cant cha…

【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)

一、服务器上安装jmeter 1、官方下载地址&#xff0c;https://jmeter.apache.org/download_jmeter.cgi 2、服务器上用wget下载 # 更新系统 sudo yum update -y# 安装 wget 以便下载 JMeter sudo yum install wget -y# 下载 JMeter 压缩包&#xff08;使用 JMeter 官方网站的最…