SpriteKit-Side-Scrolling aktualisiert physicsWorld @ nic
Dem Beispiel folgenHie (außer in Objective C) und der Standarddokumentation von Apple habe ich festgestellt, dass dasphysicsWorld
aktualisiert seine Positionen nicht, wennmyWorld
aktualisiert seine Position. Ich schaltete anshowsPhysics
auf meinem skView, um dies zu überprüfen. Siehe diese Screenshots.
Vor jeder Bewegung: Nach einer kleinen Bewegung Immer ein bisschen weiter Und kurz vor dem Kontakt
Hier ist mein Code zum ZentrierenmyWorld
. Der größte Teil der Länge ist darauf zurückzuführen, dass ich sehr ausführlich mit den Kantengrenzen umgegangen bin.
- (void)centerOnNode:(SKNode *)monkeyNode
{
CGPoint monkeyPosition = monkeyNode.position;
// Check if monkey died
if (monkeyPosition.y < myWorld.frame.origin.y - sceneHeight/2) {
[self monkeyDied];
}
// Check if monkey won
if (monkeyPosition.x > skyFarRightSide.x) {
[self monkeyWon:monkeyNode];
}
// Define limits
CGFloat scrollTopLimit = skyFarTopSide.y - sceneHeight/2;
CGFloat scrollBottomLimit = 0;
CGFloat scrollLeftLimit = 0;
CGFloat scrollRightLimit = skyFarRightSide.x - sceneWidth/2;
// Normal (no limits hit) scrolling
if (monkeyPosition.x > scrollLeftLimit && monkeyPosition.x < scrollRightLimit && monkeyPosition.y > scrollBottomLimit && monkeyPosition.y < scrollTopLimit) {
[myWorld setPosition:CGPointMake(-monkeyPosition.x, -monkeyPosition.y)];
}
// At far left scrolling
if (monkeyPosition.x < scrollLeftLimit) {
// No y limits hit
if (monkeyPosition.y > scrollBottomLimit && monkeyPosition.y < scrollTopLimit) {
[myWorld setPosition:CGPointMake(0, -monkeyPosition.y)];
}
// Bottom limit hit
if (monkeyPosition.y < scrollBottomLimit) {
[myWorld setPosition:CGPointMake(0, 0)];
}
// Top limit hit
if (monkeyPosition.y > scrollTopLimit) {
[myWorld setPosition:CGPointMake(0, -scrollTopLimit)];
}
}
// At far right scrolling
if (monkeyPosition.x > scrollRightLimit) {
// No y limits hit
if (monkeyPosition.y > scrollBottomLimit && monkeyPosition.y < scrollTopLimit) {
[myWorld setPosition:CGPointMake(-scrollRightLimit, -monkeyPosition.y)];
}
// Bottom limit hit
if (monkeyPosition.y < scrollBottomLimit) {
[myWorld setPosition:CGPointMake(-scrollRightLimit, 0)];
}
// Top limit hit
if (monkeyPosition.y > scrollTopLimit) {
[myWorld setPosition:CGPointMake(-scrollRightLimit, -scrollTopLimit)];
}
}
// At far bottom scrolling
if (monkeyPosition.y < scrollBottomLimit) {
// No x limits hit
if (monkeyPosition.x > scrollLeftLimit && monkeyPosition.x < scrollRightLimit) {
[myWorld setPosition:CGPointMake(-monkeyPosition.x, 0)];
}
// Left limit hit
if (monkeyPosition.x < scrollLeftLimit) {
[myWorld setPosition:CGPointMake(0, 0)];
}
// Right limit hit
if (monkeyPosition.x > scrollRightLimit) {
[myWorld setPosition:CGPointMake(-scrollRightLimit, 0)];
}
}
// At far top scrolling
if (monkeyPosition.y > scrollTopLimit) {
// No x limits hit
if (monkeyPosition.x > scrollLeftLimit && monkeyPosition.x < scrollRightLimit) {
[myWorld setPosition:CGPointMake(-monkeyPosition.x, -scrollTopLimit)];
}
// Left limit hit
if (monkeyPosition.x < scrollLeftLimit) {
[myWorld setPosition:CGPointMake(0, -scrollTopLimit)];
}
// Right limit hit
if (monkeyPosition.x > scrollRightLimit) {
[myWorld setPosition:CGPointMake(-scrollRightLimit, -scrollTopLimit)];
}
}
}
ibt es eine elegante Möglichkeit, dies zu beheben? Bisher habe ich nur die Idee, mehr Code in @ aufzunehmecenterOnNode
das setzt die Positionen von jedem @ zurüphysicsBody
immyWorld
.