我正在尝试制作小型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,我不认为这是要走的路...... 有谁知道完成这项工作的最佳方法?或者为什么我的代码不起作用? 感谢
答案 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的示例。
答案 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中添加此节点。您应该在主场景中移动此节点的位置。