0

pygame アプリには 2 列のボタンがあります。ボタンをクリックすることで、ボタンのオンとオフを切り替えることができます。

問題は、マウスが垂直方向にどこにあっても、その列のボタンを 1 つだけではなく、すべて同時にクリックすることです。(あたかも y 軸全体が一度にクリックされたかのように)。クリックごとにマウス イベントの x 座標と y 座標を出力しましたが、座標は通常どおり 1 つのボタンの位置内にありました。では、1 つのボタンだけでなく、複数のボタンがオンまたはオフになるのはなぜでしょうか。ボタンの垂直範囲のはるか下をクリックしても、x座標がまだ範囲内にある限り、ボタンはアクティブになりました。とにかく、これがコードの一部です(番号付けシステムが貧弱で申し訳ありません):

    if event.type == pygame.MOUSEBUTTONUP:
        if event.pos < (130,130) and event.pos > (100,100):
            if seq01[0] == 0:
                seq01[0] = 1
                block_00 = block_on
            else:
                seq01[0] = 0
                block_00 = block_off
            print event.pos

        if event.pos < (170,130) and event.pos > (140,100):
            if seq01[1] == 0:
                seq01[1] = 1
                block_01 = block_on
            else:
                seq01[1] = 0
                block_01 = block_off

        #### this is the start of the second row ####
        if event.pos < (130,200) and event.pos > (100,170):
            if seq02[0] == 0:
                seq02[0] = 1
                block_2_00 = block_on
            else:
                seq02[0] = 0
                block_2_00 = block_off
4

2 に答える 2

2

問題は、マウスの位置(整数のペア)をボタンの角(別の整数のペア)と比較していることです。Pythonはシーケンスを要素ごとに比較するため、テストでは実際には最初の軸(X)のみを調べます。

ボタンごとにpygame.Rectを作成することを強くお勧めします。そうすれば、ボタンがその領域内にあるかどうかをより簡単にテストできます。

そうすると、コードは次のようになります。

if event.type == pygame.MOUSEBUTTONUP:
    if rect_00.collidepoint(event.pos):
        if seq01[0] == 0:
            seq01[0] = 1
            block_00 = block_on
        else:
            seq01[0] = 0
            block_00 = block_off
        print event.pos

    if rect_01.collidepoint(event.pos):
        if seq01[1] == 0:
            seq01[1] = 1
            block_01 = block_on
        else:
            seq01[1] = 0
            block_01 = block_off

    #### this is the start of the second row ####
    if rect_2_00.collidepoint(event.pos):
        if seq02[0] == 0:
            seq02[0] = 1
            block_2_00 = block_on
        else:
            seq02[0] = 0
            block_2_00 = block_off
于 2012-12-05T20:39:01.960 に答える
0

あなたの比較には欠陥があります。次のトランスクリプトを検討してください。

In [278]: pos=(120, 0)
In [279]: pos > (100,100)
Out[279]: True
In [280]: pos < (130,130)
Out[280]: True
In [281]: pos < (130,200)
Out[281]: True
In [282]: (100,170)
Out[282]: (100, 170)
In [283]: (129,300) < (130,130)
Out[283]: True
In [284]: (130,300) < (130,130)
Out[284]: False

どうやら、これらの比較のどれもが真実であるとは予想していなかったようです。ただし、タプルの比較では、結果を決定するのは要素の最も左の違いです。コードでは、満たされた追加の比較により、追加のボタンがアクティブになります。

于 2012-12-05T20:40:33.893 に答える