10

我开始使用 Sprite 套件,我想知道如何创建无限横向滚动游戏?我阅读了 Sprite 套件文档,并通读了场景的预处理。据说如果内容比场景大,我们可以重新调整场景的位置。我尝试了它并且它有效,但是当我滚动浏览整个背景图像时,我开始看到场景的默认背景。如何创建无限的背景?谁能指出我谈论他的问题的正确文档或文章?谢谢你。

4

4 回答 4

12

这样的事情应该让你开始:

添加背景图片...

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 像素的背景图像大小。

于 2013-10-14T03:35:57.863 回答
3

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/

于 2014-02-15T11:30:57.247 回答
1

下面是我使用 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)
  1. 创建常量 backgroundTexture 使用您的图像创建为 SKTexture。
  2. 创建常量以将背景移动到左侧(shiftBackground)并将背景的另一个实例添加到当前显示的右侧(replaceBackground)
  3. 创建常量 (movingAndReplacingBackground) 作为永远重复的 SKAction,将函数 repeatActionForever 的参数设置为 SKAction.sequence 并引用 shiftBackground 和 replaceBackground 常量。
  4. 创建一个为您的背景定义定义的循环。(对于变量 i,如果 i 的数量小于 3,则将 i 加 1。
  5. 在循环中,保护纹理、位置、大小和 zPosition(如果关闭同级顺序),然​​后调用您的movingAndReplacingBackground 作为您的操作,然后迭代您的序列。
  6. 最后,循环的最后一部分是添加背景。只要迭代次数少于 3 次,它将执行此操作。并且一旦您的第一个背景到达屏幕的最左侧,它会将节点删除到 2,因此再次在循环中运行该操作。

我将它包装在一个函数中,因为对于视差背景,我能够复制这个函数 4 次,重命名变量,更改 shiftBackground 常量的“持续时间”,并根据它们的距离获得不同的速度。

我希望这有帮助!当 Swift 进入 Swift 3 时,这个“C 风格”的 for 循环将被弃用,所以我不确定如何长期解决这个问题。

于 2016-08-31T17:38:12.970 回答
0

我一直在为无限磁贴滚动器开发一个库,希望可以成为侧滚动器的起点:

RPTileScroller

它使用了一个类似于 tableView 的委托,所以我希望向滚动器提供图块或任何类型的节点真的很容易。我还没有实现任何碰撞逻辑,但我也计划添加它。

于 2015-03-05T09:32:59.350 回答