gpt4 book ai didi

ios - 使用 Sprite Kit 制作像游戏一样的小翅膀

转载 作者:行者123 更新时间:2023-11-29 12:49:45 24 4
gpt4 key购买 nike

有没有人有这方面的经验?我一直在使用 SKSpriteNodes,使用 BezierPaths 作为山丘(和 physicsBody)的半圆,然后将它们从屏幕上加载,并每帧更新向左移动 1-10 像素。

它很慢,相机没有跟随鸟,鸟永远无法获得足够的速度自行上山......

我尝试使用 SKActions 将山丘移动到屏幕左侧,但它们并不总是与精确的像素对齐,有时小鸟最终会掉落在它们之间。

还有比这更好的方法吗?有 4 个半圆 SKSpriteNode,以固定速率向左移动?我希望我能让小鸟停留在屏幕上固定的 x 位置,并且只在适当的时候向左移动山丘。

这是我创建山丘的代码

- (void) createNewHill {
// Hill 1
SKSpriteNode *hill = [[SKSpriteNode alloc] initWithColor:[UIColor clearColor] size:CGSizeMake([UIScreen mainScreen].bounds.size.width * 2, [UIScreen mainScreen].bounds.size.height * 0.5)];
SKSpriteNode *lastHill = [hillArray objectAtIndex:(hillArray.count - 1)];
[hill setPosition:CGPointMake(lastHill.frame.origin.x + lastHill.frame.size.width, hill.frame.size.height * 0.5)];

float x1 = -hill.frame.size.width / 2;
float x3 = -hill.frame.size.width / 4;
float x7 = hill.frame.size.width / 4;
float x9 = hill.frame.size.width / 2;
float y1 = - hill.frame.size.height / 2;
float y5 = hill.frame.size.height / 2;

UIBezierPath* bezierPath = [UIBezierPath bezierPath];
[bezierPath moveToPoint: CGPointMake(x1, 0)];
[bezierPath addQuadCurveToPoint:CGPointMake(0, 0) controlPoint:CGPointMake(x3, y1 * 2)];
[bezierPath addQuadCurveToPoint:CGPointMake(x9, 0) controlPoint:CGPointMake(x7, y5 * 2)];
[bezierPath addLineToPoint:CGPointMake(x9, y1)];
[bezierPath addLineToPoint:CGPointMake(x1, y1)];
[bezierPath closePath];

[hill setPhysicsBody:[SKPhysicsBody bodyWithEdgeLoopFromPath:bezierPath.CGPath]];
hill.physicsBody.dynamic = NO;
hill.physicsBody.friction = 0;
hill.physicsBody.restitution = 0;

// Hill 2
SKSpriteNode *hill2 = [[SKSpriteNode alloc] initWithColor:[UIColor clearColor] size:CGSizeMake([UIScreen mainScreen].bounds.size.width * 2, [UIScreen mainScreen].bounds.size.height * 0.5)];
[hill2 setPosition:CGPointMake(hill.position.x + hill2.frame.size.width, hill.position.y)];
[hill2 setPhysicsBody:[SKPhysicsBody bodyWithEdgeLoopFromPath:bezierPath.CGPath]];
hill2.physicsBody.dynamic = NO;
hill2.physicsBody.friction = 0;
hill2.physicsBody.restitution = 0;

[scene addChild:hill];
[scene addChild:hill2];
[hillArray addObject:hill];
[hillArray addObject:hill2]; }

这是我的代码的一部分,它是通过计时器运行的(每 1.0/60.0 秒重复一次)

SKSpriteNode *firstHill = [hillArray objectAtIndex:0];
SKSpriteNode *secondHill = [hillArray objectAtIndex:1];

if (speedOfHills < 60 * 10)
speedOfHills++;
[firstHill setPosition:CGPointMake(firstHill.position.x - [self getDoubleBasedOnDevice:speedOfHills / 60 :speedOfHills / 60 :speedOfHills / 30], firstHill.position.y)];
for (int i = 1; i < hillArray.count; i++)
{
SKSpriteNode *thisHill = [hillArray objectAtIndex:i];
SKSpriteNode *previousHill = [hillArray objectAtIndex:i - 1];
[thisHill setPosition:CGPointMake(previousHill.position.x + (previousHill.frame.size.width / 2) + (thisHill.frame.size.width / 2), firstHill.position.y)];
}

if (firstHill.position.x < - ((firstHill.size.width / 2) + (secondHill.frame.size.width)) * 1.05)
{
[self createNewHill];
[firstHill removeFromParent];
[secondHill removeFromParent];
[hillArray removeObjectAtIndex:1];
[hillArray removeObjectAtIndex:0];
}

到目前为止,我已经尝试了一些方法,但这只是我当前的 timerUpdate 设置。

最佳答案

如果您使用计时器来更新这些位置,那么您的 sprite kit 是错误的。了解更新循环

https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html

您应该在 SKScene- (void)update:(NSTimeInterval)currentTime 方法中移动您的山丘和其他东西。您获取当前时间作为该方法的一部分。如果你想自己移动东西,让它们与像素对齐,你需要用这种方法移动东西。您可以使用经典公式速度 = 距离/时间来计算将山丘移动多远。如果你知道速度,那么距离 = 速度 * 时间。耗时是本次更新时间与上次更新时间之间的差值。

我建议查找并运行一些 sprite 工具包教程

关于ios - 使用 Sprite Kit 制作像游戏一样的小翅膀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697250/

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