PortraitMode in viewDidLoad zu Landscape

robink

Golden Delicious
Registriert
13.07.15
Beiträge
7
Guten Tag,

und zwar habe ich folgendes Problem. Ich spiele momentan nur ein bisschen mit den physics rum, die im SpriteKit bereitgestellt werden. Nun ist mir folgendes aufgefallen.

Ich habe einen SpriteKitNode erstellt und diesen in der Mitte des Bildschirms angezeigt. Nun wollte ich mit gravitation das ding fallen lassen. Klappt, es fällt allerdings aus dem Bild. Ich dachte die Methode self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; würde mir helfen und das Rechteck machen, tut es allerdings nur im Portrait modus. Da meine App später aber ausschließlich im Landscape Modus funktionieren soll, bräuchte ich dafür Vorschläge / Lösungsansätze, wie man das macht.

Das Männchen fällt also immer auf den Boden des Portrait Modusses, auch wenn der Controller im Landscape angezeigt ist, es fällt im Landscape also aus dem Bild!


GameScene.m

Code:
-(void)didMoveToView:(SKView *)view {
    /* Setup your scene here */
   
    // Hintergrund auf weiß setzen
    self.backgroundColor = [SKColor whiteColor];
   
    // add a physics body to scene, its the rectangled screen
    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
   
    // gravity
   
    self.physicsWorld.gravity = CGVectorMake(0, -0.5);
   
    // Get Sanchez
   
    SKSpriteNode *sanchez = [SKSpriteNode spriteNodeWithImageNamed:@"characterR2"];
   
    // Sanchez Positioning
   
    sanchez.position = CGPointMake(CGRectGetMidX(self.frame),
                                   CGRectGetMidY(self.frame));
   
    // physics
   
    sanchez.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sanchez.frame.size.width / 2.0];  // sanchez als ball-form
   
    // Add Sanchez to the scene
   
    [self addChild:sanchez];
   
    // apply impuls
    //[sanchez.physicsBody applyImpulse:CGVectorMake(20, 20)];
}

gameviewcontroller.m

Code:
//
//  GameViewController.m
//  SanchezBrick
//
//  Created by Robin Kirsch on 13.07.15.
//  Copyright (c) 2015 Robin Kirsch. All rights reserved.
//

#import "GameViewController.h"
#import "GameScene.h"

@implementation SKScene (Unarchive)

+ (instancetype)unarchiveFromFile:(NSString *)file {
    /* Retrieve scene file path from the application bundle */
    NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"];
    /* Unarchive the file to an SKScene object */
    NSData *data = [NSData dataWithContentsOfFile:nodePath
                                          options:NSDataReadingMappedIfSafe
                                            error:nil];
    NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [arch setClass:self forClassName:@"SKScene"];
    SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey];
    [arch finishDecoding];
   
    return scene;
}

@end

@implementation GameViewController

- (void)viewDidLoad{
    [super viewDidLoad];

   
    // Configure the view.
    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;
    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = YES;
   
    // Create and configure the scene.
    GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"];
    scene.scaleMode = SKSceneScaleModeAspectFill;
   
    // Present the scene.
    [skView presentScene:scene];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

@end

Über Hilfe würde ich mich sehr freuen.

Mit freundlichen Grüßen

Robin
 

ecco55

Tokyo Rose
Registriert
26.10.14
Beiträge
71
Ich hab das damals in einem SpriteKit Game von mir, relativ einfach gelöst. du nimmst einfach einen 2ten Node der 1px hoch ist und halt so breit wie das Display und setzt den einfach unter die Bildschirmkanten. Und diesen Node musst du quasi als festes Objekt deklarieren. aber ehrlich gesagt weiß ich nicht mehr genau, wie es geht. Aber was du ausprobieren kannst. Wenn du den Node initialisiert hast:

[node].physicsBody.mass = 1;
[node].physicsBody.usesPreciseCollisionDetection = YES;

Musst du ein wenig herumprobieren.

Viele Grüße,
Daniel
 

robink

Golden Delicious
Registriert
13.07.15
Beiträge
7
Danke für die Antwort.

Ich habe es jetzt so gelöst :

SKPhysicsBody *worldBorder = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, kGroundHeight, self.size.width, self.size.height)];