2016-04-08 34 views
0

对于所有场景,我有一个用于背景的图像,是否有可能为背景编写某处代码,因此我不必将它写在每个场景中,并且如果它在那里我需要把它放?现在我用这个基本代码:所有场景的一个背景图像目标c

background = [SKSpriteNode spriteNodeWithImageNamed:@"backMenu.png"]; 
    titleBackground.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)); 
    titleBackground.size = self.frame.size; 
    titleBackground.zPosition = -10; 
    [self addChild:background]; 
+0

你可以用你所有的设置创建'SKSpriteNode'的子类,但是如果你想在场景中使用它,我认为你仍然需要将它添加到场景中。 – Gliderman

回答

1

如果您有一个在场景中重复的代码,那么您可以创建一个BaseScene并将该代码放在那里。所以,场景之间共享的所有东西都会进入BaseScene

BaseScene.h:

#import <SpriteKit/SpriteKit.h> 

@interface BaseScene : SKScene 

@end 

BaseScene.m

#import "BaseScene.h" 

@interface BaseScene() 

@property(nonatomic, strong) SKSpriteNode *background; 

@end 

@implementation BaseScene 


-(void)didMoveToView:(SKView *)view{ 

    self.background = [SKSpriteNode spriteNodeWithImageNamed:@"backMenu"]; 
    [self addChild:self.background]; 

} 

@end 

GameScene.h(现在GameSceneBaseScene继承,而不是从SKScene

#import <SpriteKit/SpriteKit.h> 
#import "BaseScene.h" 


@interface GameScene : BaseScene 

@end 

GameScene.m

#import "GameScene.h" 

@implementation GameScene 

-(void)didMoveToView:(SKView *)view { 
    /* Setup your scene here */ 

    [super didMoveToView:view]; 
} 
@end 

最后,你在BaseScene的每个子类,调用BaseScene,这反过来又增加了背景节点到当前场景的didMoveToView:[super didMoveToView:view];

0

一个SKNode只能属于一个场景。因此,您需要为每个场景添加背景的SKSpriteNode

假设您将根据需要创建和销毁场景,您应该做的是维护对背景的参考SKTexture

那么在这种情况下,需要

background = [SKSpriteNode spriteNodeWithTexture:backgroundTex]; 

这样,你会添加此基础上您的应用程序时的情景创建SKSpriteNode

在上面的例子中,backgroundTex将是您的参考。你应该把它存储在一个维护它的对象中。如果你有一个纹理管理器,你应该可以通过引用名称来请求已经分配的纹理。