簡體   English   中英

在pygame中慢慢畫一條線,而其他線保持靜止

[英]Slowly drawing a line in pygame while other lines remain static

在我的最后一個問題中,我犯了一個嚴重的錯誤,沒有提供所有信息,只是編輯它會導致一個完全不同的主題,所以我創建了一個新問題。

我沒有說的是我已經在屏幕上打印了一些線條(它們為游戲提供了操場)並且只有在特定情況下我才想在屏幕上添加慢慢繪制的線條。 當我的操場開始閃爍時, pygame.update.flip()函數似乎搞砸了游戲。 我沒有提供這個解釋的原因是我認為該解決方案與我的代碼其他部分的格式沒有任何關系。

我在這里看到兩個解決方案。 要么我需要一種在不打擾我的“操場線”的情況下慢慢畫線的方法,要么我需要找到一種方法來畫我的“操場線”,這樣它們就不會被pygame.update.flip()打擾。

line_start = [ (100, 0), (200, 0), (0, 100), (0, 200) ]
line_end = [ (100, 300), (200, 300), (300, 100), (300, 200) ]

def draw_lines(line_start, line_end):
    for idx in range(len(line_start)):
        pygame.draw.line(screen, BLACK, line_start[idx], line_end[idx])

這將創建一個用於 Tic Tac Toe 游戲的字段

def draw_red_line(i):
    y = 0
    while y < 300:
        pygame.draw.line(screen, RED, (i*100+50, 0), (i*100+50, y))
        pygame.display.flip()
        pygame.event.get()
        y+=1

Selcuk給出的這個解決方案以我解釋的方式弄亂了游戲,其他解決方案基於相同的方法。

創建一個函數,該函數可以根據范圍 [0.0, 1.0] 中的值p從點s到點e繪制一條線。 如果值為 0,則不繪制線。 如果值為 1,則繪制完整的線。 否則繪制了一部分線:

def draw_red_line(s, e, p):
    x = s[0] * (1-p) + e[0] * p
    y = s[1] * (1-p) + e[1] * p
    pygame.draw.line(screen, RED, s, (round(x), round(y)))

你有 4 行。 使用計數器( count )從 0 到 4 以一小步(例如 0.01)遞增。 計數器的組成部分說明必須完全繪制且必須持久(保留)的線數:

for i in range(int(count)):
    draw_red_line(line_start[i], line_end[i], 1)

如果計數器小於 4,則計數器的小數部分用於部分繪制下一行:

if count < 4:
    i = int(count)
    draw_red_line(line_start[i], line_end[i], count-i)
    count += 0.01

請參閱簡短示例:

import pygame

pygame.init()
screen = pygame.display.set_mode((300,300))
clock = pygame.time.Clock()
RED = (255, 0, 0)

line_start = [(100, 0),   (200, 0),   (0, 100),   (0, 200)]
line_end   = [(100, 300), (200, 300), (300, 100), (300, 200)]

def draw_red_line(s, e, p):
    x = s[0] * (1-p) + e[0] * p
    y = s[1] * (1-p) + e[1] * p
    pygame.draw.line(screen, RED, s, (round(x), round(y)))

count=0
run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    screen.fill(0)

    for i in range(int(count)):
        draw_red_line(line_start[i], line_end[i], 1)
    if count < 4:
        i = int(count)
        draw_red_line(line_start[i], line_end[i], count-i)
        count += 0.01

    pygame.display.flip()

pygame.quit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM