convertToNodeSpace не работает должным образом
Используя этот код (немного подправленный), я не могу получить постоянное значение Y. это постоянно меняется. X работает отлично, но Y действительно искажен.
Я делаю плитки размером с экран. и когда я беру и перетащить, он отлично работает для х. так что, если я нажму пробел на экране, скажем,
Прикосновения закончились x: 459.000000 y: 705.000000
а затем перетащить немного прочь, я получаю это
Прикосновения закончились x: 459.000000 y: 823.000000
Таким образом, значение x остается то, что я хочу, но значение Y изменяется, не представляя правильное значение
Мой код для распечатки выглядит так
NSArray *touchArray = [touches allObjects];
UITouch * fingerOne = [touchArray objectAtIndex:0];
CGPoint newTouchLocation = [fingerOne locationInView:[fingerOne view]];
CGPoint mapLoc = [self convertToNodeSpace: newTouchLocation];
NSLog(@"Touches Ended x : %f y : %f", mapLoc.x, mapLoc.y);
и большинство приходит с этого сайта...
http://firsttimecocos2d.blogspot.com/2011/07/how-to-scroll-and-zoom-inout-of-map.html
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//finds the difference in the original map and the scaled map
int differenceX = mapWidth - (mapWidth*mapScale);
int differenceY = mapHeight - (mapHeight*mapScale);
// This method is passed an NSSet of touches called (of course) "touches"
// "allObjects" returns an NSArray of all the objects in the set
NSArray *touchArray = [touches allObjects];
//Remove Multi Touch
if ([touchArray count] ==1){
UITouch * fingerOne = [touchArray objectAtIndex:0];
CGPoint newTouchLocation = [fingerOne locationInView:[fingerOne view]];
newTouchLocation = [[CCDirector sharedDirector] convertToGL:newTouchLocation];
CGPoint oldTouchLocation = [fingerOne previousLocationInView:fingerOne.view];
oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
//get the difference in the finger touches when the player was dragging
CGPoint difference = ccpSub(newTouchLocation, oldTouchLocation);
//adds this on to the layers current position, effectively moving it
CGPoint newPosition = ccpAdd(mapLayer.position, difference);
CGPoint bottomLeft = newPosition;
//check to see if the map edges of the map are showing in the screen, if so bringing them back on the view so no black space can be seen
if (bottomLeft.x - differenceX/2 > 0 - (mapWidth * (1-mapScale)) + (1-mapScale)*33) {
bottomLeft.x = differenceX/2- (mapWidth * (1-mapScale))+(1-mapScale)*33;
}
if (bottomLeft.y - differenceY/2 > 0 -(mapHeight * (1-mapScale))) {
bottomLeft.y = differenceY/2-(mapHeight * (1-mapScale));
}
if (bottomLeft.x + mapWidth*mapScale +differenceX/2 < 440+ (1-mapScale)*33) {
bottomLeft.x = -differenceX/2 - mapWidth*mapScale + 440 + (1-mapScale)*33;
}
if (bottomLeft.y + mapHeight*mapScale +differenceY/2 < 320) {
bottomLeft.y = -differenceY/2 - mapHeight*mapScale + 320;
}
mapLayer.position = bottomLeft;
}
}
Что-нибудь? Спасибо!
1 ответ
Использование UIView fingerOne могло измениться при перемещении пальца, что может привести к перекосу CGPoint.
Попробуй это:
CCDirector* director = [CCDirector sharedDirector];
CGPoint newTouchLocation = [fingerOne locationInView:[director openGLView]];
100% времени openGLView не перемещается и не изменяется, если вы специально не сделали это.