Pygame collidepoint () не учитывает blit () - PullRequest
0 голосов
/ 18 апреля 2020

Извините за любые грамматические ошибки, так как я не английский sh спикер

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

    import pygame

    def run(l, h, fps, scene):
        pygame.init()
        ecran = pygame.display.set_mode((l, h))
        clock = pygame.time.Clock()

        scene_active = scene

        while scene_active != None:
            key = pygame.key.get_pressed()
            filtre_touche = []

            for event in pygame.event.get():
                close = False
                if event.type == pygame.QUIT:
                    close = True
                elif event.type == pygame.KEYDOWN:
                    alt = key[pygame.K_LALT] or touche_active[pygame.K_RALT]
                    if event.key == pygame.K_ESCAPE:
                        close = True
                    elif event.key == pygame.K_F4 and alt:
                        close = True
                if close :
                    scene.quit()
                else :
                    mouse_pos = pygame.mouse.get_pos()
                    filtre_touche.append(event)

            scene_active.traite_input(filtre_touche, key, mouse_pos)
            scene_active.update()
            scene_active.render(ecran)

            scene_active = scene_active.next

            pygame.display.flip()
            clock.tick(fps)

    surface = pygame.Surface((320,320))
    M = []
    for i in range(10):
        x = []
        for j in range(10):
            x.append(pygame.draw.rect(surface, (255,255,255),(i*32, j*32, 32,32), 1))
        M.append(x)
    print(M)

    class FirstScreen():
        def __init__(self):
            self.next = self
        def traite_input(self, evenement, touche, mouse_pos):
            for event in evenement :
                if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
                    pygame.quit()
            for line in M :
                for row in line:
                    if row.collidepoint(mouse_pos):
                        print('collide')

        def update (self):
            pass
        def render(self, ecran):
            ecran.fill((200,200,200))
            ecran.blit(surface, (350,250), surface.get_rect())

    run(800,600,60, FirstScreen())

Если вы запустите это, вы увидите, что поверхность находится там, где мы ожидаем быть и плитка на самом деле имеют 32 на 32. Но наведение мыши над сеткой не имеет никакого эффекта. Оператор печати вызывается, когда вы наводите указатель мыши на то место, где должна быть сетка, если я перевернул поверхность на 0,0.

Я что-то упустил? После поиска на этом сайте, pygame do c и все виды форумов, я, кажется, единственный, с этой проблемой, что я делаю не так?

1 Ответ

0 голосов
/ 18 апреля 2020

Это потому, что вы помещаете сетку на поверхность, близаете поверхность на экране, поэтому, когда вы создаете сетку, вы начинаете с 0 поверхности. Затем сгладьте поверхность в середине (я sh) экрана, когда вы делаете collidepoint. мышь находится над ним, когда рядом с 0, в левом верхнем углу всего экрана. По сути, положение мыши в окне переводится на поверхность, поэтому при наведении курсора мыши на сетку позиция мыши в окне не находится на сетке на поверхности. если это имеет смысл.

Простое исправление:

if row.collidepoint((mouse_pos[0] - 350,mouse_pos[1] - 250)):

переместите указатель мыши назад, чтобы 0,0 на поверхности было 0,0 в окне

...