Может быть, кто-то может указать мне в правильном направлении, здесь, потому что я бил головой о стену над этим. Основные проблемы с моей головой, обернутыми вокруг 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
я уже говорил, что я делаю все программно. Существует ли программный эквивалент? – baptzmoffire
Банши, вы подтвердили, что это работает? Так вы это делаете? Я все еще работаю над этой проблемой. Перезаписывая мой проект с помощью раскадровки, и я собираюсь попробовать это. – baptzmoffire
Я сталкиваюсь с той же проблемой, что и вы упомянули выше. Но используя представление как skview, моя проблема решена. – Banshi