2014-02-17 8 views
7

Ich bin ziemlich neu in iOS, Ziel C und arbeite mit Xcode. Ich habe nur eine einfache Nachrichten-App gemacht, aber jetzt möchte ich ein Spiel erstellen, das ich auf einer anderen Plattform veröffentlicht habe.Kann nicht SKSpriteNode tippen - keine Berührung erkannt ios

Grundsätzlich habe ich ein Objekt, das zufällig erscheint und dann ausblendet und den Zweck hat, auf das Objekt zu tippen, um es wegzugehen.

aber ich kann nicht das Objekt zu tippen scheinen, obwohl ich gesetzt mySKSpriteNode.userInteractionEnabled = YES;

Hier ist, was ich in meinem touchesBegan Methode haben:

In meinem log ich das, wenn ich tippen der Bildschirm (nicht wo ich Objekte):

2014-02-17 23:18:30.870 BubbleChallenge[48541:70b] Something was touched 
2014-02-17 23:18:30.875 BubbleChallenge[48541:70b] <UITouch: 0x1130ea530> phase: Began tap count: 1 window: <UIWindow: 0x109c2ab60; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x109c274d0>; layer = <UIWindowLayer: 0x109c26810>> view: <SKView: 0x109c2e5e0; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CAEAGLLayer: 0x109c0e180>> location in window: {147.5, 128.5} previous location in window: {147.5, 128.5} location in view: {147.5, 128.5} previous location in view: {147.5, 128.5} 

Als ich mySKSpriteNode berühren ich nichts im Protokoll zu bekommen, nicht einmal „Etwas berührt“;

Eine Idee, warum das passieren könnte?

Die anderen Fragen fand ich sagte, die Antwort ist userInteractionEnabled = YES einzustellen .... vielleicht ein bestimmter Punkt im Code dort ist, wo ich diesen Satz sollte? ..

Alle Hilfe ist willkommen!

+0

Fast sicher ** Sie haben vergessen, nur .isUserInteractionEnabled = true ** – Fattie

Antwort

10

Haben Sie versucht, die name Eigenschaft Ihres Spritenodes zu setzen?

In Ihrer Initialisierung für mySKSpriteNode:

mySKSpriteNode = [[SKSpriteNode alloc] initWithTexture:sometexture]; 
mySKSpriteNode.name = @"thisIsMySprite"; // set the name for your sprite 
mySKSpriteNode.userInteractionEnabled = NO; // userInteractionEnabled should be disabled 

Dann:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    SKNode *node = [self nodeAtPoint:location]; 
    if ([node.name isEqualToString:@"thisIsMySprite"]) { 
     NSLog(@"mySKSpriteNode was touched!"); 
     [node runAction:[SKAction fadeOutWithDuration:0]]; 
    } 
} 
+0

dies versucht, aber immer noch nichts anmeldet. Ich habe NSLog hinzugefügt (@ "Etwas wurde berührt"); über UITouch Deklaration und es protokolliert nur, wenn ich den Bildschirm, nicht das Sprite berühre. –

+0

Danke für die Hilfe! Das Problem wurde mit dem folgenden Kommentar in Verbindung mit Ihrer Eingabe gelöst. –

+0

Kein Problem. Ich habe die Antwort bearbeitet, um den richtigen Code für Klarheit zu finden. – DoctorClod

0

ich nie den SKSprite Rahmen, aber ich werde versuchen zu helfen. Zuerst muss Ihre Funktion "- (void) touchesBegan: (NSSet *) touchEvent: (UIEvent *) event" in Ihrer benutzerdefinierten SKSpriteNode-Klasse gesetzt werden, andernfalls ist es normal, wenn das nicht funktioniert.

Wenn ist es bereits getan haben, haben Sie suchen, wo der Hahn Griff (durch ein anderes Objekt), dann können Sie verwenden: "- (BOOL) GestureRecognizer: (UIPanGestureRecognizer ) GestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UISwipeGestureRecognizer) otherGestureRecognizer"

hoffe das hilft!

+0

Danke, Nicolas für deine Hilfe. Ich habe das Problem mit dem obigen Vorschlag von @ akashg gelöst. –

5

Ihr Code ist im Wesentlichen korrekt. Nur ein paar kleine Änderungen sind erforderlich.

Sie haben die Methode -touchesBegan: in Ihrer Szenenklasse implementiert. Wenn Sie Berührungen innerhalb der Szenenklasse behandeln möchten, muss für alle untergeordneten Knoten die Eigenschaft userInteractionEnabled auf NO festgelegt sein. Die Eigenschaft userInteractionEnabled eines Sprite-Knotens sollte nur dann auf YES gesetzt werden, wenn er in der Lage ist, Berührungen selbst zu behandeln.

in Ihrem Fall Also, sollten Sie folgende Änderungen vornehmen:

1 - die Anwenderwechsel des spriteNode Einstellung NEIN.

mySKSpriteNode.userInteractionEnabled = NO; 

2 - Ändern Sie die Art, wie Sie nach Ihrem eigenen Sprite suchen.

if([node isEqual: mySKSpriteNode]) 

Sie werden feststellen, dass Ihr Code wie vorgesehen funktioniert.

+0

Danke !! Das war's. Wie Sie und DoctorClod oben vorgeschlagen haben, nannte ich meinen Knoten und überprüfte das Sprite in -touchesBegan: und userInteractionEnabled sollte auf NO gesetzt werden, wie Sie sagten. –

1

In Swift 2.0!

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let touch = touches.first! 
    let location = touch.locationInNode(self) 
    let node = self.nodeAtPoint(location) 

    if node.name == "spriteName" { 
    // Present new game scene 
    } 
} 
+0

Was macht das, wenn es mehr als einen Knoten an diesem Ort gibt? – Confused