SKPhysicsBody und [SKNode setScale:]

8

In meinem aktuellen Projekt mit SpriteKit habe ich eine Menge Sprites, die unabhängig voneinander zu verschiedenen Zeiten hochskaliert werden müssen. Das Problem ist, dass, wenn ich den Knoten skaliere, der Physikkörper nicht mit ihm skaliert, so dass er die Physik vermasselt. Hier ist ein kleines Beispiel, das ich für diese Frage zusammengestellt habe:

%Vor%

Beachten Sie, wie das blaue Sprite (verkleinert) über dem roten steht, aber Sie können sagen, dass sein Physikkörper immer noch die Dimension hat, die ich ihm gesagt habe, und er hat nicht skaliert.

Natürlich verkleinert das Herunterskalieren des Knotens das physicsBody nicht. Also meine Frage ist, ob ich es manuell tun muss, wie gehe ich vor?

Ich habe versucht, den Körper beim Skalieren mit der richtigen Größe zu tauschen, aber dann werden die Dinge wirklich verworren, wenn der alte Körper Gelenke hat usw. Es wäre viel einfacher, wenn ich den bestehenden Körper irgendwie skalieren könnte .

    
mprivat 10.10.2013, 20:31
quelle

6 Antworten

7

Unter Verwendung von SKAction oder der Update-Schleife können Sie eine neue SKPhysicsBody mit der richtigen Skalierung erstellen und sie auf das Objekt anwenden. Wenn Sie dies tun, werden Sie jedoch die Geschwindigkeit verlieren. Um dies zu beheben, können Sie Folgendes tun:

%Vor%     
Placus Brutus 09.01.2014 20:46
quelle
5

Physische Körperformen können nicht skaliert werden. Definitiv nicht in Box2D welches Sprite Kit intern benutzt.

Abgesehen von internen Optimierungen hätte die Skalierung eines Physikkörpers weitreichende Auswirkungen. Zum Beispiel könnte das Skalieren einer Körperform den Körper in Kollisionen stecken lassen. Es würde beeinflussen, wie Gelenke interagieren. Es würde definitiv die Dichte oder Masse und damit das Verhalten des Körpers verändern.

Sie könnten einen SKNode verwenden, zu dem Sie das Sprite ohne Physikkörper hinzufügen, und dann einen zusätzlichen SKNode mit Körpern gegebener Größe hinzufügen. Sie könnten dann die Körper aktivieren oder deaktivieren, wenn Sie mit der Skalierung des Sprites beginnen. Wenn Sie dies richtig einstellen, merkt der Player nicht, dass die Kollisionsform einfach von voller Größe auf halbe Größe überging, während das Sprite diesen Skalierungsübergang animiert.

Sie müssten die Dichte des Körpers und vielleicht auch andere Eigenschaften entsprechend seiner Größe berechnen.

    
LearnCocos2D 16.10.2013 23:00
quelle
3

Ich hatte genau das gleiche Problem, ich denke, es ist ein Bug im Sprite-Kit.

Versuchen Sie es mit einer Aktion zum Skalieren, das funktioniert in der gesamten Szene.

%Vor%

Meine ursprüngliche Frage

Soll das geschehen?

%Vor%

    
DogCoffee 10.10.2013 20:33
quelle
2

Für jeden, der diese Antwort liest, glaube ich, dass Physik-Körper jetzt mit dem SKNode skalieren. Ich verwende Xcode 8.2.1 und Swift 3.0.2. Ich starte ein neues Projekt, wähle Spiel, fülle die Details aus. Ändere 2 Dateien:

GameViewController.swift (fügen Sie eine Zeile hinzu)

%Vor%

Spiel Scene.swift (ersetzen Sie die Funktion sceneDidLoad ()) mit diesem:

%Vor%

Die Physikgrenze wird mit dem Sprite-Knoten skaliert.

    
Christian Cerri 26.03.2017 03:30
quelle
1

Der Physikkörper hängt vom CGPath des SKNode ab; Du wirst das irgendwie ändern müssen. Sie könnten versuchen, den CGPath mit etwas wie dem folgenden zu skalieren:

%Vor%

Beachten Sie jedoch, dass dadurch das Aussehen von Knoten, die sich bereits in einer SKScene befinden, nicht aktualisiert wird. Möglicherweise müssen Sie die Größenänderung des CGPath mit einer SKAction kombinieren, die den Knoten skaliert.

    
Goondaba 09.12.2013 06:34
quelle
0

Ich hatte das gleiche Problem, alles, was ich getan habe, war, meinen Physikkörper in meiner Aktualisierungsfunktion für die aktuelle Zeit zu definieren, und er würde damit skalieren.

Für Sie wäre es etwa so:

%Vor%

Das einzige Problem ist, dass Sie Ihre Physikeigenschaften jedes Mal in updateCurrentTime neu definieren müssen. Sie können einige dieser Eigenschaften wie die Restitution einer Variablen anpassen, so dass Sie ihre Eigenschaften ändern können, indem Sie die Variable anderswo ändern. Die Neudefinition an anderer Stelle funktioniert nur bis zum nächsten Frame.

    
Gaard Anderson 06.06.2017 21:36
quelle

Tags und Links