【问题标题】:SpriteKit and UIScrollView and HUDSpriteKit 和 UIScrollView 和 HUD
【发布时间】:2014-03-19 18:03:17
【问题描述】:

我正在尝试制作小型 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 ,我不认为这是要走的路... 有谁知道完成这项工作的最佳方法?或者为什么我的代码不起作用? 谢谢

【问题讨论】:

  • 好好看看你的代码。您要将滚动视图添加到什么?
  • scrollView 在界面生成器中添加到主视图。 self.designView(游戏场景)也添加到IB里面的scrollView...

标签: ios objective-c uiscrollview sprite-kit


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    https://github.com/bobmoff/ScrollKit

    【讨论】:

      【解决方案3】:

      世界 => 相机 => 英雄

      来自Adventure game 的“Moving Camera”部分。

      【讨论】:

      • 我去看看。谢谢
      【解决方案4】:

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

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

      我的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
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-14
          • 1970-01-01
          • 2013-12-24
          • 1970-01-01
          • 2015-03-11
          相关资源
          最近更新 更多