2013-01-09 64 views
0

我写了一些代码行,我可以选择精灵,我可以拖动它,但只要我拖动它,它会离开鼠标光标一些像素,然后我可以控制它,但它是从我的鼠标cursos一些像素远..好像跟我CGPoint转换做错了事,或者我不知道,这是我的代码用鼠标和Cocos2d拖动精灵

- (void)selectSpriteForTouch:(CGPoint)touchLocation { 
    CCSprite * newSprite = nil; 
    for (CCSprite *sprite in movableSprites) { 
     if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) { 
      newSprite = sprite; 
      NSLog(@"palieciau"); 
      break; 
     } 
    } 
    if (newSprite != selSprite) { 
     [selSprite stopAllActions]; 
     [selSprite runAction:[CCRotateTo actionWithDuration:0.1 angle:0]]; 
     CCRotateTo * rotLeft = [CCRotateBy actionWithDuration:0.1 angle:-4.0]; 
     CCRotateTo * rotCenter = [CCRotateBy actionWithDuration:0.1 angle:0.0]; 
     CCRotateTo * rotRight = [CCRotateBy actionWithDuration:0.1 angle:4.0]; 
     CCSequence * rotSeq = [CCSequence actions:rotLeft, rotCenter, rotRight, rotCenter, nil]; 
     [newSprite runAction:[CCRepeatForever actionWithAction:rotSeq]]; 
     selSprite = newSprite; 
    } 
} 

- (BOOL)ccMouseDown:(NSEvent*)event { 
    CCSprite * newSprite = nil; 
    CGPoint clickLocation = [[CCDirector sharedDirector] convertEventToGL:event]; 
    for (CCSprite *sprite in movableSprites) { 
     if (CGRectContainsPoint(sprite.boundingBox, clickLocation)) { 
      newSprite = sprite; 
      break; 
     } 
    } 
    if (newSprite != selSprite) { 
     [selSprite stopAllActions]; 
     [selSprite runAction:[CCRotateTo actionWithDuration:0.1 angle:0]]; 
     CCRotateTo * rotLeft = [CCRotateBy actionWithDuration:0.1 angle:-4.0]; 
     CCRotateTo * rotCenter = [CCRotateBy actionWithDuration:0.1 angle:0.0]; 
     CCRotateTo * rotRight = [CCRotateBy actionWithDuration:0.1 angle:4.0]; 
     CCSequence * rotSeq = [CCSequence actions:rotLeft, rotCenter, rotRight, rotCenter, nil]; 
     [newSprite runAction:[CCRepeatForever actionWithAction:rotSeq]]; 
     selSprite = newSprite; 
    } 
} 


- (void)panForTranslation:(CGPoint)translation { 
    if (selSprite) { 
     CGPoint newPos = ccpAdd(selSprite.position, translation); 
     selSprite.position = newPos; 
    } else { 
    } 
} 

-(BOOL)ccMouseDragged:(NSEvent *)event { 
    CGPoint point = [[CCDirector sharedDirector] convertEventToGL:event]; 
    CGPoint mouseLocation = [self convertToNodeSpace:point]; 
    CGPoint translation = ccpSub(point, oldMouseLocation_); 
    [self panForTranslation:translation]; 
    oldMouseLocation_ = point; 
} 
+0

当'ccMouseDown:'第一次调用'ccMouseDragged:'时,'oldMouseLocation_'的值是什么? – Kreiri

回答

0

有些事情你应该考虑:

  1. 在开始拖动时,您应该将oldMouseLocation设置为启动拖动的点
  2. 确保你的精灵被从他们的中心拖走。例如,如果你正在移动的容器,你可以从他们的左下角
  3. 在你ccMouseDown您不使用convertToNodeSpace功能
  4. 拖动你可能会考虑在移动鼠标拖动的精灵(selSprite)位置,而不是使用[oldMouseLocation - mouseLocation]距离进行翻译。可选地,你可以应用一些在[开始拖动点 - 拖动精灵位置]上计算的偏移距离
0

我明白了,谢谢。

- (BOOL)ccMouseDragged:(NSEvent *)event 
{ 
    CGPoint point = [[CCDirector sharedDirector] convertEventToGL:event]; 
    CGPoint mouseLocation = [self convertToNodeSpace:point]; 
    CGPoint translation = (mouseLocation); 
    [self panForTranslation:translation]; 
    return YES; 
} 

-(void)panForTranslation:(CGPoint)translation 
{ 
    if (first) 
    { 
     NSLog(@"%f, %f",translation.x, translation.y); 
     deb1.position = ccp(translation.x, translation.y); 
    } 
    if (second) 
    { 
     NSLog(@"%f, %f",translation.x, translation.y); 
     deb2.position = ccp(translation.x, translation.y); 
    } 
    if (third) 
    { 
     NSLog(@"%f, %f",translation.x, translation.y); 
     deb3.position = ccp(translation.x, translation.y); 
    } 
    else 
    { 
     NSLog(@"not in sprite's rect"); 
    } 

}