2014-03-19 60 views
2

我正在尝试制作小型的iOs游戏。用户将看到一个大于设备屏幕尺寸的场景。我相信处理这个问题的正确方法是创建场景并将其放置在滚动视图中,以便用户可以滚动查看整个场景(甚至可以滚动查看以查看更多详细信息)。不过,我一直不成功,在这..这是代码:SpriteKit和UIScrollView和HUD

- (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 sprites)时,添加一个滚动视图的精灵是可见的)。

我还想添加一个HUD:无论用户在哪里滚动/放大,都会将鼠标悬停在同一个地方......我看过一个没有滚动视图的例子,其中thouchesDidMove用于滚动SKView ,我不认为这是要走的路... 有谁知道最好的方法来完成这件事?或者为什么我的代码不工作? 感谢

+0

仔细看看你的代码。你正在添加你的scrollview到什么? –

+0

scrollView在界面生成器中添加到主视图中。 self.designView(游戏场景)也在IB里面添加scrollView ... – user1028028

回答

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 
0

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