修复touchDragged逻辑

时间:2015-07-12 11:29:31

标签: libgdx

我想要的是什么:

我希望允许用户拖放他放在屏幕上的演员

1)演员(32x32像素)可以放在我定义的某个区域(中心矩形5x5,每个单元格32像素)

2)当添加到舞台时,演员被捕捉到屏幕的虚构网格。

3)在拖放期间也需要这个对齐网格

4)演员不能被移动到另一个

5)当用户点击它时,演员必须旋转90度

6)演员不能移出界限

实际上我得到了什么:

1)好的 2)好的 3)好的(有bug) 4)尚未实施 5)好的(有bug) 6)尚未实施

错误是:

1)在任何情况下都应用旋转。我不想要这种行为。如果用户只是拖放,我不想旋转演员。 (我知道这是因为我将这部分代码放在touchDown方法中)

2)这很难用我的英语描述,我会尝试。 我放了一个演员,我可以移动它(当我说"移动"我的意思是拖放)。 我放了第二个演员,我可以移动它。 现在,如果我试图移动我放的第一个演员,第二个移动第一个演员(重叠到它)并开始随之移动!

现在代码:

GameStage中的事件

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {

    translateScreenToWorldCoordinates(screenX, screenY);

    // check if the user clicked or not in the center area
    if(!centerArea.contains(touchPoint.x, touchPoint.y)) {
        return true;
    }

    // rotation
    Iterator<Square> squareIterator = squares.iterator();
    while(squareIterator.hasNext()) {
        Square nextSquare = squareIterator.next();
        if(nextSquare.getBounds().contains(touchPoint.x, touchPoint.y)) {
            nextSquare.rotate();
            return true;
        }
    }

    // add an Actor

    touchPoint.set(touchPoint.x - Constants.SQUARE_SIZE / 2, touchPoint.y - Constants.SQUARE_SIZE / 2, 0f);

    float snapX = Math.round((touchPoint.x / Constants.SQUARE_SIZE)) * Constants.SQUARE_SIZE;
    float snapY = Math.round((touchPoint.y / Constants.SQUARE_SIZE)) * Constants.SQUARE_SIZE;

    Square square = new Square(snapX, snapY);
    squares.add(square);
    addActor(square);

    return true;
}

public boolean touchDragged(int screenX, int screenY, int pointer) {

    Vector3 newTouchPoint = new Vector3(screenX, screenY, 0f);
    getCamera().unproject(newTouchPoint.set(screenX, screenY, 0f));

    Square next = null;

    Iterator<Square> squareIterator = squares.listIterator();
    while(squareIterator.hasNext()) {
        next = squareIterator.next();

        if(next.getBounds().contains(newTouchPoint.x, newTouchPoint.y)) {

            next.setX(newTouchPoint.x - Constants.SQUARE_SIZE / 2);
            next.setY(newTouchPoint.y - Constants.SQUARE_SIZE / 2);

            continue;
        }
    }

    newTouchPoint.set(newTouchPoint.x - Constants.SQUARE_SIZE / 2, newTouchPoint.y - Constants.SQUARE_SIZE / 2, 0f);
    float snapX = Math.round((newTouchPoint.x / Constants.SQUARE_SIZE)) * Constants.SQUARE_SIZE;
    float snapY = Math.round((newTouchPoint.y / Constants.SQUARE_SIZE)) * Constants.SQUARE_SIZE;
    next.setX(snapX);
    next.setY(snapY);

    return true;
}

private void translateScreenToWorldCoordinates(int x, int y) {
    getCamera().unproject(touchPoint.set(x, y, 0f));
}

演员

public class Square extends GameActor {

    private float rotation;
    private ShapeRenderer shapeRenderer;

    public Square(float x, float y) {
        super(x, y);
        shapeRenderer = new ShapeRenderer();
    }

    @Override
    protected void initializeSprite() {
        texture = new Texture(Gdx.files.internal(Constants.SQUARE_LOCATION));
    }

    @Override
    public void act(float delta) {
        super.act(delta);
    }

    @Override
    protected void updateBounds() {
        bounds.setPosition(x, y);
    }

    public void rotate() {
        rotation -= 90;
        if(rotation <= -360) {
            rotation = 0;
        }
        setRotation(rotation);
    }

    public void setX(float x) {
        this.x = x;
    }

    public void setY(float y) {
        this.y = y;
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        super.draw(batch, parentAlpha);

        /*shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
        shapeRenderer.setColor(Color.RED);
        shapeRenderer.rect(bounds.getX(), bounds.getY(), Constants.SQUARE_SIZE, Constants.SQUARE_SIZE);
        shapeRenderer.end();*/
        //batch.begin();

        batch.draw(texture, x, y, texture.getWidth() / 2, texture.getHeight() / 2,
            texture.getWidth(), texture.getHeight(), 1, 1, rotation, 0, 0, Constants.SQUARE_SIZE, Constants.SQUARE_SIZE, false, false);
    }
}

我希望你能帮助我,我是Libgdx的新手,谢谢你。

更新

我修复了旋转错误,在touchUp方法中移动了它的逻辑。

0 个答案:

没有答案