memperlambat visual di pygame [duplikat]

Oct 13 2020

Saya mencoba untuk membangun representasi path-finder (secara khusus menggunakan algoritma Dijkstra). saat mencetak hasil jalur ke layar, semuanya terjadi dengan cepat. nyatanya begitu cepat, sehingga jalur tersebut tampaknya dicetak dalam satu bidikan.

Saya sudah mencoba menambahkan baris berikut setelah setiap cetakan:

milliseconds = 500
pygame.time.delay(milliseconds) 

yang menurut dokumentasi (https://www.pygame.org/docs/ref/time.html#pygame.time.delay) cukup menjeda game:

pygame.time.delay()

jeda program selama beberapa waktu

penundaan (milidetik) -> waktu

tapi ini hanya membuat Jendela runtuh. apakah ada cara lain untuk melakukan ini?

ps Saya belum menambahkan seluruh kode, karena itu menyusun beberapa paket dan file, tetapi algoritme dipanggil dari loop utama (yang menjalankan grafik) jika itu membantu

edit:

saya ingin menjelaskan pertanyaan saya: loop utama memanggil metode lain. salah satunya menghasilkan jalur minimum. bagaimana saya bisa memastikan bahwa pencetakan jalur diatur waktunya, bahkan ketika dibuat di luar loop utama?

Saya sudah mencoba menambahkan jam, tetapi sepertinya masih tidak berhasil. Saya pikir akan lebih baik jika saya memberikan loop utama dan algoritme sebagai referensi:

    def __init__(self, ...):
    self.fps = FPS
    self.clock = pygame.time.Clock()
    self.run_button = pygame.Rect(WIDTH - BUTTON_WIDTH, 0, BUTTON_WIDTH, 
    BUTTON_HEIGHT)  # button that runs dijkstra
    ...


    def run_visuals(self):
    """
    runs the visuals in a loop
    """
    run = True
    self.draw_grid()
    pygame.draw.rect(self.window, GREY, self.run_button)  # run button
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                x, y = event.pos
                if self.run_button.collidepoint(x, y):
                    dijkstra(self.graph, self.source_node, self.window, self.dest_node,self.clock)
        self.add_bad_nodes_with_mouse()
        self.draw_nodes("bad")
    pygame.display.update()

def dijkstra(graph, source, window, dest,clock):
    source.set_dist_from_source(0)
    Q = build_min_heap(graph)  # O(V)
    while Q:  # O(V)
        clock.tick(FPS)
        u = heapq.heappop(Q)  # pops the min val based on dist from source (get value and remove from heap) O(logV)
        if u == dest:
            break
        neighbors_of_u = graph.get_neighbors()[u.name]
        for v in neighbors_of_u:  # O(E)
            # drawing neighbors:
            block = get_block_from_node(v)
            block.draw_block(window, VISITED_COLOR)
            # checking min path:
            weight_u_v = graph.get_edge_weight(u.name, v.name)
            v_dist = v.dist_from_source
            u_dist = u.dist_from_source
            if v_dist > u_dist + weight_u_v:
                v.set_dist_from_source(u_dist + weight_u_v)
                v.set_prev(u)
                heapq.heappush(Q, v)  # O(logV)
    print_path(window, source, dest)

Jawaban

3 kirtipurohit Oct 12 2020 at 22:12

Anda perlu mengatur Frame per second (FPS) untuk game paling sederhana yang Anda kembangkan.

FPS=30       
fpsClock=pygame.time.Clock()

Di akhir program tambahkan baris sebagai,

pygame.display.update()
    fpsClock.tick(FPS)