首页 > 解决方案 > 有没有办法在给定 Rect 对象列表的情况下检查 MOUSBUTTONDOWN 事件?

问题描述

我正在为我的最后一个班级项目制作一个游戏,由于某种原因,当它在列表中时,我无法检查矩形对象上的点击事件。如果我使用 for 循环遍历 Opened_Pack 列表并尝试单击它,那么什么也不会发生(这是我下面的代码)。当我使用索引([0]、[1] 等)尝试它时,无论我使用什么数字或列表有多大,都会出现索引超出范围错误。所以我想我的问题是:如果数据存储在列表中,有没有办法检查我是否点击了矩形?必须有,我敢肯定,但我无法弄清楚。

Opened_Pack = []
Pack_Card_Recs = []

for event in pygame.event.get():
    mouse = pygame.mouse.get_pos()

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_ESCAPE:
            window = pygame.display.set_mode((850,850), pygame.RESIZABLE)
            #Key Bindings to open Packs, WILL BE REPLACED WITH CLICKS (eventually)
        if event.key == pygame.K_r:
            Opened_Pack = TwoPlayerPack.Open()
            Pack_Card_Recs = [Opened_Pack[i].getRect() for i in range(len(Opened_Pack))]
            #print(Pack_Card_Recs[0])
        elif event.key == pygame.K_e:
            Opened_Pack= SixPlayerPack.Open()
            Pack_Card_Recs = [Opened_Pack[i].getRect() for i in range(len(Opened_Pack))]
        elif event.key == pygame.K_t:
            Opened_Pack = SevenPlayerPack.Open()
            Pack_Card_Recs = [Opened_Pack[i].getRect() for i in range(len(Opened_Pack))]
        elif event.key == pygame.K_u:
            Opened_Pack= FourPlayerPack.Open()
            Pack_Card_Recs = [Opened_Pack[i].getRect() for i in range(len(Opened_Pack))]

    if event.type == pygame.MOUSEBUTTONDOWN:
        x, y = event.pos
        for i in range(len(Opened_Pack)):
            if Pack_Card_Recs[i].collidepoint(x,y):
                print("Clicked Player at index: " + str(i))

    if event.type == pygame.QUIT:
        run = False

标签: pythonpygamerect

解决方案


代码正在迭代 的长度Opened_Pack,而有问题的矩形存储在列表中Pack_Card_Recs。只需修改循环范围即可修复它。

if event.type == pygame.MOUSEBUTTONDOWN:
    x, y = event.pos
    print( "%d rectangles to check" % ( len( Pack_Card_Recs ) ) )
    for i in range( len( Pack_Card_Recs ) ):             # <-- HERE, not Opened_Pack
        r = Pack_Card_Recs[i]
        print( "Is point (%d, %d) inside Rect #%d [%d, %d, %d x %d]" % ( x, y, i, r.x, r.y, r.width, r.height ) )
        if r.collidepoint( x,y ):
            print( "Clicked Player at index: " + str( i ) )

编辑:添加了一堆调试代码


推荐阅读