Python (pygame): как я могу удалить строку? - PullRequest
0 голосов
/ 25 ноября 2010

Я использую Pygame, чтобы создать небольшую сцену.Сейчас я работаю со строками.

У меня есть массив линий, которые рисуются на экране, и когда линия удаляется из массива, я бы хотела, чтобы линия исчезла с экрана.

Проблема, которую я обнаружил, состоит в том, что линия рисуется на экране и остается статичной.Я не могу найти способ сбросить экран (я использую JPEG в качестве фона).

Есть ли способ удалить нарисованную линию с экрана?

Спасибо

Ответы [ 3 ]

4 голосов
/ 26 ноября 2010

Хотя это не кажется очень эффективным, я думаю, что самый простой и лучший способ сделать это - перерисовать все.Во многих играх экран полностью перерисовывается в каждом кадре, даже без 3D-карт (помните старые игры Doom?).Так что рисование нескольких линий на фоне будет очень быстрым, даже в 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 голос
/ 25 ноября 2010

Если вы используете screen.fill ([0,0,0]), он заменит фон (или любой другой, заданный вами в качестве фона).

Это удалит все линии, нарисованные наизображение, по существу удаляя все, что нарисовано на фоне.

0 голосов
/ 25 ноября 2010

Возможно, вам потребуется выполнить команду для обновления дисплея, как описано в документации .Команда для обновления всей отображаемой поверхности:

pygame.display.update()

Может быть возможно передать аргумент функции, чтобы обновить только необходимую часть, что будет более эффективно, но без полного кода яне скажу, что это за аргумент.

...