Java拖动精灵从头开始重绘

时间:2014-03-10 13:49:06

标签: java java-2d

当我拖动我的精灵,而不是从同一位置拖动它时,它将使用当前单击的X,Y位置重新定位精灵。这是因为精灵会立即在点击的位置上绘制。

    if (super.mouseDragging && System.currentTimeMillis() - super.mouseTimer >= 200) {
        PosX = super.mouseX;
        PosY = super.mouseY;
    }

PosX/PosY =精灵的位置。

当你点击精灵时,我怎么做到这一点,它不会用新的X,Y重新定位它,只是顺利处理拖动?我想在当前位置添加偏移但我不确定究竟是多少。

有没有正确的方法呢?

良好拖动的示例:

http://scratch.mit.edu/projects/2098337/

        grabbedX = super.mouseX - PosX;
        grabbedY = super.mouseY - PosY;
        PosX = super.mouseX - grabbedX;
        PosY = super.mouseY - grabbedY;

X: -108 Y: -82
X: 108 Y: 83
X: -108 Y: -83
X: 108 Y: 84
X: -108 Y: -84
X: 107 Y: 85
X: -107 Y: -85
X: 107 Y: 85
X: -107 Y: -85
X: 107 Y: 85
X: -107 Y: -85


    if (x >= client.PosX && x <= client.PosX + 229 
            && y >= client.PosY && y <= client.PosY + 70) {
        this.mouseDragging = true;
        this.mouseTimer = System.currentTimeMillis();
        System.out.println("yes");
    }
    else {
        System.out.println("no");
    }

1 个答案:

答案 0 :(得分:1)

你明白了。计算对象原点和单击位置之间的偏移量,然后在拖动过程中设置位置时保持偏移量。如果你不这样做,你会看到初始的“跳跃”,因为它将对象的原点设置在点击的鼠标位置(除非你碰巧在其原点抓住了对象)。

当对象被“抓住”时,我通常会这样做。计算一次,例如在您的mousePressed()方法中计算:

Point origin = thing.getPosition();
scene.grabbedOffsetX = (mousePos.x - origin.x);
scene.grabbedOffsetY = (mousePos.y - origin.y);

然后,在拖动操作期间重绘时,会考虑先前计算的偏移量。在整个拖动操作中,偏移量保持不变。例如,您可以使用mouseDragged()方法:

thing.setPosition(mousePos.x - grabbedOffsetX, mousePos.y - grabbedOffsetY);
repaint();