сверху вниз трения в пымнке - PullRequest
1 голос
/ 07 марта 2011

Пару дней боролся с этим, трудно найти примеры кода в сети.

Я делаю игру сверху вниз и не могу заставить игрока двигаться по нажатию клавиши. В данный момент я использую add_force или add_impulse, чтобы переместить игрока в направлении, но игрок не останавливается. Я читал об использовании поверхностного трения между пространством и игроком для симуляции трения, и вот как это делается в демонстрационной версии tank.c .

Однако я недостаточно понимаю API для переноса этого кода с бурундука на pymunk.

cpConstraint *pivot = cpSpaceAddConstraint(space, cpPivotJointNew2(tankControlBody, tankBody, cpvzero, cpvzero));

Пока у меня есть нечто, похожее на это:

class Player(PhysicalObject):
    BASE_SPEED = 5
    VISIBLE_RANGE = 400
    def __init__(self, image, position, world, movementType=None):
        PhysicalObject.__init__(self, image, position, world)
        self.mass = 100
        self.CreateBody()
        self.controlBody = pymunk.Body(pymunk.inf, pymunk.inf)
        self.joint = pymunk.PivotJoint(self.body, self.controlBody, (0,0))
        self.joint.max_force = 100
        self.joint.bias_coef = 0
        world.space.add(self.joint)

Я не знаю, как добавить ограничение пространства / игрока в пространство.

(Нужен кто-то с 1500+ повторениями для создания тега пимунка для этого вопроса).

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Джо разместил вопрос на форуме Бурундук / Пимунк, и получил еще пару ответов. http://www.slembcke.net/forums/viewtopic.php?f=1&t=1450&start=0&st=0&sk=t&sd=a

Я вставил / отредактировал части моего ответа на форуме ниже:

#As pymunk is python and not C, the constructor to PivotJoint is defined as
def __init__(self, a, b, *args):
    pass

#and the straight conversion from c to python is
pivot1 = PivotJoint(tankControlBody, tankBody, Vec2d.zero(), Vec2d.zero())
# but ofc it works equally well with 0 tuples instead of the zero() methods:
pivot2 = PivotJoint(tankControlBody, tankBody, (0,0), (0,0))

mySpace.add(pivot1, pivot2)

В зависимости от того, отправляете ли вы один или два аргумента аргументам, он будет использовать метод cpPivotJointNew или cpPivotJointNew2 в интерфейсе C для создания соединения. Разница между этими двумя методами заключается в том, что cpPivotJointNew хочет одну точку вращения в качестве аргумента, а cpPivotJointNew2 хочет две точки привязки. Таким образом, если вы отправите один Vec2d, пимунк будет использовать cpPivotJointNew, но если вы отправите два Vec2d, он будет использовать cpPivotJointNew2.

Полная документация конструктора PivotJoint находится здесь: Документы конструктора PivotJoint

0 голосов
/ 07 марта 2011

Я не знаком ни с одной из упомянутых вами систем, но некоторые основные идеи игры, которые могут относиться к этому:

  • Если вы добавите силу (или импульс), которая влияет на движениеЧтобы сущность остановилась, вы также должны забрать ее.В моих играх, если бы у меня была функция AddImpulse () / AddForce (), у меня была бы соответствующая функция, такая как Apply_Friction (), которая бы изменяла эффект на сколько угодно (в зависимости от ландшафта?) До тех пор, пока скорость движения не станет равной нулю или меньше.Лично я не стал бы беспокоиться об этом методе движения, если он не нужен для игрового процесса, поскольку он может добавлять больше вычислений, которые стоят каждого обновления.

  • Должен быть какой-то способ отслеживания KeyPressed и / илиKeyPosition, а затем с использованием этих координат x / y увеличиваются в зависимости от скорости игрока.Не зная, что вы пробовали или сколько API делает для вас, трудно действительно сказать больше.

Надеюсь, это поможет.Если это то, что вы уже знали, пожалуйста, игнорируйте это.

...