4
    '''
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()

block.move(xPos,yPos) 应该可以工作,但由于某些奇怪的原因它不能工作。我不知道为什么。我相当确定其他一切工作正常,我已经在互联网上搜索了几个小时,然后才来到这个网站寻求帮助。

4

2 回答 2

3

从文档看来,它的构造函数中draw.rect需要 a Rect,而不是元组:

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

移动返回的Rect不会再次神奇地绘制块。要再次绘制块,您需要再次绘制块:

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

当然,您现在屏幕上有两个块,因为您已经绘制了两次。既然你想移动方块,为什么要先在旧位置绘制呢?为什么不直接指定您希望它开始的位置?

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

有了更多关于你想要做什么的信息,也许可以构建一个更好的答案。

于 2013-10-14T21:11:40.953 回答
1

我不清楚您的代码试图完成什么(而且我不承认这本书的参考),所以这只是一个猜测。它首先构造一个Rect对象,然后在循环的每次迭代中绘制它之前增量地重新定位和重新调整大小(膨胀)它。

请注意使用move_ip()and inflate_ip()which 会Rect“就地”更改对象,这意味着它们会修改其特征而不是返回一个新的,但不要(重新)绘制它(并且不返回任何东西)。Rect这比为每次迭代创建一个新的资源使用更少的资源。

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()
于 2013-10-14T23:14:43.650 回答