Не очищаются следы старых спрайтов, хотя все методы на очищение присутствуют PyGame
Делаю шашки на pygame.
При движении шашек обновляется массив с полем и рисуются новые шашки, но старые по какой то причине никуда не пропадают, хотя все screen.fill присутствуют. Что делать?
import pygame
from sprites import Checker
WIDTH = 800
HEIGHT = 600
FPS = 60
WHITE = (227, 230, 255)
BACKCOLOR = (18,32,32)
BLACK = (74, 84, 98)
SELECT = (89, 193,53)
cellSize = 68.75
cellsRect = []
# Инициализация
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
screen.fill(BACKCOLOR)
pygame.display.set_caption("vladOS Checkers.")
pygame.display.set_icon(pygame.image.load("sprites/icon.png"))
clock = pygame.time.Clock()
gameField = pygame.Surface((549, 549))
gameField.fill((255, 255, 255))
# Управление правилами (туфтология ахах)
field = [[0,3,0,3,0,3,0,3],
[3,0,3,0,3,0,3,0],
[0,3,0,3,0,3,0,3],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[1,0,1,0,1,0,1,0],
[0,1,0,1,0,1,0,1],
[1,0,1,0,1,0,1,0]]
checkerList = []
checkers = pygame.sprite.Group()
# Рисование поля
def fieldDraw():
gameField.fill(WHITE)
cellsRect.clear()
blackOrWhite = True
for x in range(8):
colorStart = WHITE
if blackOrWhite:
colorStart = BLACK
else:
colorStart = WHITE
blackOrWhite = not blackOrWhite
for y in range(8):
color = WHITE
if blackOrWhite:
color = BLACK
else:
color = WHITE
blackOrWhite = not blackOrWhite
pygame.draw.rect(gameField, color, (x * cellSize, y * cellSize, cellSize, cellSize))
rect = pygame.Rect((gameField.get_rect(topleft = (cellSize * 2,cellSize * 2)).x + x * cellSize -5,
gameField.get_rect(topleft = (0,0)).x + y * cellSize + 27,
cellSize, cellSize))
cellsRect.append((rect, (y,x)))
pygame.draw.rect(gameField,(0,0,0,0), (0,0,549,549), 5)
pygame.display.update()
def checkersRender():
checkerList.clear()
checkers.clear(gameField, screen)
for x in range(8):
for y in range(8):
coordWithSpacing = (y * cellSize + 2, x * cellSize + 2)
whiteChecker = Checker(coordWithSpacing[0], coordWithSpacing[1], "sprites/white_checker.png")
blackChecker = Checker(coordWithSpacing[0], coordWithSpacing[1], "sprites/black_checker.png")
if field[x][y] == 1:
whiteChecker.update(coordWithSpacing[0], coordWithSpacing[1])
checkers.add(whiteChecker)
checkerList.append((whiteChecker, x,y))
elif field[x][y] == 3:
blackChecker.update(coordWithSpacing[0], coordWithSpacing[1])
checkers.add(blackChecker)
checkerList.append((blackChecker, x,y))
checkers.draw(gameField)
checkers.update(gameField)
def makeATurn(fig, cell):
try:
field[fig[1]][fig[2]] = 0
field[cell[1][0]][cell[1][1]] = 1
gameField.fill(WHITE)
fieldDraw()
checkersRender()
except TypeError:
return
def turnIsPossible(x,y):
return false
def findFigure(x,y):
for i in range(len(checkerList)):
if checkerList[i][1] == x and checkerList[i][2] == y:
return checkerList[i][0]
return None
# Игровой цикл
fieldDraw()
checkersRender()
screen.blit(gameField, (130, 25))
running = True
global selectedFigure
global selectedCell
figureHas = False
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
running = False
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
#screen.fill(BACKCOLOR)
pos = pygame.mouse.get_pos()
for cellRect in cellsRect:
if cellRect[0].collidepoint(pos):
figure = findFigure(cellRect[1][0], cellRect[1][1])
if figure is not None:
selectedFigure = (figure,cellRect[1][0], cellRect[1][1])
figureHas = True
print("Выбрана фигура", figure)
elif figureHas:
selectedCell = cellRect
makeATurn(selectedFigure, cellRect)
figureHas = False
print("Выбрана клетка поля", cellRect[1][0], cellRect[1][1])
screen.blit(gameField, (130, 25))
#if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
# if paraHas:
pygame.display.flip()
clock.tick(FPS)
Ответы (1 шт):
Автор решения: web developer
→ Ссылка
Вам нужно переставить свой код в другом порядке или, возможно, это потому, что вы помещаете строку кода, которая помещает изображение на экран в цикл, вместо строки, которая рисует все окно (экран)
пример
import pygame as pg
win = pg.display.set_mode((width, height)) # the set up of the window
all_sprites = pg.sprite.Group() # this is the group where the sprites live
all_sprites.draw(win) # this draws the whole window