2016-08-17 5 views
1

В моей игре я создаю несколько шаров, которые выполняются гравитацией. Когда игра начинается, они выпадают из экрана и получают свои места внизу. Никакая другая сила не применяется к ним.Физика SpriteKit дает разные результаты каждый раз

Проблема заключается в том, что я создаю эти шары с точными координатами, точными физическими атрибутами, такими как предыдущий, но результат не является тем же. Это похоже, но не так. Но я думаю, что это должно быть точно так же, потому что в каждый момент значения одинаковы.

Вы можете понять, что я сказал на этих 3 рисунках ниже. enter image description hereenter image description hereenter image description here

У вас есть идеи, почему это происходит? Как я могу это решить?

Это, как я создаю спрайт узлы:

BallSpriteNode *sprite = [BallSpriteNode spriteNodeWithTexture:ballTexture]; 
sprite.xScale = scale; 
sprite.yScale = scale; 
sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2]; 
sprite.physicsBody.density = 1.0f; 
sprite.physicsBody.restitution = 0; 
sprite.physicsBody.dynamic = YES; 
sprite.physicsBody.categoryBitMask = ballHitCategory; 
sprite.physicsBody.contactTestBitMask = ballHitCategory; 
sprite.physicsBody.collisionBitMask = ballHitCategory; 

CGPoint startPosition = CGPointMake(xPosition, yPosition); 
sprite.position = startPosition; 

[bounceScene addChild:sprite]; 
+0

Если вы хотите получить точный результат каждый раз, чтобы физический движок не определял, что должно произойти. Возьмите контроль в своих руках. Означает, отключает физический движок, пока вы не разместите объекты в их исходных положениях. Затем используйте SKActions для перемещения объектов там, где это необходимо. После этого вы можете повторно активировать физические объекты на этих объектах, и вам хорошо идти. – Whirlwind

+0

Это не вариант для меня. Я имею несколько уровней и на каждом уровне различный набор шариков. Я не могу сделать это для каждой другой ситуации. Физика должна вести себя последовательно. – mkeremkeskin

+0

Итак, где проблема? Создайте массив начальных позиций для каждого объекта (или определите CGPoint за шар, который представляет его исходное положение). Вы не можете полагаться на физический движок так, как хотите. – Whirlwind

ответ

2

Есть много факторов, участвующих в создании физического движка менее случайным образом.

FPS сильно влияет на случайность. В SKSpriteKit Physics у вас есть метод Update в SKScene, который вызывается один раз в каждом кадре и несут разницу во времени с предыдущими кадрами. Обычно, чтобы сделать его менее случайным, вы должны каким-то образом переопределить метод.

Или используйте другие физические двигатели, которые настраиваются (Bullet Physics). Очень легко получить такой же результат, только отрегулировав вызов функции StepSimulation.

Смежные вопросы