2016-02-07 2 views
0

У меня возникли некоторые трудности в проекте 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 ясно, что я обновляю положение объекта трассировки каждый кадр, но изображение остается черным, без прямоугольников нарисованных в любом месте на ней (я не имею их рисунок на правую сторону квадрат, я просто хочу получить какой-то результат на данный момент.) Любая идея, что я делаю неправильно здесь? благодаря тонну!

+0

вы забыли 'draw.rect' за' 'движение вверх'' – furas

ответ

1

У вас должно быть draw.rectdraw.circle) на self.image с [0,0,7,15]. Вы не можете использовать rect.x, rect.y, потому что он может дать вам [100,100,7,15], и это ouside self.image.

Координаты для пикселей на self.image области всегда x:0..14y:0..14

-

rect.xrect.y используется group.draw() для blit изображения на экране в нужном месте.

+0

Да, это будет сделано. Такой вид надзора - именно та причина, по которой так полезно иметь такой ресурс, как stackoverflow. Спасибо чувак! –