箭头的射弹运动:根据用户的目标改变轨迹
Projectile Motion of Arrow: Altered trajectory based on User's Aim
我正在制作一款需要 "arrow" 从固定位置(设定坐标)射击的游戏。箭头的轨迹基于用户在 GUI 中单击的位置。这本质上是一个瞄准功能。我无法让箭头跟随工作路径,即使用的任何方程式都导致了奇怪的、故障的和错误的结果。
public class ReShoot implements ActionListener
{
public void actionPerformed(ActionEvent e){
ArrowShoot shoot = new ArrowShoot();
shoot.ReShoot();
}
}
public class ArrowShoot implements ActionListener
{
public Timer T = new Timer(5, this);
Arrow A = new Arrow();
public void ReShoot(){
T.start();
arrow_x=0;
arrow_y=200;
A.setBounds(0,200,10,10);
}
// MAIN: y=-16t^2 + Vy * t + h
//Vy = v * sin(a)
//Vx = v * cos(a)
//a = arctan( (200-mouse_y)/v
//v = Mouse_x - Arrow_x
//t = x / Vx
public void actionPerformed(ActionEvent e)
{//arrow_y = 0.0025 * Math.pow((mouse_x-arrow_x), 2)+ mouse_y;
Container container_arrow = getContentPane();
container_arrow.setLayout(null);
container_arrow.add(A);
A.setBounds(0,200,10,10);
arrow_x++;
double v = mouse_x/2; //height change
double a = 50* Math.atan((200-mouse_y) / (v));
double Vy = v * Math.sin(a);
double Vx = v * Math.cos(a);
double t = arrow_x/Vx;
double h = 200;
arrow_y = (16) * Math.pow(t, 2) + (Vy * t) + h;
int x = (int)Math.round(arrow_x);
int y = (int)Math.round(arrow_y);
A.setBounds(x, y,10,10);
if (arrow_y>=500)
T.stop();
}
我很确定我做错了,必须有更有效的方法来完成这项任务。
您似乎没有正确计算轨迹路径。在 actionPerformed
中,您正在递增箭头的 x
坐标,然后计算相应的 y
。这根本行不通,因为即使您可以计算 y
作为 x
的函数,x
本身也是 t
(时间)的函数。因此,您必须在时间 t
计算 x
,而不是假设 x
将 总是 在下一次调用时增加 1
。
鉴于您可以计算角度,您可以使用以下公式计算 x
和 y
的位置作为时间和角度的函数:
所以你的算法基本上是:
time++; //time variable that you maintain
arrow_x = ... //calculate using (1)
arrow_y = ... //calculate using (2)
我正在制作一款需要 "arrow" 从固定位置(设定坐标)射击的游戏。箭头的轨迹基于用户在 GUI 中单击的位置。这本质上是一个瞄准功能。我无法让箭头跟随工作路径,即使用的任何方程式都导致了奇怪的、故障的和错误的结果。
public class ReShoot implements ActionListener
{
public void actionPerformed(ActionEvent e){
ArrowShoot shoot = new ArrowShoot();
shoot.ReShoot();
}
}
public class ArrowShoot implements ActionListener
{
public Timer T = new Timer(5, this);
Arrow A = new Arrow();
public void ReShoot(){
T.start();
arrow_x=0;
arrow_y=200;
A.setBounds(0,200,10,10);
}
// MAIN: y=-16t^2 + Vy * t + h
//Vy = v * sin(a)
//Vx = v * cos(a)
//a = arctan( (200-mouse_y)/v
//v = Mouse_x - Arrow_x
//t = x / Vx
public void actionPerformed(ActionEvent e)
{//arrow_y = 0.0025 * Math.pow((mouse_x-arrow_x), 2)+ mouse_y;
Container container_arrow = getContentPane();
container_arrow.setLayout(null);
container_arrow.add(A);
A.setBounds(0,200,10,10);
arrow_x++;
double v = mouse_x/2; //height change
double a = 50* Math.atan((200-mouse_y) / (v));
double Vy = v * Math.sin(a);
double Vx = v * Math.cos(a);
double t = arrow_x/Vx;
double h = 200;
arrow_y = (16) * Math.pow(t, 2) + (Vy * t) + h;
int x = (int)Math.round(arrow_x);
int y = (int)Math.round(arrow_y);
A.setBounds(x, y,10,10);
if (arrow_y>=500)
T.stop();
}
我很确定我做错了,必须有更有效的方法来完成这项任务。
您似乎没有正确计算轨迹路径。在 actionPerformed
中,您正在递增箭头的 x
坐标,然后计算相应的 y
。这根本行不通,因为即使您可以计算 y
作为 x
的函数,x
本身也是 t
(时间)的函数。因此,您必须在时间 t
计算 x
,而不是假设 x
将 总是 在下一次调用时增加 1
。
鉴于您可以计算角度,您可以使用以下公式计算 x
和 y
的位置作为时间和角度的函数:
所以你的算法基本上是:
time++; //time variable that you maintain
arrow_x = ... //calculate using (1)
arrow_y = ... //calculate using (2)