2014-03-28 28 views
0

好吧,我正在嘗試做一些簡單的對象向你觸摸屏幕的方向移動。對象沒有按正確的方向移動

如果我直接觸及對象的西北方,它會沿着觸摸位置的方向移動。如果我直接觸摸物體的東南方向,它也會沿着觸摸位置的方向移動。但是,如果我直接觸及物體的東北方向,它將朝着西南方向相反的方向移動。如果我直接觸及物體的西南方,它也會朝東北方向相反的方向移動。另外,如果我觸摸到物體的北部,但是稍微偏向西部,它將向北直線向西。與向北接觸物體西部時一樣,它會直接向北並稍微向西。其他方向也是如此。

真的,所有的方向都有些明顯不正確。我一直在做一些紙張計算,我似乎正在得到一些正確的角度,但在這一點上,我完全難住。

有誰知道這個問題可能是什麼?

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

如果事件X> X,則X必須爲正朝着event.x

搬到這裏的問題是,當event.x < 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。

+0

第一個似乎沒有很好地工作,我可能不得不在稍後檢查它。第二部分我想避免使用。精確的方向很重要。 – user3397452

+0

你可以通過數學來增加第二個數字我只是簡單的讓你看到基本的想法。 – La5t5tarfighter

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; 

不過,這可能是錯誤的。嘗試在觸摸位置繪製對象 - 如果我正確的話,它會呈現垂直鏡像。如果它在你觸摸的地方正確繪製,請忽略此部分。