Rect.move () no mueve el rect

''' Created on 21. sep. 2013 Page 136 in ze almighty python book, 4.3 @author: Christian ''' import sys,pygame,time pygame.init() numLevels = 15 # Number of levels unitSize = 25 # Height of one level white = (255,255,255) # RGB Value of White black = (0,0,0) # RGB Value of Black size = unitSize * (numLevels + 1) xPos = size /2.0 # Constant position of X value screenSize = size,size # Screen size to accomodate pygame screen = pygame.display.set_mode(screenSize) for level in range(numLevels): yPos = (level + 1) * unitSize width = (level +1) * unitSize block = pygame.draw.rect(screen,white,(0,0,width,unitSize),0) block.move(xPos,yPos) pygame.time.wait(100) pygame.display.flip() 

El block.move (xPos, yPos) debería funcionar, pero no por alguna extraña razón. No tengo ni idea de porqué. Estoy bastante seguro de que todo lo demás está funcionando bien, he buscado en las redes durante horas antes de visitar este sitio para pedir ayuda.

De la documentación que parece draw.rect toma un Rect en su constructor, no una tupla:

 block = pygame.draw.rect(screen, white, Rect(0, 0, width, unitSize), 0) 

Mover el Rect devuelto no Rect dibujar mágicamente el bloque. Para dibujar el bloque nuevamente, necesitarás dibujar el bloque nuevamente:

 block.move(xPos,yPos) block = pygame.draw.rect(screen, white, block, 0) 

Por supuesto, ahora tienes dos bloques en tu pantalla, porque has dibujado dos veces. Ya que quiere mover el bloque de todos modos, ¿por qué dibujarlo en la ubicación anterior en primer lugar? ¿Por qué no especificar la ubicación en la que desea comenzar?

 block = pygame.draw.rect(screen, white, Rect(xPos, yPos, width, unitSize), 0) 

Con más información sobre lo que está tratando de hacer, tal vez se pueda construir una mejor respuesta.

No me queda claro lo que su código está tratando de lograr (y no reconozco la referencia del libro), así que esto es solo una conjetura. Primero construye un objeto Rect y luego lo vuelve a colocar y redimensiona (infla) justo antes de dibujarlo en cada iteración del bucle.

Tenga en cuenta el uso de move_ip() e inflate_ip() que cambian el objeto Rect “en su lugar”, lo que significa que modifican sus características en lugar de devolver una nueva, pero no (re) dibuja (y no devuelve nada) . Esto utiliza menos recursos que la creación de un nuevo Rect para cada iteración.

 import sys, pygame, time pygame.init() numLevels = 15 # Number of levels unitSize = 25 # Height of one level white = (255, 255, 255) # RGB Value of White black = (0, 0, 0) # RGB Value of Black size = unitSize * (numLevels+1) xPos = size / 2.0 # Constant position of X value screenSize = size, size # Screen size to accomodate pygame screen = pygame.display.set_mode(screenSize) block = pygame.Rect(0, 0, unitSize, unitSize) for level in range(numLevels): block.move_ip(0, unitSize) block.inflate_ip(0, unitSize) pygame.draw.rect(screen, white, block, 0) pygame.time.wait(100) pygame.display.flip()