2

私は Python 3.1 と PyGame 2.7 でシンプルなメイン メニューに取り組んできました。マウス カーソルが特定の領域内にある場合、画面上のテキストは白色になります。関数を使用して画面をブリットしています。最初の関数は通常どおりメイン メニューを blit し、他の 2 つの関数はメニューを blit して一部のテキストを強調表示します。関数は次のとおりです。

def draw_main_menu(): #draw main menu normally
    screen.fill(BLACK) #clears screen

    #set up text
    new_text = menu_font.render('NEW GAME', 1, (100, 100, 100))
    load_text = menu_font.render('LOAD GAME', 1, (100, 100, 100))
    options_text = menu_font.render('OPTIONS', 1, (100, 100, 100))
    quit_text = menu_font.render('QUIT', 1,  (100, 100, 100))

    #blit text
    screen.blit(new_text, (340, 425))
    screen.blit(load_text, (335, 455))
    screen.blit(options_text, (350, 485))
    screen.blit(quit_text, (373, 515))

def draw_main_menu_ng(): #draw main menu with new game text in white
    screen.fill(BLACK)

    new_text = menu_font.render('NEW GAME', 1, (255, 255, 255))
    load_text = menu_font.render('LOAD GAME', 1, (100, 100, 100))
    options_text = menu_font.render('OPTIONS', 1, (100, 100, 100))
    quit_text = menu_font.render('QUIT', 1,  (100, 100, 100))

    screen.blit(new_text, (340, 425))
    screen.blit(load_text, (335, 455))
    screen.blit(options_text, (350, 485))
    screen.blit(quit_text, (373, 515))

def draw_main_menu_lg(): #draw main menu with load game text in white
    screen.fill(BLACK)

    new_text = menu_font.render('NEW GAME', 1, (100, 100, 100))
    load_text = menu_font.render('LOAD GAME', 1, (255, 255, 255))
    options_text = menu_font.render('OPTIONS', 1, (100, 100, 100))
    quit_text = menu_font.render('QUIT', 1,  (100, 100, 100))

    screen.blit(new_text, (340, 425))
    screen.blit(load_text, (335, 455))
    screen.blit(options_text, (350, 485))
    screen.blit(quit_text, (373, 515))

以下では、変数 x と y を使用して、マウスがボタンの上に置かれているかどうかを確認しています。最初の 2 つの数値のセットは x 座標の範囲で、2 番目の 2 つのセットは y 座標の範囲です。

x,y = pygame.mouse.get_pos()
#set up new game mouse positions
if x >= 340 and x <= 465:
    new_game_x_pos = True
if x < 340  or x > 465:
    new_game_x_pos = False

if y >= 425 and y <= 445:
    new_game_y_pos = True
if y < 425 or y > 445:
    new_game_y_pos = False

if new_game_x_pos == True and new_game_y_pos == True:
    draw_main_menu_ng()
if new_game_x_pos == False or new_game_y_pos == False:
    draw_main_menu()

#set up load game mouse positions
if x >= 335 and x <= 470:
    load_game_x_pos = True
if x < 335 or x > 470:
    load_game_x_pos = False

if y >= 455 and y <= 475:
    load_game_y_pos = True
if y < 455 or y > 475:
    load_game_y_pos = False

if load_game_x_pos == True and load_game_y_pos == True:
    draw_main_menu_lg()
if load_game_x_pos == False or load_game_y_pos == False:
    draw_main_menu()

なぜか「NEW GAME」にマウスオーバーしても色が変わらない。マウスが「LOAD GAME」の上にあると色が変わります。ゲームのロードを追加する前は色が変わっていましたが、今はゲームのロードだけが変わります。なぜそれが機能しないのかについてのアイデアはありますか?

ところで、画面を更新するコードがゲーム ループに含まれています。フォントを設定するコードもあります。

4

2 に答える 2

1

メニューは2回描かれています。マウスチェックコードがカーソルがNEWGAMEの上あると評価すると、draw_main_menu_ng 呼び出されます。ただし、チェックは続行され、カーソルがLOAD GAMEを超えていないと評価されると、も呼び出され、への呼び出しの影響が無効になります。draw_main_menudraw_main_menu_ng

最小限の解決策はreturn、カーソルがオプション内に入ると次のようになります。

if new_game_x_pos == True and new_game_y_pos == True:
    draw_main_menu_ng()
    return

代替ソリューション

ハイライト可能なメニューを作成する方法の完全な例を追加しました。それはあなたが求めている以上のものだと思いますがreturn、コードにステートメントを追加しただけでは、後で他の問題が発生する可能性があります。完全な例を作成したので、リテラルとほぼ同一のステートメントの使用を回避するための良い方法を確認できます。ゲームに統合するには理解する必要があるので、投稿するのは快適です。

于 2012-05-25T03:07:11.610 に答える
0

すべての if ステートメントの代わりに、テキストの周りに rect を作成し、関数 rect.collidepoint((x, y)) (return bool) を使用する方がはるかに簡単です。これにより、コードがはるかに短くなり、おそらく高速になります。

于 2012-09-01T14:01:18.077 に答える