Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇游戏,弹跳&;运动_Java_Geometry_2d_Trigonometry - Fatal编程技术网

Java 爪哇游戏,弹跳&;运动

Java 爪哇游戏,弹跳&;运动,java,geometry,2d,trigonometry,Java,Geometry,2d,Trigonometry,我试图创建一个简单的游戏库,主要是为了自学。我在这里和网上读了一些帖子。但我觉得我的问题有点不同,因为我用的是我自己的逻辑 基础知识: 我在屏幕上的所有对象都称为“实体”,它们能够实现一个名为“EntityActionListener”的界面,该界面允许与鼠标、键盘交互,在屏幕上移动等 如何以最佳方式移动实体? 想法: 首先,我想实现实体的移动,然后是反弹,然后是碰撞 对于移动和反弹,这就是我遇到的问题,我需要以下变量和函数: protected float posx = 0, posy = 0

我试图创建一个简单的游戏库,主要是为了自学。我在这里和网上读了一些帖子。但我觉得我的问题有点不同,因为我用的是我自己的逻辑

基础知识:

我在屏幕上的所有对象都称为“实体”,它们能够实现一个名为“EntityActionListener”的界面,该界面允许与鼠标、键盘交互,在屏幕上移动等

如何以最佳方式移动实体?

想法:

首先,我想实现实体的移动,然后是反弹,然后是碰撞

对于移动和反弹,这就是我遇到的问题,我需要以下变量和函数:

protected float posx = 0, posy = 0;
protected float v = 0, vx = 0, vy = 0;
protected int direction = 0;
我使用
setVelocity(float arg1)
功能将速度(v)设置为arg1,并更新轴(vx,vy)上的速度:

例如,速度(v)可能会在触发事件中更新。 =>此步骤似乎工作正常

但我在方向上遇到了一些问题,应按如下方式处理:

/**
 * Set the entity direction
 *
 * @param arg1 the direction in degrees
 */
protected final void setDir(int arg1)
{
    // Update direction
    direction = arg1;

    // Update velocity on axis
    setVelocityOnAxis(direction, v);
}

/**
 * Get the enity direction based on the axis
 *
 * @param arg1 the x velocity
 * @param arg2 the y velocity
 */
protected final int getPointDir(float arg1, float arg2)
{
    // Set the direction based on the axis
    return (int) (360 - Math.abs(Math.toDegrees(Math.atan2(arg1, arg2)) % 360));
}
我想在帧的边界上有一个反弹,所以我通过比较x和y坐标来检查4个方向,并根据其相加逆(如1到-1)的边设置vx或vy。但这确实失败了

如果我只是在每一侧更新vx或vy,它会像预期的那样反弹,但由于这个原因,方向没有更新

以下是我使用的代码:

// ...
// Hit bounds on x axis
direction = -vx; // works.
setDir(getPointDir(-vx, vy)); // does not work.
我的几何和三角学不太好。问题是,我无法解释为什么在360度方向上水平速度为1的碰撞会导致45度角或其他我从调试打印中得到的奇怪结果

我真的希望有人能帮我。我就是修不好

编辑:

我的问题是:为什么这不起作用。setDir()或getPointDir()中的某些代码一定是错误的

编辑2

所以,我终于成功了。问题是,实体的方向是45,向下移动,而不是向上移动,所以我对v速度进行了加法求逆-这导致了这个愚蠢的错误,因为负号和负号都是正的,当我弹跳时,它总是改变速度,vx和vy。我只是在计算学位时做了些改变。谢谢您的帮助。

检查。它在轴上具有正确的反弹。你必须认为入射角和出射角一样大,正好相反。文章中的图片描述了这一点。祝你好运。

检查一下。它在轴上具有正确的反弹。你必须认为入射角和出射角一样大,正好相反。文章中的图片描述了这一点。祝你好运。

也许这就是你要找的。。。(仍然不确定我是否得到您的代码)

getPointDir()
中:

double deg=Math.toDegrees(Math.atan2(arg1,arg2));
如果(度<0)度+=360;
返回(整数)度;
然后像你原来的帖子一样使用setDir(getPointDir(-vx,vy))。

也许这就是你想要的。。。(仍然不确定我是否得到您的代码)

getPointDir()
中:

double deg=Math.toDegrees(Math.atan2(arg1,arg2));
如果(度<0)度+=360;
返回(整数)度;

然后像你原来的帖子一样使用
setDir(getPointDir(-vx,vy))

我猜
getPointDir()
setVelocity()
应该分别从x,y和x,y的角度来计算方向。在这种情况下,下面是getPointDir()的正确行:

一个简单的测试:

public static void main(String[] args) {
    Test t = new Test();

    for (int i = 0; i < 360; i++) {
        t.setVelocityOnAxis(i, 10);
        System.out.println("Angle: " + i + " vx: " + t.vx + " vy: " + t.vy);
        System.out.println("getPointDir: " + t.getPointDir(t.vx, t.vy));
    }

}
publicstaticvoidmain(字符串[]args){
测试t=新测试();
对于(int i=0;i<360;i++){
t、 设置速度轴(i,10);
系统输出打印项次(“角度:+i+”vx:+t.vx+”vy:+t.vy”);
System.out.println(“getPointDir:+t.getPointDir(t.vx,t.vy));
}
}

编辑至于错误,
atan2()
总是
y,x
——使用arg1,arg2以外的变量名称更容易发现。另一个错误是Math.abs逻辑。

我猜测
getPointDir()
setVelocity()
应该分别从x,y和x,y的角度计算方向。在这种情况下,下面是getPointDir()的正确行:

一个简单的测试:

public static void main(String[] args) {
    Test t = new Test();

    for (int i = 0; i < 360; i++) {
        t.setVelocityOnAxis(i, 10);
        System.out.println("Angle: " + i + " vx: " + t.vx + " vy: " + t.vy);
        System.out.println("getPointDir: " + t.getPointDir(t.vx, t.vy));
    }

}
publicstaticvoidmain(字符串[]args){
测试t=新测试();
对于(int i=0;i<360;i++){
t、 设置速度轴(i,10);
系统输出打印项次(“角度:+i+”vx:+t.vx+”vy:+t.vy”);
System.out.println(“getPointDir:+t.getPointDir(t.vx,t.vy));
}
}

编辑至于错误,
atan2()
总是
y,x
——使用arg1,arg2以外的变量名称更容易发现。另一个错误是Math.abs逻辑。

我无法计算出这里的具体问题。如果只是关于三角学,那么堆栈溢出可能不是最合适的地方…真的很困惑代码应该做什么。。。顺便说一句,您还可以为参数指定比
arg1
arg2
更有意义的名称:)每个函数都有许多注释。好吧,你可以改变名字,但这也没关系。除非你真的需要它们,否则我不会用“v”或“direction”,只要记住“vx”和“vy”。很容易从水平或垂直的墙壁上反弹,只需翻转其中一个即可。可以从vx和vy计算v和方向,如:v=hypot(vx,vy),dir=atan2(y,x)。如果你没有做物体对物体的碰撞和反弹,那会很困难,我建议在这种情况下使用物理库。也许你的错误是调用atan2(x,y)而不是atan2(y,x)?我不知道这里的具体问题是什么。如果只是
return (int) (360 + Math.toDegrees(Math.atan2(arg2, arg1))) % 360;
public static void main(String[] args) {
    Test t = new Test();

    for (int i = 0; i < 360; i++) {
        t.setVelocityOnAxis(i, 10);
        System.out.println("Angle: " + i + " vx: " + t.vx + " vy: " + t.vy);
        System.out.println("getPointDir: " + t.getPointDir(t.vx, t.vy));
    }

}