2013-10-14 80 views
3
''' 
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)應該可以工作,但不會出於某種奇怪的原因。我不知道爲什麼。 我相當肯定,其他一切工作都很好,我在網站上搜索了幾個小時之後才尋求幫助。Rect.move()不移動矩形

回答

2

從它似乎draw.rect的文件在其構造需要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) 

有了更多關於您要做什麼的信息,或許可以構建出更好的答案。

+0

我非常抱歉沒有足夠清楚我想做什麼,我有多愚蠢。代碼旨在構建一個金字塔,當時只有一層。 並感謝您的幫助,您的建議像一個魅力工作! –

1

我不清楚你的代碼試圖完成什麼(而且我沒有確定書的參考),所以這只是一個猜測。它首先構造一個Rect對象,然後在循環的每次迭代中繪製它之前,逐漸重新定位和重新定義(膨脹)對象。

注意哪些改變Rect對象「到位」,這意味着他們修改它的特點,而不是返回一個新的,但不(再)使用move_ip()inflate_ip()繪製(不返回任何東西) 。這比每創建一個新的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()