矩形/速度问题

时间:2013-05-10 19:41:46

标签: java performance swing awt collision

所以我有一个项目的截止日期,我有一些矩形碰撞的问题,并将图像的速度移动到矢量点。矩形碰撞的问题是我有一个小图像,有一个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 个答案:

答案 0 :(得分:1)

在Java手册中,您在使用Rectangle类之前确实应该阅读:

宽度或高度为负的矩形沿着具有负尺寸的轴既没有位置也没有尺寸。 这样的Rectangle在这些轴上被视为不存在。对于包含计算和测试它是否包含或相交点或矩形的方法,这样的Rectangle也是空的,总是返回false。将这样的Rectangle与点或矩形组合在一起的方法将在生成结果时完全忽略Rectangle。如果组合了两个Rectangle对象并且每个对象具有负维度,则结果将至少具有一个负维度。

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

答案 1 :(得分: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();
}

由于你的问题有点含糊不清,我的答案也有点模糊,可能并不完全是你想要的。