Saya membuat permainan ular yang telah saya selesaikan tetapi saya mencoba membuat beberapa level di dalamnya seperti mudah sedang dan keras untuk tujuan itu saya telah membuat tombol saya seperti ini

def button(msg, xposition, yposition, width, height, color, action = None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    if click[0] == 1 and action!= None:
        if action == "play":
            another_screen()
        elif action == "easy":
            gameLoop_easy()
        elif action == "medium":
            gameLoop_medium()
        elif action == "hard":
            gameLoop_hard()
        elif action == "quit":
            pygame.quit()
            quit()
    pygame.draw.rect(screen, color, (xposition, yposition, width, height))
    message(msg, black, xposition + 10, yposition +10, 50)

Saya telah membuat fungsi gameloop mudah dan gameloop menengah dan keras dengan menyalinnya dan mengedit garis yang digunakan untuk meningkatkan kecepatan ular. tetapi ketika saya memainkan game itu sepertinya tindakan == "mudah" hanya dieksekusi ketika saya mengklik sedang atau keras itu memainkan gameloop dengan mudah. Ini kode lainnya

def another_screen():
    another_screen = True
    while another_screen:
        for event in pygame.event.get():
            screen.fill(white)
            border_design()
            message('Select Level', red, 20, 100, 100)
            button("Easy", 330, 290, 200, 65, green, "easy")
            button("Medium", 330, 390, 200, 65, pink, "medium")
            button("hard", 330, 490, 200, 65, blue, "hard")
            clock.tick(15)
            pygame.display.update()

Saya tidak dapat menyelesaikan masalah ini. Mengapa tombol tidak berfungsi mengapa fungsi yang disegani tidak dijalankan

0
Egoiistic Prince 31 Desember 2017, 15:53

1 menjawab

Jawaban Terbaik

Kesalahan besar Anda adalah Anda tidak memeriksa apakah klik di area "xposition, yposition, width, height". Anda dapat mengklik di mana saja di layar dan itu mengklik tombol.

Anda dapat menggunakan pygame.Rect() untuk mempertahankan posisi dan ukuran tombol dan kemudian Anda dapat menggunakan

rect.collidepoint(mouse)

Untuk memeriksa tabrakan. Anda juga dapat menggunakan rect untuk menggambar persegi panjang.

Saya juga akan menetapkan fungsi ke action= alih-alih teks dan kemudian Anda dapat menggunakan action() alih-alih if/elif

BTW: Anda juga tidak perlu menjalankan fill(), tombol dan fungsi lain di dalam for event. Anda dapat menggunakannya setelah for event. Karena Anda tidak menggunakan event sehingga Anda bahkan tidak membutuhkan for event. Tapi Anda harus menggunakan pygame.event.pump() (bukan pygame.event.get()) karena tanpa ini get_pos()/get_pressed() mungkin tidak berfungsi.

def button(msg, x, y, width, height, color, action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    rect = pygame.Rect(x, y, width, height)

    if click[0] and action and rect.collidepoint(mouse):
        action()

    pygame.draw.rect(screen, color, rect)
    message(msg, black, x+10, y+10, 50)

def another_screen():
    another_screen = True
    while another_screen:
        pygame.event.pump()            

        screen.fill(white)
        border_design()
        message('Select Level', red, 20, 100, 100)

        button("Easy", 330, 290, 200, 65, green, gameLoop_easy)
        button("Medium", 330, 390, 200, 65, pink, gameLoop_medium)
        button("hard", 330, 490, 200, 65, blue, gameLoop_hard)

        clock.tick(15)
        pygame.display.update()

BTW: Anda dapat menggunakan rect.collidepoint(mouse) untuk mengubah warna tombol saat mouse berada di atas tombol ("hover"/"unhover").

BTW: menggunakan get_pressed() Anda akan mengalami masalah ketika di layar baru Anda akan memiliki tombol lain di tempat yang sama. Ini akan mengubah layar dan memeriksa tombol di layar baru sebelum Anda melepaskan tombol mouse - sehingga akan mengklik secara otomatis di tombol baru.

1
furas 31 Desember 2017, 14:31