我开始使用 Sprite 套件,我想知道如何创建无限横向滚动游戏?我阅读了 Sprite 套件文档,并通读了场景的预处理。据说如果内容比场景大,我们可以重新调整场景的位置。我尝试了它并且它有效,但是当我滚动浏览整个背景图像时,我开始看到场景的默认背景。如何创建无限的背景?谁能指出我谈论他的问题的正确文档或文章?谢谢你。
4 回答
这样的事情应该让你开始:
添加背景图片...
for (int i = 0; i < 2; i++) {
SKSpriteNode * bg = [SKSpriteNode spriteNodeWithImageNamed:@"background"];
bg.anchorPoint = CGPointZero;
bg.position = CGPointMake(i * bg.size.width, 0);
bg.name = @"background";
[self addChild:bg];
}
在您的更新方法中。
[self enumerateChildNodesWithName:@"background" usingBlock: ^(SKNode *node, BOOL *stop) {
SKSpriteNode *bg = (SKSpriteNode *) node;
bg.position = CGPointMake(bg.position.x - 5, bg.position.y);
if (bg.position.x <= -bg.size.width) {
bg.position = CGPointMake(bg.position.x + bg.size.width * 2, bg.position.y);
}
}];
这是来自RW中的一个示例,他的示例使用了 1136 像素的背景图像大小。
SKScrollingNode
我为此目的做了一个通用合成器,因为我通常添加多个滚动背景来实现视差效果。使用它非常简单:
在你的场景类中声明它
@property(strong,nonatomic) SKScrollingNode * clouds;
创建它并将其添加到场景实例
self.clouds = [SKScrollingNode spriteNodeWithImageNamed:@"clouds"];
self.clouds.scrollingSpeed = .5; // Speed at which the clouds will scroll
[self addChild:clouds];
在你的场景“更新”方法中,只需调用
[self.clouds update:currentTime]
完毕 !
您可以在此处找到“SKScrollinNode”组合物的完整代码:
https://github.com/kirualex/SprityBird/blob/master/spritybird/Classes/Scenes/
下面是我使用 SpriteKit 和 Swift 进行精确参考的代码示例。
func background1() {
let backgroundTexture = SKTexture(imageNamed: "bg")
//move background right to left; replace
let shiftBackground = SKAction.moveByX(-backgroundTexture.size().width, y: 0, duration: 15)
let replaceBackground = SKAction.moveByX(backgroundTexture.size().width, y:0, duration: 0)
let movingAndReplacingBackground = SKAction.repeatActionForever(SKAction.sequence([shiftBackground,replaceBackground]))
for var i:CGFloat = 0; i<3; i++ {
//defining background; giving it height and moving width
let background = SKSpriteNode(texture:backgroundTexture)
background.position = CGPoint(x: backgroundTexture.size().width/2 + (backgroundTexture.size().width * i), y: CGRectGetMidY(self.frame))
background.size.height = self.frame.height
background.zPosition = -20
background.runAction(movingAndReplacingBackground)
self.addChild(background)
- 创建常量 backgroundTexture 使用您的图像创建为 SKTexture。
- 创建常量以将背景移动到左侧(shiftBackground)并将背景的另一个实例添加到当前显示的右侧(replaceBackground)
- 创建常量 (movingAndReplacingBackground) 作为永远重复的 SKAction,将函数 repeatActionForever 的参数设置为 SKAction.sequence 并引用 shiftBackground 和 replaceBackground 常量。
- 创建一个为您的背景定义定义的循环。(对于变量 i,如果 i 的数量小于 3,则将 i 加 1。
- 在循环中,保护纹理、位置、大小和 zPosition(如果关闭同级顺序),然后调用您的movingAndReplacingBackground 作为您的操作,然后迭代您的序列。
- 最后,循环的最后一部分是添加背景。只要迭代次数少于 3 次,它将执行此操作。并且一旦您的第一个背景到达屏幕的最左侧,它会将节点删除到 2,因此再次在循环中运行该操作。
我将它包装在一个函数中,因为对于视差背景,我能够复制这个函数 4 次,重命名变量,更改 shiftBackground 常量的“持续时间”,并根据它们的距离获得不同的速度。
我希望这有帮助!当 Swift 进入 Swift 3 时,这个“C 风格”的 for 循环将被弃用,所以我不确定如何长期解决这个问题。
我一直在为无限磁贴滚动器开发一个库,希望可以成为侧滚动器的起点:
它使用了一个类似于 tableView 的委托,所以我希望向滚动器提供图块或任何类型的节点真的很容易。我还没有实现任何碰撞逻辑,但我也计划添加它。