Различия между симулятором и точкой контакта устройства?

Я боролся с этим некоторое время сейчас и, похоже, не могу найти проблему.

у меня есть SKScene который я буду называть selfи SKNode это называется chapterScene что добавляется к self, У меня есть граница, которая содержит подвижный символ. Вот как я это настроил

ViewController.m (контроллер, который представляет SKScene подкласс OLevel

- (void)viewDidLoad {
    [super viewDidLoad];

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

    // Create and configure the scene.
    scene = [OLevel sceneWithSize:self.view.frame.size];
    scene.scaleMode = SKSceneScaleModeAspectFit;

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

    // Do things after here pertaining to initial loading of view.
}

Вот мой OLevel.m

- (id)initWithSize:(CGSize)size {

    if (self = [super initWithSize:size]) {
        NSLog(@"Creating scene");

        [self setUpScene];
    }

    return self;
}

- (void)setUpScene {

    NSLog(@"Setting up scene");
    //self.speed = 0.9f;

#pragma 1 Set up scene

    // Set up main chapter scene
    self.anchorPoint = CGPointMake(0.5, 0.5); //0,0 to 1,1
    chapterScene = [SKNode node];
    chapterScene.position = CGPointZero;
    chapterScene.name = @"chapterScene";
    [self addChild:chapterScene];


    // Set up physics boundary
    self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);
    self.physicsWorld.contactDelegate = self;
    .
    .
    .
}

Суть в том, что в конечном итоге я правильно настроил свою сцену и ее дочерние узлы (как я и ожидал до недавнего времени). Когда я бегу на симуляторе (iPhone 6), я использую - (void)didBeginContact:(SKPhysicsContact *)contact метод контроля и столкновения. Всякий раз, когда контакт начинается, я регистрирую следующее

CGPoint contactPoint = contact.contactPoint;
NSLog(@"non conv: %f, %f", contactPoint.x, contactPoint.y);
CGPoint sceneContactPoint = [self convertPoint:contactPoint toNode:chapterScene];
NSLog(@"1 conv pt: %f, %f", sceneContactPoint.x, sceneContactPoint.y);

Я также регистрирую положение символов, чтобы убедиться, что эта преобразованная точка верна.

Когда я запускаю это на симуляторе, и персонаж движущегося узла попадает в стену, я получаю это:

2016-02-25 20:02:31.102 testGame[43851:14374676] non converted point: 0.143219, 29.747963
2016-02-25 20:02:31.102 testGame[43851:14374676] 1 conv pt: -140.206223, 615.699341
2016-02-25 20:02:31.102 testGame[43851:14374676] Player hit the wall
2016-02-25 20:02:31.103 testGame[43851:14374676] player pos: -140.206238, 590.749268

что совершенно правильно.

ОДНАКО, по какой-то причине я не могу найти, это точно такой же код работает на моем iPhone 5C...

2016-02-25 20:04:50.062 testGame[2907:1259447] non converted point: 160.337631, 310.808350
2016-02-25 20:04:50.063 testGame[2907:1259447] 1 conv pt: 70.996162, 900.004272
2016-02-25 20:04:50.064 testGame[2907:1259447] Player hit the wall
2016-02-25 20:04:50.065 testGame[2907:1259447] player pos: -89.003845, 593.984009

Я действительно надеюсь, что это простое исправление, которое мне не хватает. Если кто-нибудь может мне помочь, я был бы очень признателен. Спасибо

ОБНОВЛЕНИЕ Похоже, что все, что происходит, это то, что когда я запускаю его на симуляторе, на точку ссылаются из центра экрана (0,0), тогда как на устройстве контрольная точка - это истинное начало, верхний левый угол (0,0), с центром в случае iPhone 5c(160, 284). Все еще не уверен, как исправить это... или почему это даже происходит.

Пока что это единственное решение, которое я могу придумать...

if (!TARGET_OS_SIMULATOR) {
    contactPoint = CGPointMake(sceneContactPoint.x - screenBounds.size.width/2.0f, sceneContactPoint.y - screenBounds.size.height/2.0);
}
else {
    contactPoint = CGPointMake(sceneContactPoint.x, sceneContactPoint.y);
}

Но это неловко. Либо это ошибка в Xcode или Apple, либо есть причина, по которой это происходит, и другое решение.

0 ответов

Другие вопросы по тегам