將游戲坐標(biāo)轉(zhuǎn)化成屏幕鼠標(biāo)坐標(biāo)
思路說明:轉(zhuǎn)化其實是取得兩點(diǎn)的相對位置,例如將游戲人物移動到另外一個位置(游戲人物初始位置坐標(biāo)到目的位置坐標(biāo)),鼠標(biāo)需要移動到屏幕的某個位置。算出游戲的移動距離,游戲兩個點(diǎn)之間的夾角(cos,sin),然后映射到屏幕中的兩個點(diǎn)。
注意:需要提前算出游戲兩點(diǎn)距離對應(yīng)屏幕兩點(diǎn)間距離的比例(游戲距離/屏幕兩點(diǎn)距離),只是針對第一人稱,人物固定屏幕類游戲文章來源地址http://www.zghlxwxcb.cn/news/detail-645990.html
1.獲取鼠標(biāo)在屏幕的坐標(biāo)
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;
/**
* 展示畫布,顯示鼠標(biāo)坐標(biāo)
*/
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.坐標(biāo)操作工具方法
/**
* 獲取兩個點(diǎn)距離
* @param lat1 第一個位置的x
* @param lon1 第一個位置的y
* @param lat2 第二個位置的x
* @param lon2 第二個位置的y
* @return 兩點(diǎn)之間的距離
*/
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;
}
/**
* 獲取兩點(diǎn)之間的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;
}
/**
* 獲取兩點(diǎn)之間的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;
}
/**
* 獲取第二個位置坐標(biāo)
* @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("第二個坐標(biāo)x:"+lat2 +";y:"+lon2);
}
3.計算游戲?qū)?yīng)的屏幕坐標(biāo)
public static void main(String[] args) {
MouseInfo.getMouse();
//假如已經(jīng)算出游戲與屏幕兩點(diǎn)距離的比例是3 (游戲距離/屏幕距離=3)
Double scale=3d;
Double value_x=1372d;
double value_y=524d;
//假如游戲人物當(dāng)前所在的游戲位置是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);
//人物固定在屏幕的中間,假如屏幕坐標(biāo)1033,415 ,算出游戲人物要移動到游戲1372,524所在的屏幕坐標(biāo)。
getPointTow(1033,415,sin,cos,distance/scale);
// write your code here
}
/**
* 獲取兩個點(diǎn)距離
* @param lat1 第一個位置的x
* @param lon1 第一個位置的y
* @param lat2 第二個位置的x
* @param lon2 第二個位置的y
* @return 兩點(diǎn)之間的距離
*/
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;
}
/**
* 獲取兩點(diǎn)之間的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;
}
/**
* 獲取兩點(diǎn)之間的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;
}
/**
* 獲取第二個位置坐標(biāo)
* @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("第二個坐標(biāo)x:"+lat2 +";y:"+lon2);
}
文章來源:http://www.zghlxwxcb.cn/news/detail-645990.html
到了這里,關(guān)于將游戲坐標(biāo)轉(zhuǎn)化成屏幕鼠標(biāo)坐標(biāo)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!