2013-05-10 73 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