Преобразование точек в узел в Sprite-Kit

Я работаю над этой проблемой в течение нескольких дней, и я просто не могу понять это. Я потратил массу времени на поиск ответа, и я видел намеки на то, что, возможно, проблема в самом Sprite-Kit, поэтому я обсуждаю переход на Cocos2D и начало заново. Но я надеюсь, что кто-то здесь может мне помочь.

У меня есть базовый узел камеры под названием _world, который я использую для перемещения по всему миру и для увеличения. Панорамирование и масштабирование работают хорошо, но я пытался заставить мировой узел переместиться в центр того места, где происходит щепотка. Это вроде работает, но преобразование точки в позицию в мировом узле, похоже, является проблемой. Вот мой код:

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

CGPoint positionInScene = [touch locationInNode:self];
CGPoint locationInWorld = [self.scene convertPoint:positionInScene toNode:_world];

Но позже я пытаюсь сделать это, используя среднюю точку двух точек, найденных в пинче, и кажется, что она не конвертируется должным образом:

originalLocationOne = [sender locationOfTouch:0 inView:self.view];
originalLocationTwo = [sender locationOfTouch:1 inView:self.view];
//I do this because SpriteKit doesn't have a ccpAdd method
originalAddedMidPoint = CGPointMake(originalLocationOne.x + originalLocationTwo.x, originalLocationOne.y + originalLocationTwo.y);
//same thing here but for ccpMidPoint
originalMidPoint = CGPointMake(originalAddedMidPoint.x * 0.5f, originalAddedMidPoint.y * 0.5f);
_newWorldPos = [self convertPoint:originalMidPoint toNode:_world];

Я был бы очень признателен, если бы кто-то указал мне правильное направление! Спасибо вам большое!

РЕДАКТИРОВАТЬ: Я работал над этой проблемой еще немного, и, конечно, происходит что-то странное, но я до сих пор не могу сказать, что. Вот мой полный метод штрихов:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    _myTouches = [[NSMutableArray alloc]init];
    for (UITouch *touch in touches) {
        [_myTouches addObject:touch];
    }
    if (_myTouches.count > 1) {
        UITouch *touch1 = [_myTouches objectAtIndex:0];
        UITouch *touch2 = [_myTouches objectAtIndex:1];
        CGPoint touch1Location = [touch1 locationInView:self.view];
        CGPoint touch2Location = [touch2 locationInView:self.view];
        NSLog(@"tpoint1 = %@, tpoint2 = %@", NSStringFromCGPoint(touch1Location), NSStringFromCGPoint(touch2Location));
        CGPoint touchAddedPoint = CGPointMake(touch1Location.x + touch2Location.x, touch1Location.y + touch2Location.y);
        CGPoint touchMidPoint = CGPointMake(touchAddedPoint.x * 0.5f, touchAddedPoint.y * 0.5f);
        NSLog(@"touch mid point = %@", NSStringFromCGPoint(touchMidPoint));
        CGPoint newWorldPoint = [self convertTouchPointToWorld:touchMidPoint];

        //camera needs to be offset to work properly
        CGPoint alteredWorldPoint = CGPointMake(-newWorldPoint.x * 0.75f, -newWorldPoint.y * 0.75f);

       _firstTouch = alteredWorldPoint;
       _tempWorldLocation = _firstTouch;
       _worldMovedForUpdate = YES;
    }
}

Вот метод, который я извлек, чтобы преобразовать позицию в мировой узел:

-(CGPoint) convertTouchPointToWorld:(CGPoint)touchLocation {
    CGPoint firstLocationInWorld = [self.scene convertPoint:touchLocation toNode:_world];
    NSLog(@"inside converting method %@", NSStringFromCGPoint(firstLocationInWorld));
    return firstLocationInWorld;
}

Вот полный метод размещения здания на игровой карте в зависимости от его положения на карте мира:

-(void)selectNodeForTouch:(CGPoint)touchLocation {
    SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:touchLocation];
    //NSLog(@"node name is = %@", touchedNode.name);

    _selectedNode = touchedNode;
    if ([[touchedNode name] isEqualToString:@"hudswitch1"]) {
        if([self.theGame getMovesLeft] == 0){
            _hudNeedsUpdate = YES;
            _turnNeedsUpdating = YES;
        }
    }
    if ([self.theGame getMovesLeft] > 0) {
        [self handleButtonsForTouch:touchedNode];
    }
    //this inserts the tile at the location in world node
    NSLog(@"touchLocation.x = %f, touchlocation.y = %f", touchLocation.x, touchLocation.y);
    if ([[touchedNode name] isEqualToString:@"tile"] && _selectedBuildingType != 0) {

        //CGPoint locationInWorld = [self.scene convertPoint:touchLocation toNode:_world];
        CGPoint locationInWorld = [self convertTouchPointToWorld:touchLocation];
        CGPoint gameLocation = [self convertWorldPointToGamePoint:locationInWorld];

        NSLog(@"locationWorld.x = %f, locationWorld.y = %f", locationInWorld.x, locationInWorld.y);

        if(![self.theGame isBuildingThere:gameLocation] && [self.theGame isValidLocation:gameLocation]) {
            [self updateActiveTilePos:locationInWorld];
        }
   }
}

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

Однако, когда я использую среднюю точку двух касаний в пинч-режиме и преобразую ее в мировую точку, она возвращает значение, но значение в значительной степени отключается, и разные значения в зависимости от расстояний от центра...

Может мне просто нужно разобраться, как правильно сместить камеру? Еще раз спасибо за любую помощь с этой проблемой, это сводит меня с ума!

1 ответ

Решение

У меня такая же проблема.
Это нелогично, но преобразование точек не является умным.
Он не конвертируется из одного узла в другой.
Он может преобразовывать в координаты сцены и в координаты узла из координат сцены.
Он не работает от одного узла к другому. Что вам нужно сделать, это преобразовать точку из узла, а затем преобразовать точку в узел. После двух этих вызовов координаты будут в нужном вам узле.

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