2013-12-04 5 views
0

Я ищу самый простой способ реализовать это. Я пытаюсь реализовать платформы (с полным обнаружением конфликтов), которые вы можете нарисовать с помощью мыши. Прямо сейчас у меня есть функция рисования линии, которая на самом деле рисует маленькие круги, но они настолько близки друг к другу, что они более или менее похожи на линию. Было бы лучшим решением создать небольшие pygame.Rect объекты в каждом круге? Это будет много прямых объектов. Это не образ, поэтому идеальный пиксель не кажется вариантом?PyGame Platformer с интерактивными платформами «Drawn» В

def drawGradientLine(screen, index, start, end, width, color_mode): 
    #color values change based on index 
    cvar1 = max(0, min(255, 9 * index-256)) 
    cvar2 = max(0, min(255, 9 * index)) 
    #green(0,255,0), blue(0,0,255), red(255,0,0), yellow(255,255,0) 
    if color_mode == 'green': 
     color = (cvar1, cvar2, cvar1) 
    elif color_mode == 'blue': 
     color = (cvar1, cvar1, cvar2) 
    elif color_mode == 'red': 
     color = (cvar2, cvar1, cvar1) 
    elif color_mode == 'yellow': 
     color = (cvar2, cvar2, cvar1) 
    dx = end[0] - start[0] 
    dy = end[1] - start[1] 
    dist = max(abs(dx), abs(dy)) 
    for i in xrange(dist): 
     x = int(start[0]+float(i)/dist*dx) 
     y = int(start[1]+float(i)/dist*dy) 
     pygame.draw.circle(screen, color, (x, y), width) 

Это моя функция рисования. И вот моя петля, которую я поставил в своем основном цикле игровых событий.

i = 0 
    while (i < len(pointList)-1): 
     drawGradientLine(screen, i, pointList[i], pointList[i + 1], r, mode) 
     i += 1 

Спасибо за любую помощь, обнаружение столкновений дает мне огромную головную боль прямо сейчас (до сих пор не может получить это право для моей плитки либо ..).

ответ

0

Любая причина, по которой вы хотите придерживаться кругов?

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

Вы также не сохраняете свои нарисованные объекты в любом месте (например, в списке или spritegroup), так как вы собираетесь проверять наличие столкновения?


Вот LevelEditor я сделал для игры некоторое время назад, он не идеален, но он работает:

https://gist.github.com/marcusmoller/bae9ea310999db8d8d95

Как это работает:

  • Весь игровой уровень делится вверх в сетку 10x10px для упрощения рисования
  • Контроллер уровня проверяет, нажата ли мышь, а затем сохраняет эту мышь позиция
  • Игрок теперь перемещает мышь в другое положение и отпускает кнопку мыши, теперь уровень иерархии сохраняет эту новую позицию.
  • Теперь у вас есть две разные координаты и вы можете легко сделать из них прямоугольник.
0

Вместо того, чтобы создать целую кучу rect объектов, чтобы проверить столкновение против, я буду рекомендовать создать что-то называется mask из втянутого collideable объекта и испытания на столкновение с этим. В основном, mask - это карта, в которой используются пиксели, а какие нет в изображении. Вы можете почти думать об этом как о тене или силуэте поверхности.

Когда вы звоните pygame.draw.circle, вы уже проходите на поверхности. Прямо сейчас вы рисуете прямо на экране, что может быть не так полезно для того, что я предлагаю. Я бы рекомендовал создать rect, который покрывает всю площадь линии, которую рисуют, а затем создает поверхность этого размера, а затем нарисует линию на этой поверхности. Мой код предполагает, что вы уже знаете границы точек линии.

line_rect = pygame.Rect(leftmost, topmost, rightmost - leftmost, bottommost - topmost) 
line_surf = pygame.Surface((line_rect.width, line_rect.height)) 

В вашей drawGradientLine функции, вы должны перевести координаты точки в пространстве объекта в line_surf.

while (i < len(pointList)-1): 
    drawGradientLine(line_surf, (line_rect.x, line_rect.y), i, pointList[i], pointList[i+1], r, mode) 
    i += 1 

def drawGradientLine(surf, offset, index, start, end, width, color_mode): 
    # the code leading up to where you draw the circle... 
    for i in xrange(dist): 
     x = int(start[0]+float(i)/dist*dx) - offset[0] 
     y = int(start[1]+float(i)/dist*dy) - offset[1] 
     pygame.draw.circle(surf, color, (x, y), width) 

Теперь у вас будет поверхность с нарисованным объектом, блистающим к ней. Обратите внимание: возможно, вам придется добавить некоторые прокладки на поверхность, когда вы создадите их, если ширина линий, которые вы рисуете, больше 1.

Теперь, когда у вас есть поверхность, вам нужно будет создать mask ,

surf_mask = pygame.mask.from_surface(line_surf) 

Надеюсь, это не слишком сложно для вас! Теперь вы можете либо проверить каждую «активную» точку в маске для столкновения в пределах rect от вашего плеера (или любых других объектов, с которыми вы хотите столкнуться с вставными платформами), или вы можете создать маску с поверхности такого игрока объект и использовать функцию pygame.Mask.overlap_area для проверки идеального столкновения с пикселем.

# player_surf is a surface object I am imagining exists 
# player_rect is a rect object I am imagining exists 
overlap_count = surf_mask.overlap_area(player_surf, (line_rect.x - player_rect.x, line_rect.y - player_rect.y)) 

overlap_count должен быть подсчет числа пикселов, которые перекрывают между масками. Если это больше нуля, то вы знаете, что произошло столкновение.

Вот документация pygame.Mask.overlap_area: http://www.pygame.org/docs/ref/mask.html#pygame.mask.Mask.overlap_area

+0

Спасибо, я не думаю об использовании масок/не думаю, что было бы работать. Одна вещь, которая меня путает, - так, учитывая, что я обнаружил столкновение, то что? Как я могу сделать так, чтобы мой «игрок» мог фактически пересекать эту область? Должен ли я добавлять маскированные случаи к обнаружению конфликтов? Не могли бы вы представить краткие примеры этого? – user3064211

+0

Извините за все вопросы, и еще раз спасибо. – user3064211

+0

Значит, вы не знаете, что делать после обнаружения столкновения? Это зависит от контекста. Во-первых, вы, вероятно, захотите, чтобы игрок не проходил через нарисованную платформу, а это означает, что если обнаружено столкновение, вам нужно слегка переместить игрока, чтобы он больше не высунул «внутри» платформы. Это позволило бы вам «приземлиться» на платформе, а также не дать вам прыгать через нее. Если вы хотите пройтись по неровной платформе без необходимости прыгать, это более сложная проблема. – Haz

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