将游戏坐标转化成屏幕鼠标坐标

将游戏坐标转化成屏幕鼠标坐标

思路说明:转化其实是取得两点的相对位置,例如将游戏人物移动到另外一个位置(游戏人物初始位置坐标到目的位置坐标),鼠标需要移动到屏幕的某个位置。算出游戏的移动距离,游戏两个点之间的夹角(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);}

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

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

相关文章

SpringBoot3文件管理

标签:上传.下载.Excel.导入.导出; 一、简介 在项目中,文件管理是常见的复杂功能; 首先文件的类型比较多样,处理起来比较复杂,其次文件涉及大量的IO操作,容易引发内存溢出; 不同的…

linux软件安装篇

文章目录 linux软件安装篇配置yum源访问nginx服务页面如何运行一个淘宝网在你的机器上修改nginx的首页 linux软件安装篇 linux是纯黑屏的 学习使用yum工具,安装应用程序 阿里云的yum仓库,https://developer.aliyun.com/mirror/ 阿里云非常丰富且强大…

redis的配置和使用、redis的数据结构以及缓存遇见的常见问题

目录 1.缓存 2.redis不仅仅可以做缓存,只不过说他的大部分场景,是做缓存。本地缓存重启后缓存里的东西就没有了,但是redis有。 3.redis有几个特性:查询快,但是是放到内存里的〈断电或者重启,数据就丢了)&#xff0c…

Vue组件化开发思想;Vue的全局组件;Vue的局部组件;Vue的开发模式和解析;Vue CLI安装和使用;Vue项目的创建方式–Vite

目录 1_Vue组件化开发思想1.1_认识组件化开发1.2_Vue的组件化1.3_注册组件的方式 2_Vue的全局组件3_Vue的局部组件4_Vue的开发模式和解析4.1_Vue的开发模式4.2_单文件的特点4.3_如何支持SFC4.4_VSCode对SFC文件的支持 5_Vue CLI安装和使用5.1_Vue CLI脚手架5.2_Vue CLI 安装和使…

基于react-native的简单消息确认框showModel

基于react-native的简单消息确认框showModel 效果示例图组件代码ShowModel/index.jsx使用案例device.js安装线性渐变色 效果示例图 组件代码ShowModel/index.jsx import React, {forwardRef, useImperativeHandle, useState} from react; import {View,Text,Modal,TouchableOp…

整合封装服务器模块设计实现

服务器模块,是对当前所实现的所有模块的⼀个整合,并进⾏服务器搭建的⼀个模块,最终封装实现出⼀个gobang_server的服务器模块类,向外提供搭建五⼦棋对战服务器的接⼝。通过实例化的对象可以简便的完成服务器的搭建。 服务器框架 …

DNS、ARP

目录 DNS以及它的用途 DNS的解析方式 DNS的查询方式 DNS使用TCP/UDP DNS劫持 常见的DNS劫持现象 DNS劫持与HTTP劫持的不同 处理DNS劫持 DNS缓存 DNS实现负载均衡 ARP以及他的工作原理 DNS以及它的用途 DNS是域名解析服务器,用来将域名解析成IP。DNS工作在…

金九银十面试题之《JUC》

🐮🐮🐮 辛苦牛,掌握主流技术栈,包括前端后端,已经7年时间,曾在税务机关从事开发工作,目前在国企任职。希望通过自己的不断分享,可以帮助各位想或者已经走在这条路上的朋友…

Linux | Ubuntu18.04安装RTX 4060显卡驱动完整教程

文章目录 概述一、定义介绍二、操作教程(一)、前期准备1.进入终端界面2.关闭界面显示器3.禁用其他显卡驱动4.卸载残余显卡驱动5.下载驱动(二)、安装驱动1.给驱动程序赋予权限2.安装驱动3.检查结果(三)、后续问题1.黑屏问题概述 本节详细介绍了如何在ubuntu18系统安装4060显卡的…

pnpm的高级使用

我整理了一些pnpm的高级使用: 并行安装:pnpm通过并行安装依赖项来提高安装速度。默认情况下,它会使用计算机的最大线程数来并行安装依赖项。你也可以使用--recursive选项来并行安装所有子项目的依赖项。 冻结依赖:pnpm支持将依赖…

06微服务间的通信方式

一句话导读 微服务设计的一个挑战就是服务间的通信问题,服务间通信理论上可以归结为进程间通信,进程可以是同一个机器上的,也可以是不同机器的。服务可以使用同步请求响应机制通信,也可以使用异步的基于消息中间件间的通信机制。同…

【云原生|Kubernetes】14-DaemonSet资源控制器详解

【云原生|Kubernetes】14-DaemonSet资源控制器详解 文章目录 【云原生|Kubernetes】14-DaemonSet资源控制器详解简介典型用法DaemonSet语法规则Pod模板Pod 选择算符在选定的节点上运行 Pod DaemonSet的 Pods 是如何被调度的污点和容忍度DaemonSet更新和回滚DaemonSet更新策略执…

MySQL登录成功后密码修改

场景 最近想通过CLI登录一台远古MySQL,结果遇到CLI密码不对,但是,GUI程序之前自动记住密码能够正常登录使用。 思路 通过GUI方式登录,修改密码后,再让新密码生效后,重新使用CLI方式登录MySQL 解决 通过…

Vue2-简介、模板语法、数据绑定、MVVM、数据代理、事件处理

🥔:成功之后就能光明正大地回望所有苦难 VUE-Day1 Vue简介1、Vue是什么?2、谁开发的? 发展历程?3、Vue的特点4、容器和实例、实例中的el和data总结 Vue模板语法插值语法指令语法 数据绑定1.单向数据绑定(v-…

51单片机学习--DS18B20温度读取温度报警器

需要先编写OneWire模块,再在DS18B20模块中调用OneWire模块的函数 先根据原理图做好端口的声明: sbit OneWire_DQ P3^7;接下来像之前一样把时序结构用代码模拟出来: unsigned char OneWire_Init(void) {unsigned char i;unsigned char Ac…

opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以…

Towards Open World Object Detection【论文解析】

Towards Open World Object Detection 摘要1 介绍2 相关研究3 开放世界目标检测4 ORE:开放世界目标检测器4.1 对比聚类4.2 RPN自动标注未知类别4.3 基于能量的未知标识4.4 减少遗忘 5 实验5.1开放世界评估协议5.2 实现细节5.3 开放世界目标检测结果5.4 增量目标检测结果 6 讨论…

javaweb监听器和juery技术

监听servlet创建 package com.hspedu.listener;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;/*** 老韩解读* 1. 当一个类实现了 ServletContextListener* 2. 该类就是一个监听器* 3. 该类可…

VoxWeekly|The Sandbox 生态周报|20230807

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布,对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容,欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter,并加入 Discord 社区&#xf…

OpenCV和PIL图像对象转换

OpenCV和PIL(Python Imaging Library)都是常用的Python图像处理库。它们都有自己的图像对象类型,因此在使用它们时需要进行相应的转换。 下面是OpenCV图像对象和PIL图像对象之间的转换方法: 将OpenCV图像对象转换为PIL图像对象&…