将游戏坐标转化成屏幕鼠标坐标
将游戏坐标转化成屏幕鼠标坐标
思路说明:转化其实是取得两点的相对位置,例如将游戏人物移动到另外一个位置(游戏人物初始位置坐标到目的位置坐标),鼠标需要移动到屏幕的某个位置。算出游戏的移动距离,游戏两个点之间的夹角(cos,sin),然后映射到屏幕中的两个点。
注意:需要提前算出游戏两点距离对应屏幕两点间距离的比例(游戏距离/屏幕两点距离),只是针对第一人称,人物固定屏幕类游戏
1.获取鼠标在屏幕的坐标
package com.company;import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;public class MouseInfo extends JFrame {private final JPanel contentPanel = new JPanel();JLabel value_x = null;JLabel value_y = null;/*** 展示画布,显示鼠标坐标*/public static void getMouse() {try {MouseInfo info_frame = new MouseInfo();info_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);info_frame.setVisible(true);info_frame.setAlwaysOnTop(true);Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {Point point = java.awt.MouseInfo.getPointerInfo().getLocation();info_frame.value_x.setText("" + point.x);info_frame.value_y.setText("" + point.y);}}, 100, 100);} catch (Exception e) {e.printStackTrace();}}/*** Create the dialog.*/public MouseInfo() {setTitle("\u9F20\u6807\u5750\u6807\u83B7\u53D6\u5668");setBounds(100, 100, 217, 156);getContentPane().setLayout(new BorderLayout());contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));getContentPane().add(contentPanel, BorderLayout.CENTER);contentPanel.setLayout(null);JLabel lblx = new JLabel("\u5750\u6807x:");lblx.setFont(new Font("宋体", Font.PLAIN, 15));lblx.setBounds(22, 27, 66, 31);contentPanel.add(lblx);JLabel lbly = new JLabel("\u5750\u6807y:");lbly.setFont(new Font("宋体", Font.PLAIN, 15));lbly.setBounds(22, 68, 66, 31);contentPanel.add(lbly);value_x = new JLabel("0");value_x.setForeground(Color.BLUE);value_x.setFont(new Font("宋体", Font.PLAIN, 20));value_x.setBounds(82, 27, 66, 31);contentPanel.add(value_x);value_y = new JLabel("0");value_y.setForeground(Color.BLUE);value_y.setFont(new Font("宋体", Font.PLAIN, 20));value_y.setBounds(82, 68, 66, 31);contentPanel.add(value_y);}
}
2.坐标操作工具方法
/*** 获取两个点距离* @param lat1 第一个位置的x* @param lon1 第一个位置的y* @param lat2 第二个位置的x* @param lon2 第二个位置的y* @return 两点之间的距离*/public static double distance(double lat1, double lon1, double lat2, double lon2){double D=Math.sqrt((lat2-lat1)*(lat2-lat1)+(lon2-lon1)*(lon2-lon1));return D;}/*** 获取两点之间的sin 值* @param lat1 第一个位置的x* @param lon1 第一个位置的y* @param lat2 第二个位置的x* @param lon2 第二个位置的y* @return*/public static double getSin(double lat1, double lon1, double lat2, double lon2){double sin=Math.abs(lon2-lon1)/distance(lat1,lon1,lat2,lon2);return sin;}/*** 获取两点之间的cos 值* @param lat1 第一个位置的x* @param lon1 第一个位置的y* @param lat2 第二个位置的x* @param lon2 第二个位置的y* @return*/public static double getCos(double lat1, double lon1, double lat2, double lon2){double cos=Math.abs(lat2-lat1)/distance(lat1,lon1,lat2,lon2);return cos;}/*** 获取第二个位置坐标* @param lat1* @param lon1* @param sin* @param cos* @param distance*/public static void getPointTow(double lat1, double lon1 ,double sin ,double cos,double distance){double lon2=distance*sin+lon1;double lat2=distance*cos+lat1;System.out.println("第二个坐标x:"+lat2 +";y:"+lon2);}
3.计算游戏对应的屏幕坐标
public static void main(String[] args) {MouseInfo.getMouse();//假如已经算出游戏与屏幕两点距离的比例是3 (游戏距离/屏幕距离=3)Double scale=3d;Double value_x=1372d;double value_y=524d;//假如游戏人物当前所在的游戏位置是902,302 ,想移动到1372,524double distance=distance(902,302,value_x,value_y);double sin=getSin(902,302,value_x,value_y);double cos=getCos(902,302,value_x,value_y);//人物固定在屏幕的中间,假如屏幕坐标1033,415 ,算出游戏人物要移动到游戏1372,524所在的屏幕坐标。getPointTow(1033,415,sin,cos,distance/scale);// write your code here}/*** 获取两个点距离* @param lat1 第一个位置的x* @param lon1 第一个位置的y* @param lat2 第二个位置的x* @param lon2 第二个位置的y* @return 两点之间的距离*/public static double distance(double lat1, double lon1, double lat2, double lon2){double D=Math.sqrt((lat2-lat1)*(lat2-lat1)+(lon2-lon1)*(lon2-lon1));return D;}/*** 获取两点之间的sin 值* @param lat1 第一个位置的x* @param lon1 第一个位置的y* @param lat2 第二个位置的x* @param lon2 第二个位置的y* @return*/public static double getSin(double lat1, double lon1, double lat2, double lon2){double sin=Math.abs(lon2-lon1)/distance(lat1,lon1,lat2,lon2);return sin;}/*** 获取两点之间的cos 值* @param lat1 第一个位置的x* @param lon1 第一个位置的y* @param lat2 第二个位置的x* @param lon2 第二个位置的y* @return*/public static double getCos(double lat1, double lon1, double lat2, double lon2){double cos=Math.abs(lat2-lat1)/distance(lat1,lon1,lat2,lon2);return cos;}/*** 获取第二个位置坐标* @param lat1* @param lon1* @param sin* @param cos* @param distance*/public static void getPointTow(double lat1, double lon1 ,double sin ,double cos,double distance){double lon2=distance*sin+lon1;double lat2=distance*cos+lat1;System.out.println("第二个坐标x:"+lat2 +";y:"+lon2);}
相关文章:
将游戏坐标转化成屏幕鼠标坐标
将游戏坐标转化成屏幕鼠标坐标 思路说明:转化其实是取得两点的相对位置,例如将游戏人物移动到另外一个位置(游戏人物初始位置坐标到目的位置坐标),鼠标需要移动到屏幕的某个位置。算出游戏的移动距离,游戏…...
springboot中Instant时间传参及序列化
在部分场景中,后台的时间属性用的不是Date或Long,而是Instant,Java8引入的一个精度极高的时间类型,可以精确到纳秒,但实际使用的时候不需要这么高的精确度,通常到毫秒就可以了。 而在前后端传参的时候需要…...
nacos安装与启动相关问题(启动闪退和显示此站点的连接不安全)
问题:启动闪退 尝试: 使用记事本打开cmd文件,在文件结尾处新增两行 pause endlocal 如果还有问题:ERROR Nacos failed to start, please see D:\dev\nacos\logs\nacos.log for more details 尝试: 在nacos的bin目…...
51单片机学习--DS18B20温度读取温度报警器
需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数 先根据原理图做好端口的声明: sbit OneWire_DQ P3^7;接下来像之前一样把时序结构用代码模拟出来: unsigned char OneWire_Init(void) {unsigned char i;unsigned char Ac…...
PYTHON专栏
PYTHON专栏 python基础教程 python基础教程 Python练手算法 Python练手算法 Python设计模式 Python设计模式 MySQL教程 MySQL教程 ORM框架SQLAlchemy Python ORM框架SQLAlchemy Python Web框架Django Python Web框架Django Web框架FastAPI Web框架FastAPI http库request…...
从初学者到专家:Java运算符的完整指南
目录 1.算数运算符 2.增量运算符 2.1自增/自减运算符 4. 逻辑运算符 5.位运算符 6.移位运算符 7. 条件运算符 导言: Java作为一门广泛使用的编程语言,其运算符是编写代码时必不可少的一部分。本篇博客将为你详细介绍Java中的各种运算符…...
Linux:shell脚本:基础使用(3)
for循环语句 语句格式 for for变量 in 取值列表(可以是变量或者自己定义) do 循环内容 done 工作方式就是通过取值列表去判断循环的次数,每次循环的同时把列表一行的值赋予到for变量。取值方式如果是数字,那就通过数字去…...
opencv基础46-图像金字塔02-拉普拉斯金字塔
前面我们介绍了高斯金字塔,高斯金字塔是通过对一幅图像一系列的向下采样所产生的。有时,我们希望通过对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像,这时就需要用到拉普拉斯金字塔 前面我们已经介绍过,一幅图像在…...
到 2030 年API 攻击预计将激增近 1000%
导读云原生应用程序编程接口管理公司 Kong 联合外部经济学家的最新研究预计,截至 2030 年 API 攻击将激增 996%,意味着与 API 相关的网络威胁的频率和强度都显着升级。 这项研究由 Kong 分析师和布朗大学副教授 Christopher Whaley 博士合作进行&#x…...
环形队列+DMA空闲中断+接收串口数据
环形队列DMA空闲中断接收串口数据 一.序言二.实验原理三.实战是检验真理的唯一标准3.1 usart1.c3.2 串口中断 三.队列代码4.1 fifo.c4.2 fifo.h 五.结语 一.序言 本次实验利用环形队列DMA空闲中断串口。。通过这个实验可以非常深入的理解队列,DMA,串口的知识。如果…...
LeetCode 31题:下一个排列
目录 题目 思路 代码 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序…...
CMake:检测python模块和包
CMake:检测python模块和包 导言项目结构CMakeLists.txt相关源码 导言 上一篇,我们基本了解了如何去检测python的解释器和python库。通常,代码是依赖于特定的python模块,无论是python工具、嵌入python的程序,还是扩展python的库。…...
02Mysql之多表查询--例题讲解
一、题目详情,以及表的建立 新增员工表emp和部门表deptcreate table dept (dept1 int ,dept_name varchar(11));create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);insert into dept values(101,财务),(102,销售)…...
虹科方案 | 汽车总线协议转换解决方案
汽车总线: 汽车总线是一种用于在车辆电子系统中传输数据和控制信息的通信系统。它允许不同的电子控制单元(ECU)在车辆中相互通信,协调各个系统的操作,以实现功能的集成和协同工作。 在现代汽车中,综合通信…...
Mr. Cappuccino的第59杯咖啡——简单手写SpringIOC框架
简单手写SpringIOC框架 环境搭建基于XML方式项目结构项目代码运行结果 基于注解方式项目结构项目代码运行结果 简单手写SpringIOC框架核心原理基于XML方式原理项目结构项目代码运行结果 基于注解方式原理项目结构项目代码运行结果 环境搭建 基于XML方式 项目结构 项目代码 p…...
爬虫 学习HTML标签和元素的基本概念,了解网页的结构和内容
HTML(Hypertext Markup Language)是一种用于创建网页的标记语言,由一系列的标签组成。标签使用尖括号(< 和 >)包围,并且通常成对出现,一个是开始标签,一个是结束标签。 HTML文…...
mysql将id重新修改为递增
文章目录 场景解决,排序的话可以先按照一定大小改一下,然后将id字段删掉,再重新生成即可清空表数据,并将自增id改为1开始 场景 好比我有个配置表: CREATE TABLE config (id int NOT NULL AUTO_INCREMENT,config_key varchar(20) NOT NULL,config_value varchar(500) NOT NU…...
http、https笔记
目录 HTTP 基本概念状态码:get和post的区别:http 常⻅字段:http的缺点: HTTP/1.1HTTP/3HTTPSHTTPS和HTTP区别对称加密和⾮对称加密⾮对称加密 HTTP 基本概念 状态码: 1xx 中间状态,比如post的continue 20…...
飞凌嵌入式「国产」嵌入式核心板大盘点(三)——龙芯中科、赛昉科技
为了帮助各位工程师朋友详细了解飞凌嵌入式推出的“国产化”产品,小编专门开设了「国产平台大盘点专题」。上周,已经带大家盘点了飞凌嵌入式联合瑞芯微电子和全志科技两个国产处理器品牌打造的平台,今天,将继续为大家介绍龙芯和赛…...
以vue2为例,用npm开发环境在后端部署vue2项目(更推荐使用nginx部署)
因为之前一致出现的跨域问题,从而想到了这个办法,属于偏方。推荐使用nginx部署,再去解决跨域问题。 接下来聊一聊本文所使用的方法。 首先将你的前端vue项目拷贝一份到服务器,准备一个dockerfile文件,用这个进行部署首…...
Windows和Office激活终极指南:KMS_VL_ALL_AIO一站式智能解决方案
Windows和Office激活终极指南:KMS_VL_ALL_AIO一站式智能解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经面对Windows激活弹窗感到束手无策?或者为Offi…...
单细胞数据“质检员”指南:拿到表达矩阵后,你的第一件事应该是检查这些
单细胞数据质检实战指南:从表达矩阵到可靠分析的五大检查点 当你第一次拿到单细胞RNA测序的表达矩阵时,那种兴奋感可能让你想立刻开始聚类分析和可视化。但作为一名严谨的研究者,按下暂停键进行系统质检(QC)才是明智之举。我曾见过太多案例因…...
ARM架构CNTHPS_TVAL定时器寄存器详解与应用
1. ARM架构中的定时器系统寄存器概述在ARMv8/v9架构中,定时器系统寄存器是处理器与操作系统交互的关键硬件接口,它们为系统提供了精确的时间管理和事件触发能力。作为嵌入式开发者,我们需要深入理解这些寄存器的运作机制,特别是在…...
SwiftyCam手势交互指南:捏合变焦、滑动变焦、双击切换摄像头
SwiftyCam手势交互指南:捏合变焦、滑动变焦、双击切换摄像头 【免费下载链接】SwiftyCam A Snapchat Inspired iOS Camera Framework written in Swift 项目地址: https://gitcode.com/gh_mirrors/sw/SwiftyCam SwiftyCam是一款受Snapchat启发的iOS相机框架&…...
Java函数式编程终极指南:Lambda与Stream API实战详解
Java函数式编程终极指南:Lambda与Stream API实战详解 【免费下载链接】JavaGuide Java 面试 & 后端通用面试指南,覆盖计算机基础、数据库、分布式、高并发、系统设计与 AI 应用开发 项目地址: https://gitcode.com/gh_mirrors/ja/JavaGuide J…...
MedGemma 1.5保姆级教程:无需联网,6006端口快速启动本地医疗AI
MedGemma 1.5保姆级教程:无需联网,6006端口快速启动本地医疗AI 你是不是也有过这样的经历?身体有点不舒服,想上网查查资料,结果要么被一堆广告淹没,要么看到各种吓人的说法,越看心里越没底。想…...
MIL-STD-1553B军用数据总线协议详解与应用实践
1. MIL-STD-1553B协议深度解析1.1 军用数据总线的技术演进在20世纪50-60年代,航空电子系统采用简单的独立模拟系统架构,各子系统通过点对点布线连接。这种架构导致飞机内部布线复杂,重量增加,后期系统集成困难。随着数字技术的兴起…...
Python代码质量优化:从基础到进阶的工程实践
## 1. 为什么需要关注Python代码质量刚接触Python时,我们往往只关注功能实现。直到某天接手一个3000行的脚本,发现修改一个参数需要追踪8个嵌套函数调用,这才意识到好代码的价值。Python作为动态类型语言,其灵活性既是优势也是陷阱…...
视频生成模型技术解析与NeMo框架实践
1. 视频生成模型的行业变革与挑战过去一年里,视频生成技术正在经历从实验室研究到产业应用的跨越式发展。作为从业者,我亲眼见证了这项技术如何从简单的视频插帧发展到能够生成连贯的分钟级视频内容。在机器人训练、自动驾驶仿真和影视预制作等领域&…...
告别Burp Intruder!用Yakit的Web Fuzzer标签语法,5分钟搞定密码爆破与路径遍历
告别Burp Intruder!用Yakit的Web Fuzzer标签语法,5分钟搞定密码爆破与路径遍历 在渗透测试领域,Burp Suite的Intruder模块长期以来被视为Web应用安全测试的黄金标准。但任何资深安全工程师都清楚,Intruder的配置流程——从标记位置…...
