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

这篇具有很好参考价值的文章主要介绍了将游戏坐标转化成屏幕鼠标坐标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

思路说明:转化其实是取得两点的相对位置,例如将游戏人物移动到另外一个位置(游戏人物初始位置坐标到目的位置坐标),鼠标需要移动到屏幕的某个位置。算出游戏的移动距离,游戏两个点之间的夹角(cos,sin),然后映射到屏幕中的两个点。
注意:需要提前算出游戏两点距离对应屏幕两点间距离的比例(游戏距离/屏幕两点距离),只是针对第一人称,人物固定屏幕类游戏文章来源地址https://www.toymoban.com/news/detail-645990.html

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() {
                @Override
                public 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,524
        double 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);
    }

到了这里,关于将游戏坐标转化成屏幕鼠标坐标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt音视频开发37-识别鼠标按下像素坐标

    在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询

    2023年04月16日
    浏览(32)
  • Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

    通过在通道画面上拾取鼠标按下的坐标,然后鼠标移动,直到松开,根据松开的坐标和按下的坐标,绘制一个矩形区域,作为热点或者需要电子放大的区域,拿到这个坐标区域,用途非常多,可以直接将区域中的画面放大,也可以将该圈起来的区域位置发给设备,由设备设定

    2024年02月03日
    浏览(38)
  • Qt/C++音视频开发37-识别鼠标按下像素坐标

    在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询

    2024年02月11日
    浏览(31)
  • 小程序腾讯坐标高德坐标之间转化

    要在JavaScript中使用 coordtransform 库将腾讯坐标(GCJ02)与高德坐标(火星坐标,也是GCJ02)进行转换,你可以按照以下示例代码进行操作: javascript复制代码 // 引入coordtransform库 const coordtransform = require(\\\'coordtransform\\\'); // 定义腾讯坐标(GCJ02)经纬度 const tencentLng = 113.123456; const

    2024年02月12日
    浏览(30)
  • 极坐标转化

    在数学中,极坐标系是一个二维坐标系统。该坐标系统中任意位置可由一个夹角和一段相对原点—极点的距离来表示。极坐标系的应用领域十分广泛,包括数学、物理、工程、航海、航空以及机器人领域。 两点间的关系用夹角和距离很容易表示时,极坐标系便显得尤为有用;

    2024年02月09日
    浏览(29)
  • UE5 坐标转化

    一、先附上UE官方有关坐标空间的介绍:坐标空间术语 二、在C++中进行坐标转化,直接附上代码:

    2024年02月15日
    浏览(22)
  • 高德地图 其他地图坐标系转化为高德坐标系

    此篇以百度地图为例  1、去高德地图注册自己的key(注册流程可借鉴百度地图注册流程) 2、什么是坐标 地球坐标系——WGS84:常见于 GPS 设备,Google 地图等国际标准的坐标体系。 火星坐标系——GCJ-02:中国国内使用的被强制加密后的坐标体系,高德坐标就属于该种坐标体系

    2024年02月08日
    浏览(32)
  • 虚幻引擎游戏开发过程中,游戏鼠标如何双击判定?

    UE虚幻引擎对于游戏开发者来说都不陌生,市面上有47%主机游戏使用虚幻引擎开发游戏。作为是一款游戏的核心动力,它的功能十分完善,囊括了场景制作、灯光渲染、动作镜头、粒子特效、材质蓝图等。本文介绍了虚幻引擎游戏开发过程中游戏鼠标双击判定,一起来看看吧

    2024年02月13日
    浏览(35)
  • 高德地图与百度地图坐标相互转化

    1. WGS-84原始坐标系 ,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用; 2. GCJ-02坐标系 ,又名“火星坐标系

    2024年02月16日
    浏览(32)
  • C#开发的OpenRA游戏的游戏界面内鼠标处理窗口

    C#开发的OpenRA游戏的游戏界面内鼠标处理窗口 OpenRA游戏里,游戏上面所有物品显示,都是基于窗口容器。 前面也讨论过,其实就是基于ingame.yaml文件来布局和创建的, 在ingame.yaml文件里,根窗口Container@INGAME_ROOT,共有六个子节点: Children:     LogicKeyListener@GLOBAL_KEYHANDLER:   

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包