SpriteKit和UIScrollView和HUD

时间:2014-03-19 18:03:18

标签: ios objective-c uiscrollview sprite-kit

我正在尝试制作小型iOs游戏。将向用户呈现比设备的屏幕尺寸更大的场景。我相信处理这个问题的正确方法是创建场景并将其放在滚动视图中,这样用户就可以滚动查看整个场景(甚至可以滚动进出以查看更多细节)。但是我没有成功..这是代码:

- (void)viewWillLayoutSubviews
{
    // Configure the view.
    SKView * skView = (SKView *)self.view;
    if (!skView.scene) {
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        // Create and configure the scene.
        // the size will eventually come from the levels file
        SKScene * scene = [[PSMainGameScene alloc] initWithSize:skView.bounds.size andLevel:0];
        scene.scaleMode = SKSceneScaleModeAspectFill;

        // TODO Add ambiental music

        // Present the scene.
        [skView presentScene:scene];
    }

}

这似乎添加了场景,我能够滚动,但场景没有精灵,即使你的skview应该绘制它们(在角落里,滚动后我能看到帧率11fps(为什么这么小) ),和0精灵)当在滚动视图外部添加时,精灵是可见的。)

我还想添加一个HUD:几个按钮将悬停在同一个地方,无论用户滚动/缩放的位置......我已经看到一个没有滚动视图的示例,其中thouchesDidMove用于滚动SKView,我不认为这是要走的路...... 有谁知道完成这项工作的最佳方法?或者为什么我的代码不起作用? 感谢

5 个答案:

答案 0 :(得分:2)

我在这里回答了类似的问题:What is the right way to create scrollable table in SKSpriteKit?

总结一下 - 我建议建立ScrollKit。最重要的是,我建议翻转UIScrollView Y坐标以匹配SpriteKit的坐标系,以及使用允许设置其contentOffset的自定义SKNode(example of such a node here)。

答案 1 :(得分:1)

在GitHub上看看这个项目。它显示了在SpriteKit项目中使用UIScrollView的示例。

https://github.com/bobmoff/ScrollKit

答案 2 :(得分:0)

World =>相机=>英雄

第" Moving Camera"来自Adventure game

答案 3 :(得分:0)

我为我的教程创建了一个演示,用于移动手指拖动的背景。这是代码,不确定,但可能对你有帮助。

我没有注意背景节点的界限,所以当你在屏幕上拖动手指时它可能会移出屏幕,你可以照顾它。

我的MyScene.m文件如下所示

#import "MyScene.h"

@interface MyScene(){
    SKSpriteNode *bgSprite;
    CGPoint translation;
}
@end

@implementation MyScene

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

        bgSprite = [SKSpriteNode spriteNodeWithImageNamed:@"bg"];
        bgSprite.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
        [self addChild:bgSprite];

    }
    return self;
}

- (void)didMoveToView:(SKView *)view {
    UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
    [[self view] addGestureRecognizer:gestureRecognizer];
}

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {

    if (recognizer.state == UIGestureRecognizerStateBegan) {
        translation = CGPointZero;
    } else if (recognizer.state == UIGestureRecognizerStateChanged) {

        CGPoint curTranslation = [recognizer translationInView:recognizer.view];
        CGPoint newPoint;
        if (translation.x==0 && translation.y==0) {
            newPoint = curTranslation;
        }
        else{
            newPoint.x=curTranslation.x-translation.x;
            newPoint.y=curTranslation.y-translation.y;
        }
        CGPoint prevPosition = bgSprite.position;
        CGPoint newPosition  = CGPointMake(prevPosition.x+newPoint.x, prevPosition.y-newPoint.y);
        bgSprite.position = newPosition;
        translation = curTranslation;

    } else if (recognizer.state == UIGestureRecognizerStateEnded) {

    }
}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
//    NSLog(@"Update");

}

@end

答案 4 :(得分:0)

您应该将所有SKSpriteNode对象添加到一个大型SKNode中,然后在SKView中添加此节点。您应该在主场景中移动此节点的位置。