好吧,我试图做一些简单的物体朝你触摸屏幕的方向移动。
如果我直接触摸物体的西北方向,它会移动到触摸位置的方向。如果我直接触摸物体的东南方向,它也会移动到触摸位置的方向。但是,如果我直接触摸物体的东北方向,它将朝向西南方向移动到相反的方向。如果我直接触摸物体的西南方向,它也会向东北方向移动。
此外,如果我触摸物体的北面,但是向西略微移动一点,它会向西直行一点向北。同样在向北移动一点点向北移动,它向北直接向西移动一点点。其他方向也是如此。
真的,所有方向都有些明显不正确。我也在做一些纸质计算,而且我似乎得到了一些正确的角度,但此时我完全被难倒了。
有谁知道问题可能是什么?
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() {
}
}
答案 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;
不过,这可能是错的。尝试在触摸位置绘制对象 - 如果我正好在其中,它会看起来垂直镜像。如果它在您触摸的位置正确绘制,请忽略此部分。