SpriteKit 多向滚动

Posted

技术标签:

【中文标题】SpriteKit 多向滚动【英文标题】:SpriteKit multidirectional scrolling 【发布时间】:2014-04-23 17:34:00 【问题描述】:

我正在使用 SpriteKit 开发一款太空射击游戏,用于测试目的。 游戏场大小为 700 x 700 像素/点。显然是不适合 iPhone 屏幕。这意味着我需要某种影响玩家+敌人+子弹+小行星的滚动。我搜索了谷歌,但大多数关于滚动的主题都是指 Cocos2D 并且几乎总是指 Cocos2D 的特定功能,而不是 sprite kit 提供的。所以问题是这是我的第一款游戏,所以我不确定实现多向滚动的正确方法是什么。我希望你们能给我一个解决方案和/或提示/教程或其他任何对我有帮助的东西:D

【问题讨论】:

你试过什么?人们不想为你编写游戏。我知道你想要提示或 tuts,但要付出一些努力。 【参考方案1】:

创建你的“宇宙飞船”,创建一个相机节点并在更新方法中让你的相机始终以宇宙飞船为中心。

类似这个问题的东西:How to make camera follow SKNode in Sprite Kit?

-(void)centerOnNode:(SKNode*)node 
    CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent];
    cameraPositionInScene.x = 0;
    node.parent.position = CGPointMake(node.parent.position.x - cameraPositionInScene.x, node.parent.position.y - cameraPositionInScene.y);

然后你必须弄清楚你自己的游戏机制关于船如何移动,但如果你只是暗示船跟随你的手指,你可以使用 SKActions 动画到手指位置。示例:https://***.com/a/19172574/525576

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

    for (UITouch *touch in touches) 

        for (UITouch *touch in touches) 

            CGPoint location = [touch locationInNode:self];

            CGPoint diff = CGPointMake(location.x - _myPlayer.position.x, location.y - _myPlayer.position.y);

            CGFloat angleRadians = atan2f(diff.y, diff.x);

            [_myPlayer runAction:[SKAction sequence:@[
                                [SKAction rotateToAngle:angleRadians duration:1.0],
                                [SKAction moveByX:diff.x y:diff.y duration:3.0]
                                ]]];
        
    

【讨论】:

您好,这篇文章对我帮助很大。我试着像这样实现我自己的“相机”功能:float xDisFromCenter = 0.f; float yDisFromCenter = 0.f; yDisFromCenter = (world.position.y+player.position.y)-(self.size.height/2); xDisFromCenter = (world.position.x+player.position.x)-(self.size.width/2); world.position = CGPointMake(world.position.x-xDisFromCenter, world.position.y-yDisFromCenter);我只是在移动世界。我想防止滚动到边缘:if(newPos.x>0)xDisFromCenter = 0.f;if (newPos.x<-20)xDisFromCenter = 0.f; 但它每次都不起作用:/【参考方案2】:

解决了,感谢 ray wenderlich

CGSize winSize = self.size;

int x = MAX(player.position.x, winSize.width / 2 );
int y = MAX(player.position.y, winSize.height / 2 );
x = MIN(x, worldSize.width - winSize.width / 2 );
y = MIN(y, worldSize.height - winSize.height/ 2 );
CGPoint actualPosition = CGPointMake(x, y);

CGPoint centerOfView = CGPointMake(winSize.width/2, winSize.height/2);
CGPoint viewPoint = ccpSub(centerOfView, actualPosition);

world.position = viewPoint;

【讨论】:

以上是关于SpriteKit 多向滚动的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit,Swift - 滚动视图不显示

SpriteKit 中的无限滚动背景

如何在 SpriteKit 中创建有限的、可滚动的背景?

以编程方式使用 Swift 在 Spritekit 中滚动视图(无情节提要)

如何在 iOS SpriteKit 中添加滚动背景效果。

使用 SpriteKit 的球滚动和转动效果