Как сделать прямоугольник невидимым? (Pygame)

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

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

zone1rect = pygame.draw.rect(SURF, (0,0,0), (200, 418, 52, 188), 1)

РЕДАКТИРОВАТЬ: можно ли создать поверхность под основной, чтобы добавить их? И если да, то позволит ли это столкновение между спрайтами (находящимися на другой поверхности)? Я не спрашиваю о цветах алоха, поэтому, пожалуйста, не связывайте это с другим вопросом. Также этот вопрос говорит о частично прозрачных прямоугольниках, а не о том, что я хочу знать.


person gruntapocalypse    schedule 27.01.2016    source источник
comment
Нужно ли его вообще рисовать для обнаружения столкновений?   -  person M4rtini    schedule 27.01.2016
comment
Можешь попробовать : zone1rect = pygame.draw.rect(SURF, (0,0,0), (200, 418, 52, 188), -2). мое мнение: нужно значение -2, если ширина означает границу.   -  person dsgdfg    schedule 27.01.2016
comment
Я новичок во всем, что касается столкновений, поэтому на данный момент единственный способ заставить это работать, не устанавливая стены как отдельные объекты, - это использовать прямоугольники. И идея -2 не сработала :(   -  person gruntapocalypse    schedule 27.01.2016
comment
Как вы сравниваете расположение двух прямоугольников, чтобы определить, произошло ли столкновение?   -  person M4rtini    schedule 27.01.2016
comment
Ой ! @fafl прав. Но дополнительно: сканируйте точку курсора и слушайте щелчок мыши (так что не нужно никакой отмеченной области)   -  person dsgdfg    schedule 27.01.2016
comment
Я уже видел этот вопрос, и он говорит об альфа-цветах, и я не очень его понял, извините, если это похоже на дубликат :(   -  person gruntapocalypse    schedule 27.01.2016
comment
И я использую .colliderect() для проверки столкновений.   -  person gruntapocalypse    schedule 27.01.2016
comment
.colliderect() также можно использовать для прямоугольных объектов, не отрисовываемых на экране. Если вы действительно хотите его нарисовать, вы можете нарисовать эти прямоугольники перед фоном\плеером, чтобы он оказался под всем остальным.   -  person M4rtini    schedule 27.01.2016
comment
Попробую тогда :) Спасибо   -  person gruntapocalypse    schedule 27.01.2016
comment
Как мне создать отдельную поверхность только для добавления прямоугольников за основной поверхностью? Не уверен, что он работает правильно: / Использовал SURF=pygame.display.set_mode((width,height),0,32) для основной поверхности.   -  person gruntapocalypse    schedule 27.01.2016
comment
Я не очень хорошо знаком с pygame, но обычно вещи рисуются в том порядке, в котором они называются. Так что вызов рисования в прямоугольниках сначала сделает это, я думаю   -  person M4rtini    schedule 27.01.2016
comment
вы должны использовать этот прямоугольник pygame.Rect(), чтобы проверить столкновение, а не pygame.draw.rect()   -  person furas    schedule 27.01.2016


Ответы (2)


Вам нужен pygame.Rect(), который все используют, чтобы сохранить позицию игрока, проверить столкновение и вывести игрока на экран.

Положение и размер игрока

player_image = ...
player_rect = pygame.Rect(p_spritex, p_spritey, 30, 40)

проверить столкновение

player_rect.colliderect(enemy_rect)

ничья игрок

SURF.blit(player_image, player_rect)

И вам не нужно использовать draw.rect

prect = pygame.draw.rect(SURF, (0,0,0), (p_spritex, p_spritey, 30, 40), 1)

потому что это бесполезно

документ: pygame.Rect
учебник: Программирование аркадных игр с помощью Python и Pygame

person furas    schedule 27.01.2016

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

Я устанавливаю переменные прямоугольника перед строкой «пока правда» (которая, если вы не уверены в том, что я имею в виду, это строка, которая устанавливает код для запуска, пока окно игры фактически открыто). Затем я поместил раздел «blit», где все изображения устанавливаются на поверхность, в единую функцию, которая будет выполняться все время. Я сделал переменные прямоугольника глобальными и просто вызывал их в этой функции перед фоновым изображением, которое их закрывало:

def surface():
    global zone1rect
    global zone2rect
    global zone3rect
    global bl
    global prect
    zone1rect
    zone2rect
    zone3rect
    bl
    prect = pygame.draw.rect(SURF, (0,0,0), (p_spritex, p_spritey, 30, 40), 1)
    SURF.blit(background,(0,0))
    SURF.blit(p_sprite,(p_spritex,p_spritey))
surface() 

(^ Поверхностная функция)

Как видите, прямоугольник игрока (окружающий основной спрайт) сделан глобальным и «создается» в этой функции просто потому, что координаты меняются в зависимости от движений игрока, поэтому мне пришлось обращаться с ними немного по-другому.

Надеюсь, это поможет кому-нибудь еще с этой проблемой, особенно тем, кто не уверен в альфа-цветах и ​​тому подобном :)

person gruntapocalypse    schedule 27.01.2016
comment
вам не нужно рисовать этот прямоугольник, если вы его не используете. Я думаю, что ответ на вашу проблему - pygame.Rect, который все используют для проверки столкновений и ударов игрока на экране. - person furas; 27.01.2016
comment
Я собирался буквально сделать что-то вроде sprite.get_rect(), чтобы просто получить информацию о прямоугольнике для игрока, но в то время казалось, что это работает не очень хорошо, но, по крайней мере, теперь это работает так же хорошо :D - person gruntapocalypse; 27.01.2016