物体没有朝正确的方向移动

时间:2014-03-28 17:19:46

标签: java android math libgdx

好吧,我试图做一些简单的物体朝你触摸屏幕的方向移动。

如果我直接触摸物体的西北方向,它会移动到触摸位置的方向。如果我直接触摸物体的东南方向,它也会移动到触摸位置的方向。但是,如果我直接触摸物体的东北方向,它将朝向西南方向移动到相反的方向。如果我直接触摸物体的西南方向,它也会向东北方向移动。

此外,如果我触摸物体的北面,但是向西略微移动一点,它会向西直行一点向北。同样在向北移动一点点向北移动,它向北直接向西移动一点点。其他方向也是如此。

真的,所有方向都有些明显不正确。我也在做一些纸质计算,而且我似乎得到了一些正确的角度,但此时我完全被难倒了。

有谁知道问题可能是什么?

package com.badlogic.androidgames.texasholdem;

import java.util.List;

import android.util.FloatMath;

import com.badlogic.androidgames.framework.Game;
import com.badlogic.androidgames.framework.Graphics;
import com.badlogic.androidgames.framework.Input.TouchEvent;
import com.badlogic.androidgames.framework.Screen;

public class MainMenuScreen extends Screen {
    public static float TO_RADIANS = (1 / 180.0f) * (float) Math.PI;
    public static float TO_DEGREES = (1 / (float) Math.PI) * 180;
    float num_x = 0; // Position of object on X axis
    float num_y = 0; // Position of object on Y axis
    float angle = 0;

    public MainMenuScreen(Game game) {
        super(game);               
    }

    public void update(float deltaTime) {
        Graphics g = game.getGraphics();
        List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
        game.getInput().getKeyEvents();       

        int len = touchEvents.size();
        for(int i = 0; i < len; i++) {
            TouchEvent event = touchEvents.get(i);
            if(event.type == TouchEvent.TOUCH_UP) {
                if(inBounds(event, 0, 0, g.getWidth(), g.getHeight()) ) {

                    // Calculate the angle of the direction between two points
                    angle = (float) Math.atan2(event.x - num_x, event.y - num_y) * TO_DEGREES; 
                    if (angle < 0)
                        angle += 360;

                    // This is just to give me numbers on the Math.atan2 result, angle, to/from X position, and to/from Y position
                    System.out.println("Pressed! - ATAN: " + Math.atan2(event.x - num_x, event.y - num_y)
                        + " - ANGLE:" + angle + " - POS: " + event.x + "tx/"
                        + (int)num_x + "fx " + event.y + "ty/" + (int)num_y + "fy");
                }
            }
        }
        // Moving object in direction at 1f speed
        num_x += (1f * (float) Math.cos(angle * TO_RADIANS));
        num_y += (1f * (float) Math.sin(angle * TO_RADIANS));
    }

    private boolean inBounds(TouchEvent event, int x, int y, int width, int height) {
        if(event.x > x && event.x < x + width - 1 && 
           event.y > y && event.y < y + height - 1) 
            return true;
        else
            return false;
    }

    public void present(float deltaTime) {
        Graphics g = game.getGraphics();

        g.drawPixmap(Assets.background, 0, 0);
        g.drawPixmap(Assets.backcard, (int)num_x, (int)num_y);
    }

    public void pause() {        
        Settings.save(game.getFileIO());
    }

    public void resume() {

    }

    public void dispose() {

    }
}

2 个答案:

答案 0 :(得分:0)

如果事件x&gt; x然后x必须为正以向event.x移动

这里的问题是当event.x&lt; x然后你的移动x必须是负的

int dx,dy;



 dx = (1f * (float) Math.cos(angle * TO_RADIANS));
        dy = (1f * (float) Math.sin(angle * TO_RADIANS));

if(event.x<x){
dx=-dx;}
if(event.y<y){
dy=-dy;}


num_x+=dx;
num_y+=dy;
这种方式更简单但不太精确......

public void update(){
    //(find dif between item x, and touch x)
    float xdif=destx-x;
    float ydif=desty-y;

    if(x<destx){

        dx=xdif/8;
        }

    else if(x>destx){
        //we devide both x and y differences by the same number
        dx=xdif/8;
        }

    else if(x==destx){
        dx=0;
        }
    if(y<desty){
        dy=ydif/5;
        }
    else if(y>desty){
        dy=ydif/5;
        }
    else if(y==desty){
        dy=0;
        }

    x+=dx;
    y+=dy;

你去,在两点之间的直线路径,item.x和touch x。

答案 1 :(得分:0)

首先,数学 - 我认为问题是,例如,tan(135deg) = tan (-45deg) = -1。因此,atan的返回值介于-90deg和90deg之间,作为歧义的解决方案(look at its graph here)。我认为La5t5tarfighter的解决方案 - 在某些情况下否定x运动 - 是在正确的轨道上,但你也需要在这些情况下否定y分量。你可以尝试一下,但是如果你使用了libGDX的Vector2类会更简单。我就是这样做的:

move.set(touchX, touchY);  // y should be through flipping or unproject() before this
move.sub(objectPos);       // move now points from object to where you touched
move.nor();                // now 1 unit long
move.scl(SPEED*deltaTime); // multiplied by a constant and delta - framerate-independent
objectPos.add(move);

如果您愿意,甚至可以将它链接到一行:

objectPos.add(move.set(x,y).sub(objectPos).nor().scl(SPEED*deltaTime));

其次,您未使用Camera。我不完全确定默认坐标系是什么,但我相信y轴指向与用于输入的y轴不同 - Input.getY()给出y轴指向下方左上角。如果您有Camera,则执行此操作:

cam.unproject(someVector.set(Gdx.input.getX(), Gdx.input.getY(), 0));

缺少这个,你可能需要翻转y轴:

event.y = Gdx.graphics.getHeight() - event.y;

不过,这可能是错的。尝试在触摸位置绘制对象 - 如果我正好在其中,它会看起来垂直镜像。如果它在您触摸的位置正确绘制,请忽略此部分。