用 pygame 选择一个特定的矩形

问题描述

我正在学习python和pygame,我正在尝试制作一个纸牌游戏;我已经完成了逻辑的基础知识,但我正在为一个简单的 GUI 苦苦挣扎。 我需要让玩家能够从草稿行中选择一张牌并将其放在他们的 6x4“板上”。为此,我像这样绘制了矩形:

class Board:
    def __init__(self):
        self.visible_draft = []
        self.placed_totems_P1 = [[]]
        self.placed_totems_P2 = [[]]

    def draw_card_base(self,window):
        window.fill(WHITE)
        for col in range(COLS):
            y = 770 - col*175
            for row in range(ROWS):
                x = row*175 + 40
                pygame.draw.rect(window,GREY,(x,y,CARD_SIZE,CARD_SIZE))
def main():
    board = Board()

    while run:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                pygame.quit()
        board.draw_card_base(window)
        pygame.display.flip()

但现在我被卡住了,因为我不知道如何让玩家“选择”一个插槽来放置所选择的卡片(我假设会以相同的方式选择,就在之前)。我阅读了有关碰撞的信息,并考虑编写手册“如果鼠标在这里,这就是它所在的插槽”。理想情况下,我想我可以阅读可能是 1A、1B、2C 纸张格式的卡片,但我真的不知道从哪里开始。 希望这是有道理的,可能我没有合适的词汇来描述我想说的话,我还在学习!很高兴得到答案,谢谢!

解决方法

使用 pygame.Rectcollidepoint() 查看鼠标是否在板上。计算鼠标指针所在的行和列:

while run:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

            if event.type == pygame.MOUSEBUTTONDOWN:

                mx,my = event;
                
                board_rect = pygame.Rect(40,770 - ROWS*175,COLS*175,ROWS*175)
                if board_rect.collidepoint(mx,my):

                    col = (mx - 40) // COLS
                    row = (my - 770 + ROWS*175) // ROWS
                 
                    print(col,row)

另见Pygame mouse clicking detection