Mengapa tidak ada sama sekali yang ditarik di PyGame?

Dec 03 2020

Saya telah memulai proyek baru dengan python menggunakan pygame dan untuk latar belakang saya ingin bagian bawah diisi dengan abu-abu dan bagian atas hitam. Saya telah menggunakan gambar persegi dalam proyek sebelumnya tetapi untuk beberapa alasan sepertinya rusak? saya tidak tahu apa yang saya lakukan salah. Yang paling aneh adalah hasilnya berbeda setiap saya menjalankan program. terkadang hanya ada layar hitam dan terkadang persegi panjang abu-abu menutupi sebagian layar, tetapi tidak pernah separuh layar.

import pygame, sys
from pygame.locals import *
pygame.init()

DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

Jawaban

Rabbid76 Dec 03 2020 at 01:33

Anda perlu memperbarui tampilan. Anda sebenarnya sedang menggambar pada sebuah Surfaceobjek. Jika Anda menggambar di permukaan yang terkait dengan tampilan PyGame, ini tidak segera terlihat di layar. Perubahan menjadi visibel, saat tampilan diperbarui dengan pygame.display.update()atau pygame.display.flip().

Lihat pygame.display.flip():

Ini akan memperbarui konten seluruh tampilan.

Sementara pygame.display.flip()akan memperbarui konten seluruh tampilan, pygame.display.update()memungkinkan memperbarui hanya sebagian dari layar untuk diperbarui, bukan seluruh area. pygame.display.update()adalah versi yang dioptimalkan pygame.display.flip()untuk tampilan perangkat lunak, tetapi tidak berfungsi untuk tampilan dengan akselerasi perangkat keras.

Loop aplikasi PyGame biasanya harus:

  • menangani acara dengan salah satu pygame.event.pump()atau pygame.event.get().
  • perbarui keadaan permainan dan posisi objek tergantung pada peristiwa input dan waktu (masing-masing frame)
  • bersihkan seluruh tampilan atau gambar latar belakang
  • gambar seluruh pemandangan (gambar semua objek)
  • perbarui tampilan dengan pygame.display.update()ataupygame.display.flip()
import pygame
from pygame.locals import *
pygame.init()

DISPLAY = pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
clock = pygame.time.Clock()

run = True
while run:
    clock.tick(60)

    # handle events
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False

    # clear display
    DISPLAY.fill(0)

    # draw scene
    pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))

    # update display
    pygame.display.flip()

pygame.quit()
exit()

Lihat juga Peristiwa dan loop aplikasi