Python(pygame):如何删除一条线?

0 投票
3 回答
5375 浏览
提问于 2025-04-16 07:36

我正在使用pygame创建一个小场景。目前,我在处理一些线条。

我有一个线条的数组,这些线条会被画到屏幕上。当我从数组中删除一条线时,我希望这条线也能从屏幕上消失。

我遇到的问题是,线条一旦画上去就固定在屏幕上了。我找不到重置屏幕的方法(我用的是一张JPEG图片作为背景)。

有没有办法把已经画上的线条从屏幕上去掉呢?

谢谢!

3 个回答

0

你可能需要运行一个命令来更新显示内容,具体的说明可以在文档中找到。更新整个显示区域的命令是:

pygame.display.update()

如果你只想更新某个特定的部分,可能可以给这个函数传递一个参数,这样会更高效。不过没有完整的代码,我无法告诉你这个参数是什么。

4

虽然这看起来效率不是很高,但我觉得最简单也是最好的方法就是重新绘制所有内容。在很多游戏中,每一帧画面都是完全重绘的,即使没有3D显卡(还记得老版的《毁灭战士》吗?)。所以在背景上画几条线,即使是在Python中也会非常快。

我想象的效果大概是这样的:

import pygame
import random

SCREEN_WIDTH = 320
SCREEN_HEIGHT = 200

class Line(object):
    def __init__(self, start_pos, end_pos, color, width):
        object.__init__(self)
        self.start_pos = start_pos
        self.end_pos = end_pos
        self.color = color
        self.width = width

def CreateRandomLine():
    rnd = random.randrange
    start_pos = (rnd(SCREEN_WIDTH), rnd(SCREEN_HEIGHT))
    end_pos = (rnd(SCREEN_WIDTH), rnd(SCREEN_HEIGHT))
    color = (rnd(255), rnd(255), rnd(255))
    width = rnd(10) + 1
    return Line(start_pos, end_pos, color, width)

def DrawScene(screen_surface, background_image, lines):
    screen_surface.blit(background_image, (0, 0))
    for line in lines:
        pygame.draw.line(screen_surface, line.color, \
                         line.start_pos, line.end_pos, line.width)

pygame.init()
screen_surface = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
background_image = pygame.Surface(((SCREEN_WIDTH, SCREEN_HEIGHT)))
background_image.fill((200, 100, 200)) # I kinda like purple.
# Alternatively, if you have a file for your background:
# background_image = pygame.image.load('background.png')
# background_image.convert()
lines = []
for i in range(10):
    lines.append(CreateRandomLine())

for frame_id in range(10):
    del lines[0] # Remove the oldest line, the one at index 0.
    lines.append(CreateRandomLine()) # Add a new line.
    DrawScene(screen_surface, background_image, lines)
    pygame.display.flip()
    pygame.time.wait(1000) # Wait one second between frames.

这个脚本会在背景上显示随机的线条。总共有10帧,每一帧持续一秒。在每一帧之间,第一条线会从线条列表中移除,同时添加一条新的线。

只要去掉pygame.time.wait,就能看到它运行得有多快 :D。

1

如果你使用 screen.fill([0,0,0]),它会把背景填充成黑色(或者你设置的其他背景颜色)。

这样做会把图像上画的所有线条都擦掉,基本上就是把背景上画的东西都去掉了。

撰写回答