Установите физическое тело на постоянную скорость

Перемещение мяча с постоянной скоростью

Я попытался сделать коробку из шаров, в которой шары движутся с постоянной скоростью. Они не должны замедляться при столкновении друг с другом. Я думаю, что я правильно установил все свойства, но это не сработало, и через 30 секунд все шары перестали двигаться.

Коробка настроена так:

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    self.physicsBody.dynamic = false
    self.physicsBody.restitution = 1
    self.physicsBody.friction = 0

Шарики устанавливаются так:

введите здесь описание изображения

Это ошибка физического движка или я что-то упустил?


person Miaucl    schedule 17.06.2014    source источник
comment
Я решил проблему с помощью метода update: для установки скорости, но делать это каждый кадр для каждого мяча очень дорого. Есть ли лучшее решение?   -  person Miaucl    schedule 17.06.2014


Ответы (2)


Если вы хотите, чтобы они имели постоянную скорость все время, без каких-либо изменений, вам придется установить их скорость на вектор фиксированной длины в обновлении SKScene. Физические двигатели не предназначены для строгого соблюдения закона сохранения энергии... или можно утверждать, что часть энергии рассеивается при нагревании устройства. ;)

Общий принцип сохранения того же направления, но приведения длины/скорости вектора к фиксированному значению (псевдокод):

CGPoint velocity = somePhysicsBody.velocity;
velocity = normalized(velocity);
velocity = multiply(velocity, desiredSpeed);
somePhysicsBody.velocity = velocity;
person LearnCocos2D    schedule 17.06.2014
comment
В этом случае мой метод update: является самым быстрым решением. Улучшение может быть, когда я создам собственный updateVelocities: и назову его каждые 100 мс или что-то еще, что обеспечивает постоянное движущееся впечатление. - person Miaucl; 17.06.2014
comment
Что бы это было в быстром? У меня чертовски много времени, чтобы преобразовать его и заставить его работать. - person Siriss; 04.01.2015

В дополнение к ответу Штеффена (LearnCocos2D) методы, упомянутые в псевдокоде, можно найти в этом очень хорошем Рэе Вендерлихе руководство.

static inline CGPoint rwAdd(CGPoint a, CGPoint b) {
    return CGPointMake(a.x + b.x, a.y + b.y);
}

static inline CGPoint rwSub(CGPoint a, CGPoint b) {
    return CGPointMake(a.x - b.x, a.y - b.y);
}

static inline CGPoint rwMult(CGPoint a, float b) {
    return CGPointMake(a.x * b, a.y * b);
}

static inline float rwLength(CGPoint a) {
    return sqrtf(a.x * a.x + a.y * a.y);
}

// Makes a vector have a length of 1
static inline CGPoint rwNormalize(CGPoint a) {
    float length = rwLength(a);
    return CGPointMake(a.x / length, a.y / length);
}

Они используют CGPoint в качестве параметров и возвращаемого значения, но это можно легко преобразовать в использование CGVector.

Эти методы очень полезны для физических вычислений, и вы найдете им применение во многих случаях. Лучше всего хранить эти методы в отдельном заголовочном файле и использовать их в коде по всему проекту.

person ZeMoon    schedule 17.06.2014
comment
Это очень полезно. Я конвертирую их в Swift. - person Miaucl; 17.06.2014