2013-10-21 8 views
11

SpriteKitの学習で、私は小さなアドベンチャーゲームを作ろうとしています。ヒーローを作ってシーンに追加してから、後でtouchesBegan:の間に、タッチがヒーローに由来するかどうかを検出し、それに応じてアクションを実行します。タッチ中にカスタムSKSpriteNodeが検出されない

私はヒーローをSKSpriteNodeとして追加するとタッチが彼を検出します。私が彼をSKSpriteNodeのサブクラスとして追加しても、タッチはしません!追加の違いは:

_heroNode = [SKSpriteNode spriteNodeWithImageNamed:@"hero.png"]; 

_heroNode = [[ADVHeroNode alloc] init]; 

initは次のようになります。

- (id) init { 
    if (self = [super init]) { 

     self.name = @"heroNode"; 
     SKSpriteNode *image = [SKSpriteNode spriteNodeWithImageNamed:@"hero.png"]; 
     [self addChild:image]; 
    } 
    return self; 
} 

SKSpriteNodeのサブクラスは、それがに追加されたという意味で働くようヒーローを追加しますシーンが、タッチは彼を検出しません。私touchesBegan:は、次のようになります。それをまっすぐSKSpriteNodeはなく、私自身のサブクラスを追加するとき

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    /* Called when a touch begins */ 

    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    SKNode *node = [self nodeAtPoint:location]; 
    if (YES) NSLog(@"Node name where touch began: %@", node.name); 

    //if hero touched set BOOL 
    if ([node.name isEqualToString:@"heroNode"]) { 
     if (YES) NSLog(@"touch in hero"); 
     touchedHero = YES; 
    } 
} 

イライラ、このコードはうまく動作します。助言がありますか?

答えて

22

は、あなたのヒーロー

をサブクラス化するためにいくつかの例の方法がありますSKNode

サブクラスSKNodeこの方法は、タッチ、それ故にself.userInteractionEnabledプロパティを監視するために、あなたのノードが必要です。

@implementation HeroSprite 

- (id) init { 
    if (self = [super init]) { 
     [self setUpHeroDetails]; 
     self.userInteractionEnabled = YES; 
    } 
    return self; 
} 

-(void) setUpHeroDetails 
{ 
    self.name = @"heroNode"; 
    SKSpriteNode *heroImage = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 
    [self addChild:heroImage]; 
} 


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint locationA = [touch locationInNode:self]; 
    CGPoint locationB = [touch locationInNode:self.parent]; 
    NSLog(@"Hit at, %@ %@", NSStringFromCGPoint(locationA), NSStringFromCGPoint(locationB)); 
} 

@end 

SKSpriteNode

他の "より簡単に" 道、あなただけのSKSpriteNodeをサブクラス化したい場合。これは基本的にあなたが使用しているのと同じように動作します(あなたがHeroをサブクラス化する前に)。あなたの質問に設定されているようにあなたのtouchesBeganはうまくいくでしょう。

@implementation HeroSprite 

- (id) init { 
    if (self = [super init]) { 
     self = [HeroSprite spriteNodeWithImageNamed:@"Spaceship"]; 
     [self setUpHeroDetails]; 

    } 
    return self; 
} 

-(void) setUpHeroDetails { 
    self.name = @"heroNode"; 
} 

@end 
+0

私はSpriteKitとObjective-Cには一般的ではありませんが、これらのクラスのインスタンスをどのように作成するのか分かりません。 – Jide

+0

私はそのコードを入れませんでした。通常のSKSpriteを作成するのと同じように作成しますが、HeroSpriteを使用します。 – DogCoffee

+0

それを行う素晴らしい方法! Awesome – Septronic

0

あなたのADVHeroNodeは画像なしのSkNodeまたはSkSpriteNodeです。どちらもエクステントを持っていません。それらはnodeAtPointによって検出されませんが、イメージの子SKSpriteNodeはそれになります。明示的にノードの名前をチェックしているので、チェックは失敗します。

イメージに名前を付け、それをチェックして、その親を参照してADVHeronodeインスタンスを取得することができます。または、node.parentの名前を直接確認してください。

1

ちょうどこのスプライトのタッチが検出されました。

オブジェクトSKSpriteNodeを作成すると、オブジェクト自体を制御します。それは、タッチが始まると、このオブジェクトがこのタッチをSKViewではなく受け取ることを意味します。

このタッチを検出したい場合は、このコードをSKViewにないこのオブジェクトに書き込む必要があります。 SKSpriteNodeでタッチが発生したときにSKViewで何かをしたい場合は、代理人を使ってこれを行うことができます。

私が何を答えているのか理解できない場合は、さらにお気軽にお問い合わせください。ここで

+0

また、OPはこれを尋ねたことがありません。あなたが話しているデリゲートソリューションのコードが好きです。私は正常に私のSKSpriteNodeサブクラスでtouchEndedを処理していますが、サブクラスでuserInteractionEnabledを有効にした場合には当てはまらないSKViewでtouchesEndedメソッドをトリガーしたいと思います。 – stvn

3

通常、私が制御したいクラスが見つかるまで、タッチされたノードの親をチェックします。 ここにコードスニペットがあります。

while (touchedNode.parent) 
    { 
     if ([touchedNode isKindOfClass:[GameObject class]]) 
      break; 
     else 
      touchedNode = (SKSpriteNode*)self.touchedNode.parent; 
    } 
+0

コンテナ内のSKLabelNodeをタッチすると問題が発生しましたが、この行を "touchedNode =(SKSpriteNode *)self.touchBeganNode.parent;"私の一日を救う。 – Beto

+0

はself.touchBeganNodeカスタム変数ですか? – josef

+0

はい、それは私のコードにありましたが、私はtouchedNodeを意味すると思う、私はちょうど答えを更新しました。 – membersheep

9

これを必ずinitメソッドに追加してください。

self.userInteractionEnabled = YES; 

何らかの理由で、これはサブクラス化するとデフォルトでは有効になりません。少なくとも私にとっては、手動で有効にしたときにしか機能しませんでした。

関連する問題