Wie man richtig entfernen Sie den Knoten aus, wenn der Bildschirm Grenzen?
Arbeite ich an einem sprite-kit-Spiel, wo Knoten spawn unterhalb des niedrigsten Punktes auf dem Bildschirm und die Schwerkraft eingestellt ist, dass Sie schweben, um den oberen Rand des Bildschirms. Alles funktioniert perfekt, aber er beginnt schnell zu verlangsamen die FPS, und schließlich Verzögerungen und Pannen immer sehr langsam. Ich dachte, die Möglichkeit, dies zu lösen gewesen wäre, das entfernen der Knoten aus dem übergeordneten nach Sie hatte aus der Vergangenheit eine Punkt, das war der code, den ich verwendet, die im update:
-(void)update:(CFTimeInterval)currentTime {
if (_bubble1.position.y > CGRectGetMaxX(self.frame)+40) {
[self removeFromParent];
}
}
Werden, und im Fall es nötig ist, das ist, wie ich gespawnt, sagte Blase unterhalb der initWithSize
Methode:
-(void)didMoveToView:(SKView *)view {
[self performSelector:@selector(spawnBubbles) withObject:nil afterDelay:1.0];
[self performSelector:@selector(spawnBubbles1) withObject:nil afterDelay:1.5];
}
-(void)spawnBubbles {
randomPosition = arc4random() %260*DoubleIfIpad;
randomPosition = randomPosition + 20*DoubleIfIpad;
randomNumber = arc4random() %7;
randomNumber = randomNumber + 1;
myColorArray = [[NSArray alloc] initWithObjects:colorCombo1, colorCombo2, colorCombo3, colorCombo4, colorCombo5, colorCombo6, colorCombo7, colorCombo8, nil];
myRandomColor = [myColorArray objectAtIndex:randomNumber];
_bubble1 = [SKShapeNode node];
[_bubble1 setPath:CGPathCreateWithEllipseInRect(CGRectMake(-25*DoubleIfIpad, -25*DoubleIfIpad, 50*DoubleIfIpad, 50*DoubleIfIpad), nil)];
_bubble1.strokeColor = _bubble1.fillColor = myRandomColor;
_bubble1.position = CGPointMake(randomPosition, CGRectGetMinY(self.frame)-60);
_bubble1.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:20];
_bubble1.physicsBody.categoryBitMask = CollisionBubble;
[self addChild:_bubble1];
[self runAction:[SKAction sequence:@[
[SKAction waitForDuration:1.0],
[SKAction performSelector:@selector(spawnBubbles) onTarget:self],
]]];
}
Wie kann ich es so machen, dass die Knoten ordnungsgemäß entsorgt werden, wenn Sie den Bildschirm zu verlassen? Und wie kann ich die FPS bei einer Konstanten rate von 60 FPS?
Vielen Dank im Voraus!!
- "FPS" ist nur lose im Zusammenhang zur Anzahl der Knoten. andere Faktoren werden dazu beitragen mehr.
- Wirklich?! wie das, was @BradAllred
- Sie haben nur eine Blase ivar, würden Sie brauchen, um ein array zu verwenden, um den Zugriff auf alle von Ihnen später. Mit Ihren update-code, den Sie nur in der Lage sein, zu entfernen, die Blase, die erstellt wurde, Letzte. Leichter können Sie jedes Blase führen Sie eine benutzerdefinierte Aktion, die Häufig überprüft seine position und fordert removeFromParent, wenn nötig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde empfehlen, mit der integrierten in-Kontakt-Erkennung in spritekit. Erstellen Sie eine skspritenode imitiert ein Dach, das hat eine Physik-Körper-set zu erkennen, Kontakt mit den Bläschen. Erstellen Sie ein Ereignis auf Kontakt zwischen dem Dach Knoten und Blase Knoten, wird einfach entfernen Sie die Luftblasen. Dadurch wird gewährleistet, dass Luftblasen entfernt werden, und Sie behalten eine Konstante FPS.
Beispiel-Ereignis aufgerufen, Kontakt:
- Kontakt-Erkennung Beispiel:
Blase muss:
Dach:
Swift-1.1 /iOS 8 können Sie das folgende Muster verwenden, um Ihr problem zu lösen.
1. Init Ihrer Szene
physicsBody
- Eigenschaft mit dem folgenden code:2. Kategorie erstellen Masken für Ihre Szene und Ihre sprite-Knoten:
3. Stellen Sie die richtige
categoryBitMask
,collisionBitMask
undcontactTestBitMask
für Ihre Szene und sprite KnotenphysicsBody
Eigenschaften:Als Beispiel, die folgenden Swift SKScene Umsetzung zeigt Ihnen, wie Sie entfernen Sie alle sprite-Knoten, die über das hinausgehen, Ihre Szene-frame: