cocos2dでタッチを検出するにはどうすればよいですか?
-
10-07-2019 - |
質問
cocos2dを使用して、iPhone用の2Dゲームを開発しています。
ゲームでは多くの小さなスプライト(画像)を使用しています。 2つの類似したタイプのスプライト(画像)をタッチすると、両方のスプライト(画像)が非表示になります。
特定のスプライト(画像)でタッチを検出するにはどうすればよいですか
解決
スプライトを含むレイヤーで、次のように言う必要があります:
self.isTouchEnabled = YES;
その後、UIViewで使用するのと同じイベントを使用できますが、それらの名前は少し異なります:
- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
UITouch* touch = [touches anyObject];
//in your touchesEnded event, you would want to see if you touched
//down and then up inside the same place, and do your logic there.
}
他のヒント
これを行うより良い方法は、スプライト自体(CGRect)の境界ボックスを実際に使用することです。このサンプルコードでは、すべてのスプライトをNSMutableArrayに配置し、スプライトタッチが境界ボックス内にあるかどうかを簡単に確認します。 initでタッチ検出をオンにしてください。気づいたら、YES(タッチを使用している場合)またはNO(使用していない場合)を返すことにより、レイヤーのタッチも承認/拒否します
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CGPoint location = [self convertTouchToNodeSpace: touch];
for (CCSprite *station in _objectList)
{
if (CGRectContainsPoint(station.boundingBox, location))
{
DLog(@"Found sprite");
return YES;
}
}
return NO;
}
Jonasの指示に従い、さらに追加します...
- (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)) {
// particularSprite touched
return kEventHandled;
}
}
Cocosの「中央配置」を考慮して、x / yを少し調整する必要がある場合があります
@david、コードにはcocos 0.7.3および2.2.1、特にCGMakeRectではなくCGRectMakeのタイプミスがあり、[touch location]は[touch locationInView:touch.view]になりました。
ここで私がやったこと:
- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];
CGRect myRect = CGRectMake(sprite.position.x, sprite.position.y, sprite.contentSize.width, sprite.contentSize.height);
if(CGRectContainsPoint(myRect, location)) {
// particularSprite touched
return kEventHandled;
}
}
@Genericrich:上記の2行の呼び出しにより、CGRectContainsPointはCocosLandで動作します。
[[Director sharedDirector] convertCoordinate:]
Cocos2Dオブジェクトは、OpenGL座標系を使用します。0,0は左下、UIKit座標(タッチが発生した場所など)は0,0が左上です。 convertCoordinate:UIKitからOpenGLへのフリップを行っています。
次のように動作しました... spriteSizeは明らかにスプライトのサイズです...:P
- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];
CGRect myRect = CGRectMake(sprite.position.x-spriteSize/2, sprite.position.y-spriteSize/2, spriteSize, spriteSize);
if(CGRectContainsPoint(myRect, location)) {
// particularSprite touched
return kEventHandled;
}
}
これは、基本的なタッチシステムを説明する優れたチュートリアルです。 http://ganbarugames.com/2010/12/detecting- touch-events-in-cocos2d-iphone /
まず、書く
self.isTouchEnabled = YES;
次に、ccTouchesEnded、ccTouchesBeganなどの関数を実装する必要があります
私が理解したことから、画面上の異なる座標にある可能性のある2つのスプライトを「一致」させることができます。
これを行うためのメソッド..:(他の多くのメソッドがあることを確認してください)
2つのグローバル変数を持つことを検討してください。
タッチがスプライトに触れるたびに、何度も言及されているCGRectContainsPoint関数を使用して、どのスプライトがタッチされたかを見つけます。その後、そのスプライトの「タグ」をグローバル変数の1つに保存できます。
2回目のタッチでも同じ操作を行い、2つのグローバル変数を比較します。
残りは理解できるはずですが、問題があればコメントしてください。