私はこれをどのように行うのか疑問に思っており、誰かが同様のことをしたことを望んでいます. 指が画面に残っているときにスプライトをスケーリングしたいと思います。私が見ることができるヒント、一般的なガイドライン、または方法をいただければ幸いです。
4 に答える
私があなたを正しく理解したとき、あなたは指が動かずに同じ場所に留まっている間にスプライトをスケーリングしたいですか?それは正しいですか?
Layer
次の方法でを使用することをお勧めします。
- (BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (BOOL)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
間隔ベースのアクション/メソッドをスケジュールしてccTouchesBegan
、スプライトのスケールを増やす(たとえば、1秒あたり0.1を増やす)ccTouchesEnded
ことができ、そのアクションをキャンセルして、スケールを元の値(たとえば、1.0)に戻すことができます。
スケジューリングについては、そのメソッドを見てください(拡張するクラスにありますCocosNode
)。
-(void)スケジュール:(SEL)s;
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;
}
ええと...スプライトクラスには、スケールを浮動小数点値として設定できるスケールメソッドがあり、1.0がデフォルトの(「ネイティブ」)スケールであるようです。
スプライトがタッチに「追従」するようにスケーリングする必要がある場合、つまり、ユーザーがドラッグしてスプライトのサイズを変更できるようにする場合、または(たとえば)変更するだけの場合、スプライトをスケーリングする方法が明確ではありませんそのスケールを使用して、タッチが登録されたことをユーザーに通知します。これらのことを理解し、必要なスケールを計算する必要があります。