0

我写了几行代码,我可以选择精灵,我可以拖动它,但是一旦我拖动它,它就会离开鼠标光标一些像素,之后我可以控制它,但它离我的鼠标还有一些像素cursos .. 我的CGPoint转换似乎有问题,或者我不知道,这是我的代码

- (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;
}
4

2 回答 2

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");
    }

}
于 2013-01-10T10:26:36.303 回答
0

你应该考虑的一些事情:

  1. 在开始拖动时,您应该将 oldMouseLocation 设置为开始拖动的点
  2. 确保你的精灵被拖离他们的中心。例如,如果您要移动他们的容器,您可以从左下角拖动他们
  3. 在您的 ccMouseDown 中,您没有使用 convertToNodeSpace 函数
  4. 您可以考虑在鼠标位置上移动拖动的精灵 (selSprite),而不是使用 [oldMouseLocation - mouseLocation] 距离进行平移。或者,您可以应用在 [开始拖动点 - 拖动的精灵位置] 距离上计算的一些偏移量
于 2013-01-10T08:45:46.200 回答