2013-05-10 116 views
-2

所以我有一個項目的截止日期,我遇到了矩形碰撞的問題,並將圖像的速度移動到了矢量點。矩形碰撞的問題是我有一個有一個hitbox的小圖像,我有它,所以你可以用你的鼠標繪製一個選擇框,但只有當選擇框具有正高和寬時,兩者纔會發生碰撞。我會發佈下面的代碼,至於速度問題,我不知道如何讓一些東西以恆定的速度移動到某一點,並在到達時停止。矩形/速度問題

我該如何做速度的事情,並翻轉矩形,所以它不是負面的?

private static int prevMouseX = World.input.getMouseX(); 
private static int prevMouseY = World.input.getMouseY(); 
public static Rectangle selectBox = new Rectangle(0, 0, 0, 0); 

public static void handleAI(GameContainer gc, Graphics g) 
{ 
    if (World.input.isMouseButtonDown(0)) 
    { 
    g.setColor(new Color(0, 0, 0)); 
    selectBox.setBounds(prevMouseX, prevMouseY, World.input.getMouseX() - prevMouseX, World.input.getMouseY() - prevMouseY); 
    g.draw(selectBox); 
    } 
    else 
    { 
    prevMouseX = World.input.getMouseX(); 
    prevMouseY = World.input.getMouseY(); 
    selectBox = new Rectangle(0, 0, 0, 0); 
    } 

    if (MouseAI.selectBox.intersects(unit.getHitbox())) 
    { 
    unit.setSelected(true); 
    } 

    if (unit.isSelected()) 
    { 
    if (World.input.isMousePressed(1)) 
    { 
     point.set(World.input.getMouseX() - unit.getPosition().x, World.input.getMouseY() - unit.getPosition().y); 
     pointSet = true; 
    } 
    } 

    if(pointSet) 
    { 
    float moveSpeedX = point.x * unit.getSpeed(); 
    float moveSpeedY = point.y * unit.getSpeed(); 

    unit.getPosition().x += moveSpeedX; 
    unit.getPosition().y += moveSpeedY; 
    } 
} 
+2

1)爲了更好地幫助越早,張貼[SSCCE](http://sscce.org/)。 2)你描述了一個問題,但至今沒有問過問題(更不用說具體的可回答的問題)。你的問題是什麼? – 2013-05-10 19:45:12

+0

問題似乎是選擇框不與單位的hitbox相交,因此它不算作選擇。發生這種情況是因爲選擇框具有負寬度和/或高度。所以我需要一種方法來選擇單位,無論選擇框的寬度和高度如何,只要它相交。速度問題是,當我選擇單位並右鍵點擊將他送到某個位置時,我希望他以恆定的速度移動。我點擊的地方有一個向量點,但是如何讓它以恆定的速度移動。 – ExoNaut 2013-05-10 19:48:33

+0

嗨;我試圖修復縮進,但我不確定我是否正確。第二和第三條if語句應該在handleAI()中嗎? – 2013-05-10 19:48:40

回答

0
selectBox.setBounds(prevMouseX, prevMouseY, World.input.getMouseX() - prevMouseX, World.input.getMouseY() - prevMouseY); 

應該

int x = World.input.getMouseX(); 
int y = World.input.getMouseY(); 
int w,h; 
if (x < prevMouseX) 
    w = prevMouseX - x; 
else { 
    w = x - prevMouseX; 
    x = prevMouseX; 
} 
if (y < prevMouseY) 
    h = prevMouseY - y; 
else { 
    h = y - prevMouseY; 
    y = prevMouseY; 
} 
selectBox.setBounds(x, y, w, h); 

編輯:此行

point.set(World.input.getMouseX() - unit.getPosition().x, World.input.getMouseY() - unit.getPosition().y); 

看起來也有點懷疑我。


編輯:至於速度問題消失,這是一個有點複雜,插入代碼片段上面,所以我就做一些揮手這裏。

假設你在浮點工作。 (在整數數學中它更復雜一些。)

假設你有兩個約束:你希望點(大概)以合理的速度移動,但是你也不希望它整天都在。

選擇基本速度;稱之爲baseSpeed。選擇該點到達目的地的最長允許時間(太長,玩家感到無聊),maxTime。確定您打算以每秒幀數進行動畫處理的速度;稱它爲fps

當它的時間點移動,然後:

dx = p1.x - p0.x; 
dy = p1.y - p0.y; 
dist = Math.sqrt(dx*dx + dy*dy); 
speed = baseSpeed; 
if (dist/speed > maxTime) speed = dist/maxTime; 

設置定時器1/FPS間隔在幾秒鐘內調用一個函數。

p = p0; 
displayPosition(p); 
startTimer(1./fps); 
t0 = getCurrentTime(); 
t1 = t0 + dist/speed; 

.... 

myTimerFunction() { 
    t = getCurrentTime(); 
    float f = (t-t0)/(t1-t0); 
    if (f > 1) f = 1; // prevent overshoot 
    p.x = f*(p1.x - p0.x); 
    p.y = f*(p1.y - p0.y); 
    displayPosition(p); 
    if (t >= t1) 
     stopTimer(); 
} 

因爲你的問題有點含糊,我的答案是有點含糊的歡迎,並可能不是正是你要尋找的。

+0

這可能會變得更緊湊,或者至少轉移到實用功能,但它應該可以解決您的問題。 – 2013-05-10 19:54:04

+0

非常感謝 – ExoNaut 2013-05-10 19:56:13

+0

你對速度問題有什麼想法嗎? – ExoNaut 2013-05-10 19:56:39

1

從Java手冊,你真的應該使用Rectangle課前閱讀:

一個矩形,其寬度或高度爲負沿負尺寸的軸既不位置也不尺寸。 這樣的矩形在這些軸上被視爲不存在。這樣的矩形在包含計算和方法中也是空的,它測試它是否包含或相交點或矩形將始終返回false。將這種矩形與點或矩形組合在一起的方法將完全忽略矩形的生成結果。如果兩個Rectangle對象組合在一起並且每個對象都具有負值,則結果至少會有一個負值。

http://docs.oracle.com/javase/7/docs/api/java/awt/Rectangle.html