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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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

思路说明转化其实是取得两点的相对位置例如将游戏人物移动到另外一个位置游戏人物初始位置坐标到目的位置坐标鼠标需要移动到屏幕的某个位置。算出游戏的移动距离游戏两个点之间的夹角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() {
                @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);
    }
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6