Cocos2d: Масштабирование спрайта при касании

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


person Community    schedule 04.06.2009    source источник


Ответы (4)


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

Если вы хотите реализовать верхнюю границу, чтобы элемент не вырастал за определенную точку, тогда ваш 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];
}
person David Higgins    schedule 23.06.2009

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

Я бы рекомендовал использовать 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)s;

person Christian    schedule 22.06.2009

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

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

person unwind    schedule 04.06.2009

Я только что реализовал увеличение/уменьшение масштаба при касании, используя 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;   
}
person JJ Rohrer    schedule 22.04.2010