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