- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一个与语言无关的问题,更多关于我的游戏模型。
我有一个带有元素的贪吃蛇游戏,但我平滑地移动元素,它们不仅每次移动 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/
在 Snakemake 文档中, includes directive可以将另一个工作流程的所有规则合并到主工作流程中,并且显然可以显示在 snakemake --dag -n | dot -Tsvg
在 Snakemake 文档中, includes directive可以将另一个工作流程的所有规则合并到主工作流程中,并且显然可以显示在 snakemake --dag -n | dot -Tsvg
我们遵循将模型属性命名为 snake_case_variables 的 Laravel 标准。尽管 Laravel 只是我们系统中与 Javascript 前端和许多其他应用程序对话的 API 层。
当前情况:我想检测图像中的矩形(或正方形),这些矩形的轮廓并不完全一致。就像棋盘,外轮廓有整体。 可能的解决方案:我正在尝试实现主动轮廓算法,它应该可以帮助我检测物体的外部轮廓。我知道物体外面的一些点
我是一名优秀的程序员,十分优秀!