2013-09-25 1 views
3

Может быть, кто-то может указать мне в правильном направлении, здесь, потому что я бил головой о стену над этим. Основные проблемы с моей головой, обернутыми вокруг Sprite Kit и совместимостью UIKit.UIView> SKView ... willMoveFromView: не вызывается, когда ожидается, и спрайты не «обновлены»

Моя игра начинается со стола, в котором хранятся все игры игрока в отдельных ячейках (а-ля с друзьями). Когда ячейка прослушивается, я загружаю SKView, который заранее представляет SKScene, содержащую все соответствующие игровые данные, загруженные с Parse.com.

Проблема в том, что я не могу понять, как заставить сцену «обновить» из-за отсутствия лучшего термина со всеми текущими игровыми данными. Представленная сцена просто показывает фоновое изображение и несколько других изображений, как и ожидалось, но спрайты, которые должны быть на экране, не являются. Вместо этого, это спрайты, которые были на экране, когда я выскочил из SKScene последним. Я могу зарегистрировать все прошедшие в игре данные в консоли, поэтому я знаю, что там нет проблем. Кроме того, когда я выполняю какое-то действие на спрайтах сцены (удаление, обновление и т. Д.), Это заставляет сцену и весь ее спрайт вроде «просыпаться», и все спрайты, которые должны были там появляться ,

Вторая, возможно, связанная с этим проблема заключается в том, что, когда я перебираю SKScene обратно в основной вид таблицы, willMoveFromView: не вызывается. (Вот где я делаю весь код очистки для спрайтов, фона, кнопок и т. Д.) Только когда я нажимаю эту же ячейку таблицы и возвращаюсь к той же игровой сцене, что willMoveFromView: получает вызов. Не следует ли его вызвать, чтобы выскочить из SKScene/SKView? Но, опять же, я столкнулся с той же проблемой «обновления», где сцена похожа на замороженные старые данные/спрайты. Есть идеи? Я попытался включить весь соответствующий код, но я не думаю, что вы найдете что-то необычное. Мое чувство это больше концептуальной проблемы и мои комментарии выше достаточно:

@interface MGGameMenuViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate, NSURLConnectionDataDelegate, UIAlertViewDelegate> 


@property (nonatomic, retain) UITableView *tView; 
@property (nonatomic, readwrite) MGSpriteKitViewController *skvc; 



@end 


@implementation MGGameMenuViewController 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == 0) { 
     self.matchtoBePassedIn = [self.yourTurnArray objectAtIndex:indexPath.row]; 
     [self launchGamePlaySceneWithMatchData:self.matchtoBePassedIn]; 
    } 

    else if (indexPath.section == 1) { 
     self.matchtoBePassedIn.cardsDealt = [NSMutableArray arrayWithCapacity:9]; 
     self.matchtoBePassedIn = [self.theirTurnArray objectAtIndex:indexPath.row]; 
     [self launchGamePlaySceneWithMatchData:self.matchtoBePassedIn]; 
    } 

    else { 
     NSLog(@"section chosen was neither 0 nor 1."); 
    } 
} 

// launch gameplay 
-(void)launchGamePlaySceneWithMatchData:(MGMatch *)match { 
    if (self.skvc == nil) { 
     MGSpriteKitViewController *spriteKitVC = [[MGSpriteKitViewController alloc] initWithNibName:@"MGSpriteKitViewController" bundle:nil]; 
     spriteKitVC.matchToBePassedFromGameMenuToGameplayScene = match; 
     self.skvc = spriteKitVC; 
    } 

    if (self.skvc) { 
     @try { 
      if (![self.skvc isBeingPresented]) { 
       self.skvc.matchToBePassedFromGameMenuToGameplayScene = match; 
       [self.navigationController pushViewController:self.skvc animated:YES]; 
      } 
     } 
     @catch (NSException *exception) { 
      NSRange range = [exception.reason rangeOfString:@"Pushing the same view controller instance more than once is not supported"]; 
      NSRange range2 = [exception.reason rangeOfString:@"Tried to pop to a view controller that doesn't exist"]; 
      if([exception.name isEqualToString:@"NSInvalidArgumentException"] && 
       range.location != NSNotFound) { 
       NSLog(@"[MGGameMenuViewController] NSInvalidArgumentException caught."); 
       if (![self.skvc isBeingPresented]) { 
        self.skvc.matchToBePassedFromGameMenuToGameplayScene = match; 
        [self.navigationController popToViewController:self.skvc animated:YES]; 
       } 
      } 
      if ([exception.name isEqualToString:@"NSInternalInconsistencyException"] && range2.location != NSNotFound) { 
       if (![self.skvc isBeingPresented]) { 
        self.skvc.matchToBePassedFromGameMenuToGameplayScene = match; 
        [self.navigationController pushViewController:self.skvc animated:YES]; 
       } 
      } 
     } 
     @finally { 
      NSLog(@"[MGGameMenuViewController] finally"); 
     } 
    } 
    [self.navigationController.navigationBar setHidden:YES]; 
} 

// SKView

SKView *spriteView; 

@interface MGSpriteKitViewController : UIViewController 
@property (nonatomic, retain) MGMatch *matchToBePassedFromGameMenuToGameplayScene; 
@property (nonatomic, retain) MGGameplayScene *gameplayScene; 
@end 

@implementation MGSpriteKitViewController 

@synthesize matchToBePassedFromGameMenuToGameplayScene, gameplayScene; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    spriteView = (SKView *)self.view; 
    spriteView.showsDrawCount = NO; 
    spriteView.showsFPS   = NO; 
    spriteView.showsNodeCount = YES; 
} 

-(void)viewWillAppear:(BOOL)animated { 
    self.gameplayScene = [[MGGameplayScene alloc] initWithSize:CGSizeMake(320.0f, 568.0f)]; 
    self.gameplayScene.passedInMatch = self.matchToBePassedFromGameMenuToGameplayScene; 
    self.gameplayScene.playerImageCache = self.playerImageCache; 
    [spriteView presentScene:self.gameplayScene]; 
} 

-(void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:YES]; 
    self.gameplayScene = nil; 
} 

@end 

// SKScene где геймплей происходит

@interface MGGameplayScene : SKScene 
@property (nonatomic) contentCreated; 
... various assets 
@end 



@implementation MGGameplayScene 

-(void)didMoveToView:(SKView *)view { 
    if (self.contentCreated == NO) { 
     [self createSceneContents]; 
     self.contentCreated = YES; 
    } 
} 

-(void)willMoveFromView:(SKView *)view { 
    [self removeAllChildren]; 
} 

// for practicies 
-(void)createSceneContents { 
    self.backgroundColor = [UIColor whiteColor]; 
    self.scaleMode = SKSceneScaleModeAspectFit; 
    [self setAllAssetsToNil]; 
    [self recreateAssetsWithRelevantData]; 
} 

@end 

ответ

3

В Storyboard присваивает класс uiview в MGSpriteKitViewController как skview.

+0

я уже говорил, что я делаю все программно. Существует ли программный эквивалент? – baptzmoffire

+0

Банши, вы подтвердили, что это работает? Так вы это делаете? Я все еще работаю над этой проблемой. Перезаписывая мой проект с помощью раскадровки, и я собираюсь попробовать это. – baptzmoffire

+0

Я сталкиваюсь с той же проблемой, что и вы упомянули выше. Но используя представление как skview, моя проблема решена. – Banshi

2

Вопрос заключается в том, что MGSpriteKitViewController по умолчанию создает UIView для его вида собственности.

Чтобы программно создать представление как SKView, вы должны переопределить loadView метод вашего MGSpriteKitViewController:

@implementation MGSpriteKitViewController 

- (void)loadView 
{ 
    self.view = [[SKView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
} 

// Rest of Code 
... 
Смежные вопросы