我画了一张等距地图。
我取我的精灵的当前位置和移动后我的精灵应该在的目标位置:
// 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);
然后我使用ShapeRender
绘制一条简单的线,以查看是否正确设置了局部/目标点,以及矩形,以便您可以看到精灵渲染的开始位置。
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来调整它在等距图块上的位置,因为每个精灵都是不同的。
输出如下所示:
您可以在这里看到的是精灵开始绘制的起点(您可以看到偏移量调整了它,使精灵看起来像它在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);
}
使用相同的方法绘制瓷砖,只是使用瓷砖的纹理。
我想回答自己这个问题,因为其他人可能也有同样的问题,只是像我一样把它弄得过于复杂。
如果你想在等轴测图上进行任何移动,不要误解我的意思,在等轴测坐标上进行计算。
您必须在平面屏幕矩阵坐标上计算它,然后将其转换为等距坐标。
例如,我想像这样向上移动,我需要做的就是:
ship.y += 0.1f // when it reaches 1, then it will be at 0, 1
所以你知道你想在你的非等轴测地图上的< code>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);
这将在等轴测地图上绘制它,就像在屏幕坐标上一样,但采用等轴测格式。
for(float x : new float[targetx - currentx]) {ship.setPosition(ship.getX + x, ship.getY); }
你也会为你做同样的事。
编辑:
我想这是错误的,因为你在我假设的每一帧都这么称呼。
相反,您将跟踪目标和飞船之间的行进距离,并且每次将 sip 位置增加 1 到 x 和 y,直到它到达距离。