У меня возникли некоторые трудности в проекте pygame, обновляющем внешний вид спрайта, основанный на его направлении движения. В принципе, я хочу нарисовать прямоугольник на нижней, верхней, левой или правой половине квадрата, если он движется вверх, вниз, вправо или влево соответственно. Хотя мои отладочные операторы печати корректно показывают, каким образом перемещается квадрат, метод pygame.draw.rect(), похоже, ничего не делает для Surface (self.image), связанного с объектом трассировки.Pygame sprite графика не обновляется
import pygame
black = ( 0, 0, 0)
white = (255, 255, 255)
blue = ( 0, 0, 255)
green = ( 0, 255, 0)
red = (255, 0, 0)
class Trace(pygame.sprite.Sprite):
def __init__(self,startx,starty):
super().__init__()
self.image = pygame.Surface([15,15])
self.rect = self.image.get_rect()
self.rect.x = startx
self.rect.y = starty
def update(self,walls):
self.image.fill(black)
pygame.draw.circle(self.image, red, [self.rect.x,self.rect.y], 7)
pos = pygame.mouse.get_pos()
diffx = pos[0] - self.rect.x
diffy = pos[1] - self.rect.y
#determine primary direction
if abs(diffx) >= abs(diffy):
if diffx >= 0:
print("moving right")
pygame.draw.rect(self.image, red, [self.rect.x,self.rect.y,7,15], 7)
else:
print("moving left")
pygame.draw.rect(self.image, red, [self.rect.x,self.rect.y,7,15], 7)
else:
if diffy >= 0 :
print("moving down")
pygame.draw.rect(self.image, red, [self.rect.x,self.rect.y,7,15], 7)
else:
print("moving up")
#move on x axis and check for collisions
self.rect.x += diffx/3
collisions = pygame.sprite.spritecollide(self, walls, False)
for wall in collisions:
if diffx > 0:
self.rect.right = wall.rect.left
else:
self.rect.left = wall.rect.right
#move on y axis and check for collisions
self.rect.y += diffy/3
collisions = pygame.sprite.spritecollide(self, walls, False)
for wall in collisions:
if diffy > 0:
self.rect.bottom = wall.rect.top
else:
self.rect.top = wall.rect.bottom
class Wall(pygame.sprite.Sprite):
def __init__(self, x, y, width, height, color):
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
self.rect.y = y
self.rect.x = x
pygame.init()
displaysize = [600,400]
screen = pygame.display.set_mode(displaysize)
clock = pygame.time.Clock()
done = False
testtrace = Trace(0,0)
tracelist = pygame.sprite.Group()
tracelist.add(testtrace)
wall = Wall(100,100,40,40,blue)
wall2 = Wall(155,100,40,40,blue)
wall3 = Wall(210,100,40,40,blue)
wall4 = Wall(100,155,40,40,blue)
wall5 = Wall(155,155,40,40,blue)
wall6 = Wall(210,155,40,40,blue)
walllist = pygame.sprite.Group()
walllist.add(wall,wall2,wall3,wall4,wall5,wall6)
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT: #close window on quit
done = True
screen.fill(white)
tracelist.update(walllist)
tracelist.draw(screen)
walllist.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
I't ясно, что я обновляю положение объекта трассировки каждый кадр, но изображение остается черным, без прямоугольников нарисованных в любом месте на ней (я не имею их рисунок на правую сторону квадрат, я просто хочу получить какой-то результат на данный момент.) Любая идея, что я делаю неправильно здесь? благодаря тонну!
вы забыли 'draw.rect' за' 'движение вверх'' – furas