Мне просто интересно, как я мог бы это сделать, и надеюсь, что кто-то сделал что-то подобное. Я хотел бы, чтобы спрайт масштабировался, когда палец остается на экране. Буду признателен за любые советы, общие рекомендации или методы, на которые я мог бы обратить внимание.
Cocos2d: Масштабирование спрайта при касании
Ответы (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];
}
Когда я вас правильно понимаю, вы хотите масштабировать спрайт, ПОКА палец остается на одном и том же месте, не двигаясь, это правильно?
Я бы рекомендовал использовать 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;
Ну... Кажется, у класса спрайтов есть масштаб метод, который позволяет вам установить его масштаб в виде значения с плавающей запятой, где 1,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;
}