Нарисуйте многоугольник с бурундуком и Госу в рубине - PullRequest
4 голосов
/ 16 апреля 2011

Я новичок в разработке игр, и я подумал, что было бы весело попробовать Gosu, Ruby и Chipmunk вместе.Пока у меня есть игрок и мяч на 2d поле сверху вниз, и они сталкиваются.Моя проблема сейчас в том, что я хочу, чтобы мой игрок был квадратным.
Я сосал математику в старшей школе, и это было слишком много лет назад, чтобы думать о ней.Документация для Бурундука говорит об этом при рисовании многоугольника:

# Create a poly collision shape attached to the given body at
# the given offset with the given vertexes. _verts_ must be an
# Array of CP::Vect with a counterclockwise winding.
 def initialize(body, verts, offset); end

У меня есть этот код, чтобы получить мой многоугольник прямо сейчас:

verts = Array.new
verts.push(CP::Vec2.new(0,32))
verts.push(CP::Vec2.new(32,32))
verts.push(CP::Vec2.new(32,0))
verts.push(CP::Vec2.new(0,0))

@shape = CP::Shape::Poly.new(@body, verts, CP::Vec2.new(0,0))

В результате получается форма, прикрепленная к моемуквадратный png, но кажется, что 0,0 - это верхний левый угол изображения, а фактический полигон начинается еще дальше к верху слева от изображения.

Поэтому я предположил, что должен установить «Смещение» на половину моей ширины многоугольника, но это не дает мне правильного результата.

Я уверен, что для большинства присутствующих здесь это элементарно.Но я все еще в начальной стадии разработки игры.
Может кто-нибудь объяснить мне, пожалуйста?

РЕДАКТИРОВАТЬ
Здесь - мой полный код на 5/28/2011

Ответы [ 2 ]

4 голосов
/ 03 июня 2011

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

По сути, ваш мяч нарисован с центром в x, y, а игрок нарисован с верхним левым углом на x, y.Это в сочетании с тем, что ваша форма Игрока не центрирована по x, y, создает вам трудности.

Чтобы отцентрировать рисунок вашего игрока, просто используйте метод draw_rot с углом 0, чтобы избежать поворота изображения.

class Player
  def draw
    @image.draw_rot(@shape.body.pos.x, @shape.body.pos.y, 1, 0, 0.5, 0.5, 1, 1)
  end
end

Чтобы форма Бурундука соответствовала центрированному изображению игрока, вам необходимо сместить вершины на половину размера фигуры.Вы можете жестко закодировать это, выполнив

class Player
  def initialize(space, image) 
    ...
    verts = Array.new
    verts.push(CP::Vec2.new(-16,16))
    verts.push(CP::Vec2.new(16,16))
    verts.push(CP::Vec2.new(16,-16))
    verts.push(CP::Vec2.new(-16,16))
    ...
  end
end

или просто сделать это во время выполнения с помощью

CP::recenter_poly(verts)

, прежде чем добавить verts к своей форме.

С этими изменениями вЯ подозреваю, что ваша физика будет вести себя так, как вы ожидаете.

2 голосов
/ 25 апреля 2011

Если вы хотите, чтобы квадрат 32х32 имел верхний левый угол в (0,0), ваши координаты должны выглядеть следующим образом: (0,32); (32,32); (32,0); (0,0). Или это 31 вместо 32? Для определения многоугольника Бурундука пригодятся ручка и бумага.

Стоит отметить, что Бурундук не имеет абсолютно никакого представления о рендеринге - все, что он делает, это расчеты абстрактной физики. Итак, что вы хотите здесь, это определить квадрат. рисунок выполнен в Госу и отделен от фигур Бурундука, как вы уже испытали до боли :) Заставляет меня думать, что готовая библиотека для визуализации фигур бурундуков в Госу была бы хорошей, но я не Бурундук сам пользователь.

...