Cocos2d: масштабирование спрайта при касании - PullRequest
1 голос
/ 04 июня 2009

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

Ответы [ 4 ]

3 голосов
/ 23 июня 2009

Определите действие, которое вы хотите выполнить, в данном случае ... 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];
}
1 голос
/ 22 июня 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) с;

0 голосов
/ 22 апреля 2010

Я только что реализовал увеличение / уменьшение при касании с помощью 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;   
}
0 голосов
/ 04 июня 2009

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

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

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