Как избавиться от пигамных поверхностей? - PullRequest
3 голосов
/ 07 февраля 2010

В следующем коде не существует только одного круга на экране в любой данный момент времени. Я хочу исправить это, чтобы это выглядело так, как будто есть только один круг, вместо того, чтобы оставлять след, где бы ни был курсор мыши.

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

screen = pygame.display.set_mode((640,400),0,32)

radius = 25
circle = pygame.Surface([radius*2]*2,SRCALPHA,32)
circle = circle.convert_alpha()
pygame.draw.circle(circle,(25,46,100),[radius]*2,radius)

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

    screen.blit(circle,(pygame.mouse.get_pos()[0],100))

    pygame.display.update()
    pygame.time.delay(10)

1 Ответ

6 голосов
/ 07 февраля 2010

Вам нужно специально стереть круг, прежде чем снова его стереть. В зависимости от сложности вашей сцены, вам, возможно, придется попробовать разные методы. Как правило, у меня есть «фоновая» поверхность, которая перетаскивает экран каждый кадр, а затем перетаскивает спрайты / другие поверхности на их новые позиции (блики в Pygame очень быстрые, поэтому даже на довольно больших экранах у меня не было проблемы со скоростью делают это). Для вашего кода выше достаточно просто использовать surface.fill(COLOR), где COLOR - ваш цвет фона; например, (255 255 255) для белого:

# ...
screen = pygame.display.set_mode((640,400),0,32)
backgroundColor = (255,255,255)
# ...
while True:
    # ...
    screen.fill(backgroundColor)
    screen.blit(circle,(pygame.mouse.get_pos()[0],100))
    pygame.display.update()
    pygame.time.delay(10)

Редактировать в ответ на ваш комментарий: это можно сделать более объектно-ориентированным способом.

Вам понадобится фоновая поверхность, связанная с вашим экраном (у меня обычно есть класс Display или Map (в зависимости от типа игры), который это делает). Затем сделайте ваш объект подклассом pygame.sprite. Для этого требуется наличие атрибутов self.image и self.rect (изображение - это ваша поверхность, а прямоугольник - это Pygame.rect с местоположением). Добавьте все свои спрайты к объекту pygame.group. Теперь в каждом кадре вы вызываете метод draw для группы и после обновления отображения (т. Е. С помощью pygame.display.update ()) вызываете метод clear для группы. Этот метод требует, чтобы вы предоставили как поверхность назначения (т. Е. screen выше), так и фоновое изображение.

Например, ваш основной цикл может выглядеть примерно так:

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

    circle.rect.center = (pygame.mouse.get_pos()[0],100)
    circleGroup.draw(screen)

    pygame.display.update()
    circleGroup.clear(screen, backgroundSurface)
    pygame.time.delay(10)

См. документацию о классах Sprite и Group для получения дополнительной информации.

...