2016-01-27 11 views
-1

Image showing rectangles used for collisions.Как сделать прямоугольник невидимым? (Pygame)

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

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

EDIT: это было бы возможно создать поверхность под основной, чтобы добавить их к? И если это так, это все равно позволит столкнуться между спрайтом (который находится на другой поверхности)? Я не спрашиваю об цветах алоха, поэтому, пожалуйста, не соглашайтесь с этим другим вопросом. Также этот вопрос говорит о частично прозрачных прямоугольниках, а не о том, что я хочу знать.

+2

Должен ли он быть рисоваться для обнаружения столкновений? – M4rtini

+0

Можете ли вы попробовать: 'zone1rect = pygame.draw.rect (SURF, (0,0,0), (200, 418, 52, 188), -2)'. мое мнение: нужно значение -2, если ширина означает границу. – dsgdfg

+0

Я довольно новичок во всем бизнесе столкновений, поэтому в настоящий момент я могу заставить это работать, не устанавливая стены как отдельные объекты, используя прямоугольники. И идея -2 не сработала :( – gruntapocalypse

ответ

-1

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

Я установил переменные прямоугольника перед линией «while True» (что, если вы не знаете, что я имею в виду, это строка, которая устанавливает код для запуска, пока окно игры фактически открыто). Затем я помещаю раздел «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() 

(^ Функция поверхности)

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

Надеется, что это помогает кому-либо еще с этим вопросом, особенно тех, кто не уверены в альфа цвета и такие :)

+0

вам не нужно рисовать этот прямоугольник, если вы его не используете. Я верю, что ваша проблема - pygame.Rect, которую все используют, чтобы проверить коллизию и blit player на экране. – furas

+0

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

1

Вам нужно 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
учебник: Program Arcade Games With Python And Pygame

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