ความล่าช้าของวัตถุ / การเคลื่อนย้ายวัตถุในการกระตุ้น pygame อย่างง่าย

ฉันกำลังพยายามสร้างโปรแกรมง่ายๆ ที่กระตุ้นการปฏิวัติของดวงดาวในระบบดาวคู่ แต่เมื่อฉันรันโปรแกรม 'ดวงดาว' ดวงหนึ่งเกิดข้อผิดพลาดไปรอบๆ แทบจะเคลื่อนตัวไปรอบๆ เส้นทางที่กำหนดไปยังตำแหน่งต่างๆ ฉันจะแก้ไขปัญหานี้ได้อย่างไร? นี่คือรหัส:

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 แหล่งที่มา
comment
@anurag ใน codereview มันจะถูกปิดเนื่องจากไม่ตรงหัวข้อในจังหวะการเต้นของหัวใจ รหัสไม่ทำงานตามที่ตั้งใจไว้นั้นอยู่นอกประเด็น   -  person Heslacher    schedule 15.01.2021


คำตอบ (1)


ปัญหามีสาเหตุมาจาก screen.fill(white) และการเรียก pygame.display.flip() หลายครั้ง ก>. ฟังก์ชัน fill() เติมเต็มทั้ง Surface ด้วยสีทึบ โทรกรอกหนึ่งครั้งที่จุดเริ่มต้นของลูปแอปพลิเคชัน การอัปเดตจอแสดงผลที่ส่วนท้ายของลูปแอปพลิเคชันก็เพียงพอแล้ว การเรียก pygame.display.update() หรือ pygame.display.flip() หลายครั้งทำให้เกิดการกะพริบ

ลบการเรียกทั้งหมดไปยัง pygame.display.flip() ออกจากโค้ดของคุณ แต่ให้เรียกเพียงครั้งเดียวที่ส่วนท้ายของลูปแอปพลิเคชัน

คุณไม่จำเป็นต้องมีแพ็คเกจ keboard เลย ใช้ pygame.key.get_pressed() แทน

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)

โปรดทราบว่าคุณใช้ angle เหมือนกันสำหรับวัตถุทั้งสอง ดังนั้น angle จะเพิ่มขึ้นสองครั้งในแต่ละเฟรม

person Rabbid76    schedule 15.01.2021