LibGdx - 让精灵遵循直线路径

时间:2017-08-19 21:24:59

标签: java graphics libgdx

我画了一张等轴测图。

我把我的精灵的当前位置和我的精灵在移动后应该在的目标位置:

    // region is my TextureRegion.
    int x1 = getIsometricX(1,1,region);
    int x2 = getIsometricX(1,2,region);

    int y1= getIsometricY(1,1,region);
    int y2 = getIsometricY(1,2,region);

然后我使用ShapeRenderer绘制一条简单的线来查看本地/目标点是否正确设置,以及矩形,以便您可以看到精灵渲染的开始位置。

    renderer.setProjectionMatrix(camera.combined);
    renderer.begin(ShapeRenderer.ShapeType.Line);
    renderer.setColor(Color.RED);
    renderer.line(x1 + location.getOffsetx(), y1 + location.getOffsety(), x2 + location.getOffsetx(), y2 + location.getOffsety());
    renderer.rect(x1 + location.getOffsetx(), y1 + location.getOffsety(), region.getRegionWidth(), region.getRegionHeight());
    renderer.end();

我的每个精灵都设置了offsetX和offsetY来调整它在等距瓷砖上的位置,因为每个精灵都是不同的。

输出如下:

img

你可以在这里看到的是精灵开始绘制的起点(你看到偏移调整了它,所以精灵在1,1平铺上看起来就像它。

你可以看到从精灵的起始绘制点开始的行,并在精灵的目标绘制点结束。

现在我的问题是,我怎样才能让那个精灵在这条线的路径上移动,所以它看起来就像船在前进?

所以问题的主要概念是 ..如何让精灵从本地点到目标点直线移动?

您可能需要查看的一些功能:

public int getIsometricX(int x, int y, TextureRegion region) {
    return (x * GameTile.TILE_WIDTH / 2) - (y * GameTile.TILE_WIDTH / 2) - (region.getRegionWidth() / 2);
}

public int getIsometricY(int x, int y, TextureRegion region) {
    return (x * GameTile.TILE_HEIGHT / 2) + (y * GameTile.TILE_HEIGHT / 2) - (region.getRegionHeight() / 2);
}

使用相同的方法绘制平铺,只使用平铺纹理。

2 个答案:

答案 0 :(得分:1)

我想回答这个问题,因为其他人可能会遇到同样的问题而且只会像我一样过于复杂。

如果您想在等轴测图上执行任何移动,请不要跟随我的误解并在等距坐标上计算它。

您必须在平面屏幕矩阵坐标上计算它,然后将其转换为等距坐标。

例如,我想像这一行一样向上移动,我需要做的就是:

ship.y += 0.1f // when it reaches 1, then it will be at 0, 1

所以你知道你想要在非等距地图上0,1

所以你做这个增量,然后最后,你必须在绘制之前将它转换为等距坐标:

float x = (ship.x * GameTile.TILE_WIDTH / 2) - (ship.y * GameTile.TILE_WIDTH / 2) - (textyure.getWidth() / 2);

float y = (ship.x * GameTile.TILE_HEIGHT / 2) + (ship.y * GameTile.TILE_HEIGHT / 2) - (texture.getHeight() / 2);

这将在等轴测图上绘制,就像在屏幕坐标上一样,但是采用等距格式。

答案 1 :(得分:0)

for(float x : new float[targetx - currentx]) {ship.setPosition(ship.getX + x, ship.getY); } 

你会为y做同样的事情。

编辑:

我想这是错误的,因为你在我假设的每一帧都在调用它。

相反,您将跟踪目标和船舶之间的行进距离,并且每次将sip位置增加1到x和y,直到达到距离为止。