gpt4 book ai didi

ios - 平滑的蛇形运动

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:45 24 4
gpt4 key购买 nike

这是一个与语言无关的问题,更多关于我的游戏模型。

我有一个带有元素的贪吃蛇游戏,但我平滑地移动元素,它们不仅每次移动 1 个方 block ,而是每帧移动一定数量的像素。

我有一个计算元素位置的更新循环,但我无法正确计算。

我有每个元素的标题:

typedef NS_ENUM(int, kElementHeading)
{
kElementHeadingNorth = 1,
kElementHeadingSouth,
kElementHeadingEast,
kElementHeadingWest
};

我还有 velocity (x, y) 确定蛇行进的方向。我的蛇形运动有问题,因为我的元素位置错误。我设法为 2 个元素本地化了东西,但我的解决方案在更多元素上失败了。

我尝试的第一个解决方案是保存头部改变方向的旋转点。这行得通,但由于不同的情况,元素每转可以移动不同数量的像素。通常元素会跳过这一点。我尝试增加它应该旋转的区域,但它增加了错误。我尝试修复此错误,但元素仍会与 snake 分离(经常)。

第二次尝试时,我决定将蛇头保持在屏幕中央,并围绕它移动世界。它适用于 2 个元素,因为我只是将下一个元素平稳地移动到相对于头部的所需位置。但这在更多元素上严重失败。如果您快速转弯,它们就会开始跳舞,而不是跟随路径。

我尝试的第三件事是为其他元素留下路径。但这没有用,因为我打算让我的蛇保持在屏幕中央,从技术上讲它永远不会移动来创建路径。

我正在寻找像 Nimble Quest(或任何蛇)一样复制移动模式。

我应该如何实现 snake 元素移动才能没有错误?

这是我的第一种方法的代码,问题是元素经常会脱落。该代码非常不言自明。旋转点是改变方向的地方。

CFTimeInterval delta = self.lastTime - currentTime;

CGPoint currentPosition = self.playerSnake.head.sprite.position;
CGPoint velocity = self.playerSnake.velocity;

self.playerSnake.head.sprite.position = CGPointMake(currentPosition.x + velocity.x * delta * CONSTANTSPEEDFACTOR , currentPosition.y + velocity.y * delta * CONSTANTSPEEDFACTOR);

for (SnakeElement *element in self.playerSnake.elements) {

CGPoint currentPositionE = element.sprite.position;
CGPoint velocityE = element.velocity;

element.sprite.position = CGPointMake(currentPositionE.x + velocityE.x * delta * CONSTANTSPEEDFACTOR , currentPositionE.y + velocityE.y * delta * CONSTANTSPEEDFACTOR);
}

BOOL markToDelete = NO;
NSDictionary *deleteDictionary;

for (NSDictionary *dict in self.playerSnake.rotationPoints) {

CGPoint positionCoordinate = CGPointFromString(dict[@"position"]);
CGPoint velocityNew = CGPointFromString(dict[@"velocity"]);
double newAngle = [dict[@"angle"] doubleValue];

for (SnakeElement *element in self.playerSnake.elements) {

int xDifference = element.sprite.position.x - positionCoordinate.x;
int yDifference = element.sprite.position.y - positionCoordinate.y;

if ((xDifference > -2 && xDifference < 2) && (yDifference > -2 && yDifference < 2) ) {

element.velocity = velocityNew;
element.sprite.position = CGPointMake(element.sprite.position.x + xDifference, element.sprite.position.y + yDifference);
SKAction *action = [SKAction rotateToAngle:newAngle duration:0.2 shortestUnitArc:YES];
[element.sprite runAction:action];
if ([element isEqual:[self.playerSnake.elements lastObject]]) {
markToDelete = YES;
deleteDictionary = dict;
}
}
}
}

[self.playerSnake.rotationPoints removeObject:deleteDictionary];

如果我尝试增加转折点的捕捉区域,元素往往会比 1 或 2 像素宽时更频繁地脱落。我不确定为什么会这样。

最佳答案

这就是我在评论中建议您处理开启点的方法:

1.. 根据速度和自上一帧以来耗时计算元素应移动该帧的距离。 (增量)

2.. 计算元素当前位置到转折点的距离。这就是我在评论中提到的beforeDistance

3.. 计算转弯后元素应向新目标转弯点移动的距离

afterDistance = distanceToMoveThisFrame - beforeDistance

4.. 使用 afterDistance

计算元素的新位置,从当前转折点开始朝向元素的下一个目标转折点

如果您遵循这个逻辑,您将永远不会超过或低于转折点。

关于ios - 平滑的蛇形运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22289872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com