Cocos2d. перетаскивание CCSprite на экран с помощью ccTouchMoved делает движение прерывистым - PullRequest
0 голосов
/ 19 сентября 2011

У меня проблема с моим методом ccTouchMoved.У меня есть 3 ccSprites, которые я хочу иметь возможность перемещаться по экрану с помощью моего пальца.Дело в том, что движение прерывистое, и иногда оно даже теряет «хватку» ccSprites при перетаскивании изображения, если я перемещаю указатель мыши на быстрое.

что мне не хватает?

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

ccTouchBegan: увеличьте масштаб касающегося ccSprite

ccTouchMoved: переместите касающийся ccSprite по экрану

ccTouchEnded: уменьшите ccSprite до его исходного размера и остановите движение (есть ли лучший способ уменьшить ccSprite до его первоначального размера?)

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{

CCLOG(@"ccTouchBeganRuby");

CGPoint location = [self convertTouchToNodeSpace: touch];

if(CGRectContainsPoint([animatingRuby1 boundingBox], location)){
    CCLOG(@"ccTouchEndedRubyScaleUp1");
    id ScaleAction1 = [CCScaleBy actionWithDuration:1 scale:1.2f ];
    [animatingRuby1 runAction:ScaleAction1];
}
if(CGRectContainsPoint([animatingRuby2 boundingBox], location)){
    CCLOG(@"ccTouchEndedRubyScaleUp2");
    id ScaleAction2 = [CCScaleBy actionWithDuration:1 scale:1.2f ];
    [animatingRuby2 runAction:ScaleAction2];
}
if(CGRectContainsPoint([animatingRuby3 boundingBox], location)){
    CCLOG(@"ccTouchEndedRubyScaleUp3");
    id ScaleAction3 = [CCScaleBy actionWithDuration:1 scale:1.2f ];
    [animatingRuby3 runAction:ScaleAction3];
}

return YES;

}

- (void)ccTouchMoved:(UITouch *)touches withEvent:(UIEvent *) event{

CCLOG(@"ccTouchMovedRuby");

if (CGRectContainsPoint([animatingRuby1 boundingBox], location)) {
    CCLOG (@"moveRubies1");
    if((CGRectContainsPoint([animatingRuby2 boundingBox], location))|| (CGRectContainsPoint([animatingRuby1 boundingBox], location))) {
        return;
    }
    animatingRuby1.position = location;

}
if (CGRectContainsPoint([animatingRuby2 boundingBox], location)) {
    CCLOG (@"moveRubies2");
    if((CGRectContainsPoint([animatingRuby1 boundingBox], location))|| (CGRectContainsPoint([animatingRuby3 boundingBox], location))) {
        return;
    }
    animatingRuby2.position = location;
}
if (CGRectContainsPoint([animatingRuby3 boundingBox], location)) {
    CCLOG (@"moveRubies3");
    if((CGRectContainsPoint([animatingRuby1 boundingBox], location))|| (CGRectContainsPoint([animatingRuby2 boundingBox], location))) {
        return;
    }
    animatingRuby3.position = location;

}
[self collidableWithEachOther:location];

}

- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *) event{
CGSize screenSize = [[CCDirector sharedDirector] winSize]; 
CCLOG(@"ccTouchEndedRuby");
CGPoint location = [self convertTouchToNodeSpace: touch];

if(CGRectContainsPoint([animatingRuby1 boundingBox], location)){
    CCLOG(@"ccTouchEndedRubyScaleDown1");
    [animatingRuby1 setScaleX:screenSize.width/14850.0f]; 
    [animatingRuby1 setScaleY:screenSize.height/9552.0f];

}
if(CGRectContainsPoint([animatingRuby2 boundingBox], location)){
    CCLOG(@"ccTouchEndedRubyScaleDown2");
    [animatingRuby2 setScaleX:screenSize.width/14850.0f]; 
    [animatingRuby2 setScaleY:screenSize.height/9552.0f];
}
if(CGRectContainsPoint([animatingRuby3 boundingBox], location)){
    CCLOG(@"ccTouchEndedRubyScaleDown3");
    [animatingRuby3 setScaleX:screenSize.width/14850.0f]; 
    [animatingRuby3 setScaleY:screenSize.height/9552.0f];
}

}

1 Ответ

2 голосов
/ 19 сентября 2011

Возьмите вектор от спрайта к месту касания и установите его как направление для спрайта, ограничивая его скорость. Таким образом, изменения не будут такими быстрыми и резкими, и движение будет выглядеть более плавным. Не требуйте, чтобы место касания всегда было над спрайтом, просто следите за тем, выполняется ли операция перетаскивания и какой спрайт перетаскивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...