我有一个视图控制器,有三个skscenes作为孩子。
当我从一个过渡到另一个时,旧的skscene不会被解除分配。
我希望它能够被解除分配,好像它永远不存在一样。
示例:
当我第一次加载应用程序时,只有1个skscene可见(比如占用100mb内存),然后我转换到另一个(100mb以上),然后是第三个(300mb内存)。
我最终会得到300mb内存,而且我希望在任何时候都有100个内存。
我怎样才能做到这一点?
My view controller:
//
// ViewController.m
// Paddle Jumper
//
// Created by Chance Daniel on 1/18/14.
// Copyright (c) 2014 Max Hudson. All rights reserved.
//
#import "Flurry.h"
#import "ViewController.h"
#import "startViewController.h"
@implementation ViewController{
BOOL sceneSetUp;
}
- (void)viewWillLayoutSubviews
{
if(!sceneSetUp){
[super viewWillLayoutSubviews];
// Configure the view.
SKView * skView = (SKView *)self.view;
//skView.showsFPS = YES;
//skView.showsNodeCount = YES;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if([[defaults objectForKey:@"firstTime"] intValue] != 1){
[defaults setObject:[NSNumber numberWithInt:1] forKey:@"firstTime"];
[defaults setObject:@"ggr" forKey:@"skinSelected"];
[defaults setObject:[NSNumber numberWithInt:2] forKey:@"ggrOwned"];
[defaults setObject:[NSNumber numberWithInt:5000] forKey:@"gona"];
[defaults setObject:[NSNumber numberWithInt:1500] forKey:@"points"];
[defaults setObject:[NSNumber numberWithInt:7] forKey:@"livesLeftValue"];
[defaults setObject:[NSNumber numberWithInt:3] forKey:@"shieldsLeftValue"];
[defaults setObject:[NSNumber numberWithInt:2] forKey:@"lvlTwoLeftValue"];
[defaults setObject:[NSNumber numberWithInt:0] forKey:@"lvlThreeLeftValue"];
}
if(![defaults objectForKey:@"tut_game1"]){
[defaults setObject:[NSNumber numberWithInt:1] forKey:@"tut_game1"];
[defaults setObject:[NSNumber numberWithInt:1] forKey:@"tut_store"];
[defaults setObject:[NSNumber numberWithInt:1] forKey:@"tut_daily"];
}
[defaults synchronize];
// Create and configure the scene.
SKScene * startScene = [StartViewController sceneWithSize:skView.bounds.size];
startScene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:startScene];
//[skView presentScene:scene];
sceneSetUp = YES;
}
}
-(void) switchScene{
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
return UIInterfaceOrientationMaskAllButUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
@end
An SKScene that won't release: //
// SettingsSKScene.m
// Paddle Jumper
//
// Created by Max Hudson on 3/15/14.
// Copyright (c) 2014 Max Hudson. All rights reserved.
//
#import "SettingsSKScene.h"
#import "gameViewController.h"
#import "StoreScene.h"
@interface SettingsSKScene (){
SKSpriteNode *bg;
SKSpriteNode *masterOverlay;
SKSpriteNode *wbox;
SKSpriteNode *gamecenter;
SKSpriteNode *max;
SKSpriteNode *chance;
SKSpriteNode *bryce;
SKSpriteNode *home;
SKSpriteNode *play;
SKSpriteNode *chance_link;
SKSpriteNode *max_link;
SKSpriteNode *bryce_link;
SKSpriteNode *fbButton;
SKSpriteNode *fbToggleYes;
SKSpriteNode *fbToggleNo;
SKLabelNode *story1;
SKLabelNode *story2;
SKLabelNode *story3;
SKLabelNode *chance_name;
SKLabelNode *max_name;
SKLabelNode *bryce_name;
SKLabelNode *chance_role;
SKLabelNode *max_role;
SKLabelNode *bryce_role;
SKLabelNode *chance_handle;
SKLabelNode *max_handle;
SKLabelNode *bryce_handle;
SKTexture *bg_texture;
SKTexture *gamecenter_texture;
SKTexture *wbox_texture;
SKTexture *max_texture;
SKTexture *chance_texture;
SKTexture *bryce_texture;
SKTexture *home_texture;
SKTexture *play_texture;
SKTexture *fb_texture;
SKTexture *toggle_yes_texture;
SKTexture *toggle_no_texture;
}
@end
@implementation SettingsSKScene
-(id) initWithSize:(CGSize)size{
if(self = [super initWithSize:size]){
masterOverlay = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:self.frame.size];
masterOverlay.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
[self addChild:masterOverlay];
bg_texture = [SKTexture textureWithImageNamed:@"settings_bg"];
wbox_texture = [SKTexture textureWithImageNamed:@"white_rect_bg"];
gamecenter_texture = [SKTexture textureWithImageNamed:@"gc"];
max_texture = [SKTexture textureWithImageNamed:@"max"];
chance_texture = [SKTexture textureWithImageNamed:@"chance"];
bryce_texture = [SKTexture textureWithImageNamed:@"bryce"];
home_texture = [SKTexture textureWithImageNamed:@"home_light"];
play_texture = [SKTexture textureWithImageNamed:@"play_light"];
fb_texture = [SKTexture textureWithImageNamed:@"fb_light"];
toggle_yes_texture = [SKTexture textureWithImageNamed:@"toggle_yes"];
toggle_no_texture = [SKTexture textureWithImageNamed:@"toggle_no"];
NSArray *to_preload = @[bg_texture, wbox_texture, gamecenter_texture, max_texture, chance_texture, bryce_texture, home_texture, play_texture, fb_texture, toggle_yes_texture, toggle_no_texture];
[SKTexture preloadTextures:to_preload withCompletionHandler:^{
[self fadeRemove:masterOverlay];
[self initialize];
}];
}
return self;
}
-(void) fadeRemove: (SKNode *) node{
double duration = arc4random() % 10;
duration *= 0.05;
SKAction *fadeOut = [SKAction fadeOutWithDuration:0.1+duration];
SKAction *remove = [SKAction runBlock:^{
[node removeFromParent];
}];
[node runAction:[SKAction sequence:@[fadeOut, remove]]];
}
-(void) initialize{
bg = [SKSpriteNode spriteNodeWithTexture:bg_texture];
bg.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
bg.zPosition = 0;
wbox = [SKSpriteNode spriteNodeWithTexture:wbox_texture];
wbox.position = CGPointMake(self.frame.size.width/2, 70);
wbox.alpha = 0.8;
wbox.zPosition = 2;
gamecenter = [SKSpriteNode spriteNodeWithTexture:gamecenter_texture];
gamecenter.position = CGPointMake(self.frame.size.width/2 + 100, self.frame.size.height/2-2);
gamecenter.name = @"gc";
gamecenter.zPosition = 2;
fbButton = [SKSpriteNode spriteNodeWithTexture:fb_texture];
fbButton.size = CGSizeMake(36, 36);
fbButton.position = CGPointMake(self.frame.size.width/2 - 115, self.frame.size.height/2-2);
fbButton.name = @"fb";
fbButton.zPosition = 2;
fbToggleNo = [SKSpriteNode spriteNodeWithTexture:toggle_no_texture];
fbToggleNo.position = CGPointMake(self.frame.size.width/2 - 50, self.frame.size.height/2-2);
fbToggleNo.size = CGSizeMake(fbToggleNo.size.width/3, fbToggleNo.size.height/3);
fbToggleNo.name = @"fbno";
fbToggleNo.zPosition = 2;
fbToggleYes = [SKSpriteNode spriteNodeWithTexture:toggle_yes_texture];
fbToggleYes.position = CGPointMake(self.frame.size.width/2 - 70, self.frame.size.height/2-2);
fbToggleYes.name = @"fbyes";
fbToggleYes.zPosition = 2;
int hpBuffer = 40;
int hpZ = 2;
home = [SKSpriteNode spriteNodeWithTexture:home_texture];
home.position = CGPointMake(hpBuffer, self.frame.size.height - hpBuffer);
home.zPosition = hpZ;
home.name = @"home";
play = [SKSpriteNode spriteNodeWithTexture:play_texture];
play.position = CGPointMake(self.frame.size.width - hpBuffer, self.frame.size.height - hpBuffer);
play.zPosition = hpZ;
play.name = @"play";
[self addChild:bg];
[self addChild:wbox];
[self addChild:gamecenter];
[self addChild:home];
[self addChild:play];
[self addChild:fbButton];
[self addChild:fbToggleNo];
[self addCredits];
[self addStory];
}
-(void) addCredits{
/* images */
int cmbZ = wbox.zPosition + 1;
int cmbY = wbox.position.y;
int cmbXUnit = 132;
int cmbX = self.frame.size.width/2 - (3*cmbXUnit)/2 + 20;
int cmbWidth = 40;
chance = [SKSpriteNode spriteNodeWithTexture:chance_texture];
max = [SKSpriteNode spriteNodeWithTexture:max_texture];
bryce = [SKSpriteNode spriteNodeWithTexture:bryce_texture];
chance.zPosition = cmbZ;
max.zPosition = cmbZ;
bryce.zPosition = cmbZ;
chance.position = CGPointMake(cmbX+cmbXUnit*0, cmbY+3);
max.position = CGPointMake(cmbX+cmbXUnit*1 + 10, cmbY);
bryce.position = CGPointMake(cmbX+cmbXUnit*2 + 10, cmbY+5);
chance.size = CGSizeMake(cmbWidth, (chance.size.height/chance.size.width)*cmbWidth);
max.size = CGSizeMake(cmbWidth, (max.size.height/max.size.width)*cmbWidth);
bryce.size = CGSizeMake(cmbWidth, (bryce.size.height/bryce.size.width)*cmbWidth);
[self addChild:chance];
[self addChild:max];
[self addChild:bryce];
/* names */
int cmb_nameXUnit = 30;
int cmb_nameY = wbox.position.y - 10;
int cmb_nameFontSize = 18;
chance_name = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
max_name = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
bryce_name = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
chance_name.text = @"Chance Daniel";
max_name.text = @"Max Hudson";
bryce_name.text = @"Bryce Daniel";
chance_name.fontColor = [SKColor blackColor];
max_name.fontColor = [SKColor blackColor];
bryce_name.fontColor = [SKColor blackColor];
chance_name.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
max_name.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
bryce_name.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
chance_name.position = CGPointMake(chance.position.x + cmb_nameXUnit, cmb_nameY);
max_name.position = CGPointMake(max.position.x + cmb_nameXUnit, cmb_nameY);
bryce_name.position = CGPointMake(bryce.position.x + cmb_nameXUnit, cmb_nameY);
chance_name.fontSize = cmb_nameFontSize;
max_name.fontSize = cmb_nameFontSize;
bryce_name.fontSize = cmb_nameFontSize;
chance_name.zPosition = cmbZ;
max_name.zPosition = cmbZ;
bryce_name.zPosition = cmbZ;
[self addChild:chance_name];
[self addChild:max_name];
[self addChild:bryce_name];
/* roles */
int cmb_roleY = wbox.position.y - 25;
int cmb_roleFontSize = 11;
chance_role = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
max_role = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
bryce_role = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
chance_role.text = @"Programmer";
max_role.text = @"Programmer";
bryce_role.text = @"Graphic Designer";
chance_role.fontColor = [SKColor darkGrayColor];
max_role.fontColor = [SKColor darkGrayColor];
bryce_role.fontColor = [SKColor darkGrayColor];
chance_role.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
max_role.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
bryce_role.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeLeft;
chance_role.position = CGPointMake(chance.position.x + cmb_nameXUnit + 19, cmb_roleY);
max_role.position = CGPointMake(max.position.x + cmb_nameXUnit + 12, cmb_roleY);
bryce_role.position = CGPointMake(bryce.position.x + cmb_nameXUnit + 6, cmb_roleY);
chance_role.fontSize = cmb_roleFontSize;
max_role.fontSize = cmb_roleFontSize;
bryce_role.fontSize = cmb_roleFontSize;
chance_role.zPosition = cmbZ;
max_role.zPosition = cmbZ;
bryce_role.zPosition = cmbZ;
[self addChild:chance_role];
[self addChild:max_role];
[self addChild:bryce_role];
/* twitter handles */
int cmb_handY = wbox.position.y - 40;
int cmb_handFontSize = 10;
chance_handle = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
max_handle = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
bryce_handle = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
chance_handle.text = @"@ChanceOfThat";
max_handle.text = @"@max_hud";
bryce_handle.text = @"@BryceOfLife";
chance_handle.fontColor = [SKColor darkGrayColor];
max_handle.fontColor = [SKColor darkGrayColor];
bryce_handle.fontColor = [SKColor darkGrayColor];
chance_handle.position = CGPointMake(chance.position.x, cmb_handY);
max_handle.position = CGPointMake(max.position.x, cmb_handY);
bryce_handle.position = CGPointMake(bryce.position.x, cmb_handY);
chance_handle.fontSize = cmb_handFontSize;
max_handle.fontSize = cmb_handFontSize;
bryce_handle.fontSize = cmb_handFontSize;
chance_handle.zPosition = cmbZ;
max_handle.zPosition = cmbZ;
bryce_handle.zPosition = cmbZ;
[self addChild:chance_handle];
[self addChild:max_handle];
[self addChild:bryce_handle];
/* touchzones */
CGSize cmdL_size = CGSizeMake(120, 70);
SKColor *cmdL_color = [SKColor clearColor];
int cmdLZ = 3;
int cmdLX = cmbX + 40;
chance_link = [SKSpriteNode spriteNodeWithColor:cmdL_color size:cmdL_size];
max_link = [SKSpriteNode spriteNodeWithColor:cmdL_color size:cmdL_size];
bryce_link = [SKSpriteNode spriteNodeWithColor:cmdL_color size:cmdL_size];
chance_link.position = CGPointMake(cmdLX+cmbXUnit*0, cmbY);
max_link.position = CGPointMake(cmdLX+cmbXUnit*1 + 10, cmbY);
bryce_link.position = CGPointMake(cmdLX+cmbXUnit*2 + 10, cmbY);
chance_link.zPosition = cmdLZ;
max_link.zPosition = cmdLZ;
bryce_link.zPosition = cmdLZ;
chance_link.name = @"c_handle";
max_link.name = @"m_handle";
bryce_link.name = @"b_handle";
[self addChild:chance_link];
[self addChild:max_link];
[self addChild:bryce_link];
}
-(void) addStory{
int stX = self.frame.size.width/2;
int stZ = 2;
SKColor *stColor = [SKColor whiteColor];
story1 = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
story2 = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
story3 = [SKLabelNode labelNodeWithFontNamed:@"BebasNeue"];
story1.text = @"Gon";
story2.text = @"Help Gon-Gon and his friends get";
story3.text = @"Back to the time they came from!";
story1.fontColor = stColor;
story2.fontColor = stColor;
story3.fontColor = stColor;
story1.zPosition = stZ;
story2.zPosition = stZ;
story3.zPosition = stZ;
story1.position = CGPointMake(stX, self.frame.size.height - 55);
story1.fontSize = 50;
story2.position = CGPointMake(stX, self.frame.size.height - 95);
story2.fontSize = 30;
story3.position = CGPointMake(stX, self.frame.size.height - 120);
story3.fontSize = 20;
[self addChild:story1];
[self addChild:story2];
[self addChild:story3];
}
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touchUI = [touches anyObject];
CGPoint touchPoint = [touchUI locationInNode:self];
SKNode *touchNode = [self nodeAtPoint:touchPoint];
if([touchNode.name isEqualToString:@"home"]){
StartViewController *svc = [[StartViewController alloc] initWithSize:self.size];
SKTransition *fade = [SKTransition fadeWithColor :[SKColor blackColor] duration:0.4];
[self.view presentScene:svc transition:fade];
}
if([touchNode.name isEqualToString:@"play"]){
gameViewController *gvc = [[gameViewController alloc] initWithSize:self.size];
SKTransition *fade = [SKTransition fadeWithColor :[SKColor blackColor] duration:0.4];
[self.view presentScene:gvc transition:fade];
}
if([touchNode.name isEqualToString:@"gc"]){
NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:[NSNumber numberWithBool:1], @"showGC", nil];
[[NSNotificationCenter defaultCenter]postNotificationName:@"kNotificationUpdateBannerView" object:self userInfo:dict];
}
if([touchNode.name isEqualToString:@"c_handle"]){
NSURL *urlApp = [NSURL URLWithString: [NSString stringWithFormat:@"%@", @"twitter:///user?screen_name=ChanceOfThat"]];
int worked = [[UIApplication sharedApplication] openURL:urlApp];
if(!worked){
NSURL *urlApp = [NSURL URLWithString: [NSString stringWithFormat:@"%@", @"https://twitter.com/#!/ChanceOfThat"]];
[[UIApplication sharedApplication] openURL:urlApp];
}
}
if([touchNode.name isEqualToString:@"m_handle"]){
NSURL *urlApp = [NSURL URLWithString: [NSString stringWithFormat:@"%@", @"twitter:///user?screen_name=max_hud"]];
int worked = [[UIApplication sharedApplication] openURL:urlApp];
if(!worked){
NSURL *urlApp = [NSURL URLWithString: [NSString stringWithFormat:@"%@", @"https://twitter.com/#!/max_hud"]];
[[UIApplication sharedApplication] openURL:urlApp];
}
}
if([touchNode.name isEqualToString:@"b_handle"]){
NSURL *urlApp = [NSURL URLWithString: [NSString stringWithFormat:@"%@", @"twitter:///user?screen_name=BryceOfLife"]];
int worked = [[UIApplication sharedApplication] openURL:urlApp];
if(!worked){
NSURL *urlApp = [NSURL URLWithString: [NSString stringWithFormat:@"%@", @"https://twitter.com/#!/BryceOfLife"]];
[[UIApplication sharedApplication] openURL:urlApp];
}
}
}
@end
答案 0 :(得分:17)
提问question的人面临类似的问题。
当被问及是否能够解决问题时,他们说:
是的,我做到了,从现场起我无能为力 或者Sprite Kit就此而言,我只需要删除场景和 完全从父视图中包含它的视图,剪切它的全部 绑定到系统的其他部分,以便记忆 也解除了分配。
您应该为每个场景使用单独的视图,并在这些视图之间进行转换。您可以按照以下步骤使其看起来自然:
1 - 在您想要从一个场景转换到另一个场景时,使用以下代码拍摄场景的快照:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
然后,将此图像添加为当前场景的SKView的子视图,并删除场景。
2 - 在另一个视图上初始化新场景,并使用UIView动画在两个视图之间转换。
3 - 从它的超级视图中删除第一个视图。
答案 1 :(得分:5)
我刚刚开始使用Swift中的SpriteKit而且我遇到了同样的问题:我的“介绍”场景正在播放一些我希望在转换到主菜单场景后停止的音乐,我认为deinit将是一个好地方放入AVAudioPlayer.stop调用,但是从未调用deinitializer。
经过一番环顾,我了解到这可能是因为对场景的一些强烈引用,所以我改变了
let s = StartupScene(size: skView.bounds.size)
skView.presentScene(s)
到
skView.presentScene(StartupScene(size: skView.bounds.size))
在我的GameViewController中:UIViewController和
let s = MainMenuScene(size: self.size)
let t = SKTransition.crossFadeWithDuration(1)
self.scene.view.presentScene(s, transition: t)
到
self.scene.view.presentScene(MainMenuScene(size: self.size), transition: SKTransition.crossFadeWithDuration(1))
在我想要解除分配的场景中,它有效!转换完成后,deinit方法被调用。
希望有经验的人可以编辑这个答案,以便更好地解释这里究竟发生了什么。
答案 2 :(得分:0)
编辑:我之前关于NSTimer的想法是无关紧要的
要确保这是与此场景隔离的问题,请覆盖您可能拥有的所有场景(包括此场景)的dealloc方法,如下所示:
-(void)dealloc {
NSLog(@"Dealloc <scene name>");
}
查看其他场景转换,看看它们是否正确解除分配。找出这些场景之间的差异。这将帮助您了解它是一个孤立的问题还是一个更大的问题。一旦你解决了问题,一定要注释掉或删除dealloc方法,因为它会覆盖实际释放内存的那个。希望这有帮助!
答案 3 :(得分:0)
只要我能看到,SKScene或SKView没有任何问题。确保场景实例在其他任何地方都不是强引用,尤其是在块内。块极有可能被忽略。
有关块内弱引用的更多信息:https://stackoverflow.com/a/17105368/571489
据我所知,你确实有一个强烈引用场景实例的块:
[SKTexture preloadTextures:to_preload withCompletionHandler:^{
[self fadeRemove:masterOverlay];
[self initialize];
}];
答案 4 :(得分:0)
2019年12月/迅捷5
更新:
我的布局:
我有一个单视图控制器,其中包含 2个SKView ,每个视图都有自己独特的SKScene,这些SKScene会同时显示。一个SKView及其SKScene是主要的游戏世界,在该世界中,玩家角色被渲染,控制,NPC渲染,摄像机跟踪,整个射手等,而另一个SKView及其SKScene显示该游戏世界的迷你地图。 您可以想象也有很多SKSpriteNode,其中许多总是具有某种不间断运行的SKAction /动画(例如,摇曳的树木)。我的SKScenes甚至包含它们自己的数组,这些数组指向特定的SKSpriteNodes组,例如字符节点,建筑节点,树节点。这是为了快速访问和方便起见。 另外,我有一些单例,其中包含SKTextures数组或字符模型等。它们作为快速数据访问的优化而保留,而不是每次需要时都从磁盘/访问存储中读取。 视图控制器内部甚至还有用于游戏UI的UIKit元素。 许多其他对象,例如我的模型,其中包含有关角色,建筑物,整个游戏会话的数据,都具有某种指向某人的委托。最重要的是,代码库非常庞大。
在调试会话中观察内存后,我发现确保没有保留任何内容的肯定方法是绝对确保以下各项:
内存处理:
*注意:如果您有1个用于整个应用程序的视图控制器(祝贺您挤压所有内容-优兹霸主挤压器),那么请不要将所有内容都设为零并谨慎使用。但是在演示过程中,仍需要将前一个场景设置为nil。
如果您在视图控制器之间进行切换,则类似以下内容:
/// Remove all pointers to any data, nodes & views.
fileprivate func cleanUp() {
guard self.skView != nil else { return }
// Session was passing data updates to this view controller; time to nil it
self.gameSessionModel.delegate = nil
self.skView.presentScene(nil)
self.skViewMiniMap.presentScene(nil)
self.skView = nil
self.skViewMiniMap = nil
for subview in self.view.subviews {
subview.removeFromSuperview()
}
}
/// Take the user back to the main menu module/view controller.
fileprivate func handleMenuButton() {
// First, clean up everything
self.cleanUp()
// Then go to the other view controller
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "MainViewController")
self.show(view, sender: .none)
}
如果您只用一个SKView呈现不同的SKScene,则如下所示:
/// Remove all pointers to any data, nodes & views.
fileprivate func cleanUp() {
self.skView.presentScene(nil)
// Previous scene was set to nil, its deinit called. Now onto the new scene:
let gameScene = self.setupGameScene(id: "perhapsYouUseStringIDsToDisntiguishBetweenScenes?")
self.skView.presentScene(gameScene)
}
*注意:不要忘记使用SKScene的 deinit 方法删除不需要的内容。在我的课程中,我经常使用 all 来解开我可能错过的任何内容。