我的游戏基于瓷砖,它是一种棋盘游戏,船只可以向前,向左和向右移动。
当船舶想要向左或向右移动时,我们需要设置四个参数:
起点:这是我的船精灵当前所在的位置,这是它当前想要移动的地块的中心。
inbetween-point :当船舶向左或向右移动时,需要通过一个瓷砖转向该方向(您将在预览中看到该示例)
终点(目标位置):这是船舶想要移动的地方。
开始和结束点之间的中心点:这是起点和终点之间的中心点,我们放置圆圈路径
这就是它的样子:
左下角的第一个红点是我们的起点。
黄点是中间点
右上角的最后一个红点是我们的目标位置。
我想要创造的是,让我的船在曲线运动中移动到目标位置。因此,我创建了一条圆形路径,我的船只精灵的中心点必须沿直线移动,直到它到达圆形路径上的第一个点,然后继续沿着路径移动直到它到达目标位置平铺,一旦它到达,它将沿直线移动,直到达到目标点。
现在的问题是,我该怎么做?
这是我到目前为止所做的:
// Make sure that vessel has moves set to perform
if (!vessel.getMoves().isEmpty()) {
// Get the current move from the moves stack
Move move = vessel.getMoves().peek();
// Is the vessel currently performing move? if not, init a move!
if (!vessel.isMoving()) {
// the current rotation of the ship (either 0, 90, -90 or 180)
float rotation = vessel.getSprite().getRotation();
// the starting position
Vector2 start = new Vector2(vessel.getSprite().getX(), vessel.getSprite().getY());
// How much to add to X and Y to get the target positoon, based on current rotation of the ship (face)
int moveX = move.getAddX(rotation) * TILE_SIZE;
int moveY = move.getAddY(rotation) * TILE_SIZE;
// get the end point (target pos)
Vector2 end = new Vector2(vessel.getSprite().getX() + moveX, vessel.getSprite().getY() + moveY);
// How much to add to x and y to get the inbetween position between start and end position
int inbetweenX = move.getAddXInbetween(rotation) * TILE_SIZE;
int inbetweenY = move.getAddYInbetween(rotation) * TILE_SIZE;
Vector2 inbetween = new Vector2(start.x + inbetweenX, start.y + inbetweenY);
vessel.setStart(start);
vessel.setEnd(end);
vessel.setInbetween(inbetween);
vessel.setMoving(true);
}
else {
// Starting position of the ship
Vector2 start = vessel.getStart();
// target position of the ship
Vector2 end = vessel.getEnd();
Vector2 inbetween = vessel.getInbetween();
Vector2 middle = new Vector2((start.x + end.x) / 2, (start.y + end.y) / 2);
renderer.rect(start.x + 32f, start.y + 32f, 1, 1);
//renderer.rect(middle.x + 32f, middle.y + 32f, 1, 1);
renderer.rect(end.x + 32f, end.y + 32f, 1, 1);
renderer.setColor(Color.YELLOW);
renderer.rect(inbetween.x + 32f, inbetween.y + 32f, 1, 1);
renderer.circle(middle.x + 32f, middle.y + 32f, (float) (TILE_SIZE / 2)); // radius is half of tile size
// todo render and update coords/rotation here ...
}