SKView bounds.size се обръща при събитие с докосване (Sprite Kit)

Моля, помогнете ми да разбера следното поведение (iOS Sprite Kit).

Резултатът от кода, който представям по-долу, е:

1.skView.bounds.size = 768.00, 1024.00

2.skView.bounds.size = 1024.00, 768.00

Както се вижда по-горе, ширината и височината се превключват между двата метода и това кара втората ми сцена да не бъде представена в правилния мащаб.

Моята игра ще работи само в пейзажен режим, което означава, че всъщност второто съотношение ширина x височина е правилното (макар че е първото, което изобразява сцената в правилното съотношение на страните, което само по себе си е мистерия за мен) .

Може ли някой да ми каже как мога да коригирам това поведение? какво правя грешно

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.currentGameState = GS_INTRO_SCENE;

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    // Create and configure the scene.

    printf("1.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

    SKScene *scene = [SKTGameIntroScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [skView presentScene:scene];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (self.currentGameState == GS_INTRO_SCENE) {
        self.currentGameState = GS_GAME_PLAY;

        SKView * skView = (SKView *)self.view;

        printf("2.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

        SKScene *nextScene = [SKTMyScene sceneWithSize:skView.bounds.size];
        nextScene.scaleMode = SKSceneScaleModeAspectFill;

        SKTransition *fadeIn = [SKTransition fadeWithDuration:5.0f];

        [skView presentScene:nextScene transition:fadeIn];
    }
}

Оценявам го много предварително.

** редактиране: **

@giorashc реши проблема ми, предлагайки да преместя инициирането на сцената към метода -(void)viewWillLayoutSubviews.

Но втората ми сцена остава разтегната.... тук е пълният код за SKTViewController.m след промяната (може ли някой да каже защо вторият изглед все още е разтегнат?):

//
//  SKTViewController.m
//  SpriteKitTest
//
//  Created by Claudia Dazcal on 13/07/14.
//  Copyright (c) 2014 DazcalFamily_inc. All rights reserved.
//

#import "SKTViewController.h"
#import "SKTMyScene.h"
#include "SKTGameIntroScene.h"

typedef enum
{
    GS_INTRO_SCENE,
    GS_GAME_PLAY
}GameStates;

@interface SKTViewController ()

@property GameStates currentGameState;
@property BOOL firstSceneLoaded;

@end

@implementation SKTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.currentGameState = GS_INTRO_SCENE;

    self.firstSceneLoaded = NO;

}

-(void)viewWillLayoutSubviews
{
    if (!self.firstSceneLoaded) {
        self.firstSceneLoaded = YES;

        // Configure the view.
        SKView * skView = (SKView *)self.view;
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        // Create and configure the scene.

        printf("1.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

        SKScene *scene = [SKTGameIntroScene sceneWithSize:skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeAspectFill;

        // Present the scene.
        [skView presentScene:scene];

    }

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (self.currentGameState == GS_INTRO_SCENE) {
        self.currentGameState = GS_GAME_PLAY;

        SKView * skView = (SKView *)self.view;

        printf("2.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

        //CGSize DebugSize = CGSizeMake(skView.bounds.size.height, skView.bounds.size.width);

        //SKScene *nextScene = [SKTMyScene sceneWithSize:DebugSize];
        SKScene *nextScene = [SKTMyScene sceneWithSize:skView.bounds.size];
        nextScene.scaleMode = SKSceneScaleModeAspectFill;

        //SKTransition *fadeIn = [SKTransition fadeWithDuration:5.0f];

        //[skView presentScene:nextScene transition:fadeIn];
        [skView presentScene:nextScene];
    }
}

- (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

* редактиране 2 **

Добре, вече всичко е подредено.

@giorashc реши проблема ми веднага, когато предложи да преместите инициирането на сцената към viewWillLayoutSubviews. Оказва се, че тъй като преди това работех с грешни граници, настроих оригиналната си сцена с грешни стойности и сега, когато беше коригирана, изглеждаше разтеглена.

Но сега е поправено. Благодаря ти много @giorashc!!


person Spinn80    schedule 20.07.2014    source източник


Отговори (2)


Инициализирайте вашата сцена в метода viewWillLayoutSubviews. При този метод границите на изгледа се актуализират правилно.

Уверете се обаче, че инициализирате сцената само веднъж, тъй като този метод се извиква всеки път, когато контролерът за изглед представя друг контролер за изглед или приложението променя ориентацията си.

person giorashc    schedule 20.07.2014
comment
Благодаря ви, реши проблема с промененото съотношение, което видях. Но втората ми сцена все още е разтегната с превключено съотношение на страните (въпреки че виждам в изхода си съотношението на страните всъщност не е превключено)... някаква идея защо?? - person Spinn80; 20.07.2014
comment
къде създаваш втората си сцена? можеш ли да покажеш кода? (Редактирайте въпроса си с кода, ако е възможно) - person giorashc; 20.07.2014
comment
преди представяне на втората сцена какви граници се отпечатват? такива ли са каквито очакваш да бъдат? - person giorashc; 21.07.2014
comment
Благодаря ти @giorashc. Решено е (благодарение на вас)... Обяснявам го в самия въпрос - person Spinn80; 21.07.2014

При първия метод изгледът все още не е завъртян в пейзажен режим. Във втория се е завъртял в пейзажен режим, така че сега отчита граници, които са по-широки, отколкото високи.

person Cooper Buckingham    schedule 20.07.2014