Objek tertinggal/teleportasi dalam stimulasi pygame sederhana

Saya mencoba membuat program sederhana yang merangsang revolusi bintang dalam sistem biner, tetapi ketika saya menjalankan program tersebut, salah satu 'bintang' tersebut mengalami gangguan, praktis berteleportasi di sekitar jalur yang diberikan ke lokasi yang berbeda. Bagaimana cara memperbaikinya? Ini kodenya:

import pygame, sys, math, keyboard

run = True
black = (255, 255, 255)
white = (0, 0, 0)
angle = 0
size = width, height = 1550, 800
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
screen.fill(black)

while run:
    msElapsed = clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    def star1():
        global angle
        screen.fill(white)
        x = int(math.cos(angle) * 70) + 775
        y = int(math.sin(angle) * 100) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        pygame.display.flip()
        angle += 0.05


    def star2():
        global angle
        screen.fill(white)
        x = int(math.cos(angle) * 100) + 775
        y = int(math.sin(angle) * 70) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        pygame.display.flip()
        angle += 0.05

    star1()
    star2()

    if keyboard.is_pressed('Esc'):
        print("System Terminated ('ESC')")
        sys.exit(0)

pygame.quit()

person Dante    schedule 15.01.2021    source sumber
comment
@anurag pada codereview itu akan ditutup karena di luar topik dalam sekejap. Kode yang tidak berfungsi sebagaimana mestinya di luar topik di sana.   -  person Heslacher    schedule 15.01.2021


Jawaban (1)


Masalah ini disebabkan oleh screen.fill(white) dan beberapa panggilan ke pygame.display.flip(). Fungsi fill() mengisi seluruh Surface dengan warna solid. Panggil pengisian sekali pada awal loop aplikasi. Pembaruan tampilan di akhir loop aplikasi sudah cukup. Beberapa panggilan ke pygame.display.update() atau pygame.display.flip() menyebabkan kedipan.

Hapus semua panggilan ke pygame.display.flip() dari kode Anda, tetapi panggil sekali di akhir loop aplikasi.

Anda tidak memerlukan paket keboard sama sekali. Gunakan pygame.key.get_pressed() sebagai gantinya.

while run:
    msElapsed = clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    def star1():
        global angle
        # screen.fill(white)                           <--- DELTE
        x = int(math.cos(angle) * 70) + 775
        y = int(math.sin(angle) * 100) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        # pygame.display.flip()                        <--- DELTE
        angle += 0.05

    def star2():
        global angle
        # screen.fill(white)                           <--- DELTE
        x = int(math.cos(angle) * 100) + 775
        y = int(math.sin(angle) * 70) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        # pygame.display.flip()                        <--- DELTE
        angle += 0.05

    screen.fill(white)                               # <--- ADD
    star1()
    star2()
    pygame.display.flip()                            # <--- ADD

    keys = pygame.key.get_pressed()                  # <--- CHANGE
    if keys[pygame.K_ESCAPE]:
        print("System Terminated ('ESC')")
        sys.exit(0)

Catatan, Anda menggunakan angle yang sama untuk kedua objek. Oleh karena itu angle bertambah dua kali di setiap frame.

person Rabbid76    schedule 15.01.2021