12

SpriteKit の学習で、小さなアドベンチャー ゲームを作成しようとしています。ヒーローを作成し、それをシーンに追加します。後で、 中にtouchesBegan:、タッチがヒーローで発生したかどうかを検出し、それに応じてアクションを実行します。

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

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

_heroNode = [[ADVHeroNode alloc] init];

初期化は次のようになります。

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

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

ヒーローを SKSpriteNode のサブクラスとして追加すると、シーンに追加されるという意味で機能しますが、タッチではヒーローが検出されません。私touchesBegan:はこのように見えます:

-(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;
    }
}

SKSpriteNodeイライラすることに、このコードは、私自身のサブクラスではなく、まっすぐに を追加すると問題なく機能します。助言がありますか?

4

5 に答える 5

3

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

while (touchedNode.parent)
    {
        if ([touchedNode isKindOfClass:[GameObject class]])
            break;
        else
            touchedNode = (SKSpriteNode*)self.touchedNode.parent;
    }
于 2013-10-21T14:37:03.887 に答える
1

このスプライトのみでタッチを検出しました。

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

したがって、このタッチを検出する場合は、SKView ではなく、このオブジェクトにこのコードを記述する必要があります。SKSpriteNode でタッチが発生したときに SKView で何かをしたい場合は、デリゲートを使用してこれを行うことができます。

私の答えが理解できない場合は、遠慮なくさらに質問してください。

于 2013-10-21T06:41:21.467 に答える