2009-06-04 2 views
1

Мне просто интересно, как я могу это сделать и надеяться, что кто-то сделал что-то подобное. Я бы хотел, чтобы спрайт масштабировался, когда палец остается на экране. Любые советы, общие рекомендации или методы, которые я мог бы рассмотреть, были бы оценены.Cocos2d: Масштабирование спрайта по мере его касания

ответ

3

Определите действие, которое вы хотите выполнить, в данном случае ... ScaleBy (как вы хотите, это относительно текущего масштаба, а не окончательный масштаб). Когда прикосновение получено, RepeatForever это действие до тех пор, пока не коснется касания, а затем остановите действие.

Если вы хотите реализовать верхнюю границу, чтобы элемент не превышал определенную точку, то ваш ScaleBy будет тогда ScaleTo с верхней границей, заданной как целевой масштаб. Однако вам придется поиграть с длительностью, чтобы получить ощущение, что вы ищете. Слишком быстро, слишком медленно и т. Д., Это зависит от вас.

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint location = [[[Director sharedDirector] convertCoordinate: touch.location]; 
    CGRect particularSpriteRect = CGMakeRect(particularSprite.position.x, particularSprite.position.y, particularSprite.contentSize.width, particularSprite.contentSize.height); 
    if(CGRectContainsPoint(particularSpriteRect, location)) { 
    // scale by 1.25 every 0.25 second while finger touching 
    id a = [RepeatForever actionWithAction: [ScaleBy actionWithDuration: 0.25 scale: 1.25]; 
    [a setTag: YOUR_TAG]; 
    [particularSprite runAction: a]; 
    return kEventHandled; 
    } 
} 

- (void)ccTouchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { 
    // code to determine correct finger/touch releases omitted 
    [particularSprite stopActionByTag: YOUR_TAG]; 
} 
0

Ну ... Кажется, что класс спрайтов имеет метод scale, который позволяет установить его масштаб, как значение с плавающей запятой, где 1.0 является стандартным («родным») масштабом.

Вы не очень четко понимаете, как вы хотите, чтобы спрайт масштабировался, если он должен масштабироваться, чтобы «следовать» на ощупь, то есть позволить пользователю изменить размер спрайта, перетащив его или если он только собирается (например) изменить масштаб, чтобы уведомить пользователя о касании. Вам нужно понять эти вещи и вычислить желаемый масштаб, который вы хотите.

1

Когда я подхожу к вам, вы хотите масштабировать спрайт, пока палец остается на том же месте, не двигаясь, это правильно?

Я бы рекомендовал использовать Layer со следующими методами:

- (BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
- (BOOL)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

Вы могли бы запланировать на основе интервал действия/метод в ccTouchesBegan увеличить масштаб вашего спрайта (например, увеличение 0,1 в секунду) и в ccTouchesEnded вы отмените это действие и установите масштаб обратно на исходное значение (например, 1.0).

Для планирования взглянуть на этот метод (найденного в любом классе расширение CocosNode):

- (недействительными) расписание: (SEL), с;

0

Я только что внедрил масштабирование/уменьшение при касании с помощью cocos2D и SpaceManager. Уже принятый ответ выглядит отлично, но я хотел показать, как вы можете это сделать, если уже используете SpaceManager.

Примечание: этот фрагмент масштабирует и уменьшает масштаб одним махом. Уже принятый ответ можно посмотреть, как вы это измените, чтобы уменьшить масштаб после выпуска.

Это, как я это сделал:

#pragma mark touch 
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    NSLog(@"Touched began"); 
    CGPoint position = [touch locationInView: [touch view]]; 
    CGPoint positionLocal =[[CCDirector sharedDirector] convertToGL: position]; 

    cpShape *touchedShape = [smgr getShapeAt:positionLocal]; 
    if (touchedShape != nil) { 
    NSLog(@"something was touched"); 
    cpCCSprite *cpCCSOwner = (cpCCSprite *) touchedShape->data; 
    // Let's do 'pulse' special effect on whatever we just touched, just to give the user some feedback   
    cpFloat originalScale_ = cpCCSOwner.scale; 
    CCFiniteTimeAction *zoomAction = [CCScaleTo actionWithDuration:0.1f scale:originalScale_ * 1.2f];// zoom in 
    CCFiniteTimeAction *shrinkAction = [CCScaleTo actionWithDuration:0.1f scale:originalScale_];// zoom out 
    CCSequence *actions = [CCSequence actions:zoomAction, shrinkAction, nil];// zoom in, then zoom out 
    [cpCCSOwner runAction:actions];// now 

    // Since I just grabbed the object, it should stop moving 
    cpCCSOwner.shape->body->v = cpvzero; 

    // Let's keep track of what we are touching. 
    cpCCSpriteTouched = cpCCSOwner; //<- I just added this to the class, you'll need something more sophisticated from non-trivial cases 


    } else { 
    NSLog(@"nothing was actually touched - you missed");  
    cpCCSpriteTouched = nil; 
    } 
    return YES; 
} 
Смежные вопросы