2013-01-13 108 views
-4

Possible Duplicate:
Pygame (Python) - TypeError: Argument must be rect style object类型错误:参数必须是矩形样式对象 - pygame的(Python的

我试图在Pygame中(与Python砖断路器游戏),但我被困在一个错误

(这是。这是必要的随机文本,以便我可以发布这些代码)

CODE:

import pygame, sys, time, random 
from pygame.locals import * 
pygame.init() 
fpsclock = pygame.time.Clock() 

WINDOWWIDTH = 450 
WINDOWHEIGHT = 650 
mainwindow = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32) 
pygame.display.set_caption('Luzion - Brick Breaker') 

paddle = pygame.image.load('Brick Breaker - Paddle.png') 
paddlerect = paddle.get_rect() 
paddlerect.topleft = (190, 575) 

ball = pygame.image.load ('ball.png') 
ballrect = ball.get_rect() 
ballrect.topleft = (195, 565) 

cooltext = pygame.image.load('cooltext1.png') 
cooltextrect = cooltext.get_rect() 
cooltextrect.topleft = (0, 0) 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 
RED = (255, 0, 0) 
GREEN = (0, 128, 0) 
BLUE = (0, 0, 255) 
LIME = (0, 255, 0) 
TEXTCOLOR = WHITE 

font = pygame.font.SysFont(None, 48) 

def displaytext(text, font, surface, x, y): 
    text = font.render(text, 1, TEXTCOLOR) 
    textrect = text.get_rect() 
    textrect.topleft = (x, y) 
    surface.blit(text, textrect) 

def waitforplayer(): 
    while True: 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 
      if event.type == KEYDOWN: 
       if event.key == K_ESCAPE: 
        pygame.quit() 
        sys.exit() 
       return 

rb = pygame.image.load('redblock.png') 
rb2 = rb1 = rb 
level1blocks = [rb, rb1, rb2] 
rbrect = rb.get_rect().topleft = (0, 0) 
rb1rect = rb1.get_rect().topleft = (40, 0) 
rb2rect = rb2.get_rect().topleft = (80, 0) 
level1rects = [rbrect, rb1rect, rb2rect] 

moveleft = False 
moveright = False 
SPEED = 7 

bmoveup = bmovedown = bmoveleft = bmoveright = False 
BALLSPEED = 8 

mainwindow.blit(cooltext, cooltextrect) 
pygame.display.update() 
time.sleep(1) 

displaytext('Level 1', font, mainwindow, 150, 100) 
pygame.display.update() 
time.sleep(1) 

displaytext('Press any key to begin...', font, mainwindow, 22, 200) 
pygame.display.update() 
waitforplayer() 

while True: 
    number = 1 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type == KEYDOWN: 
      if event.key == ord('a') or event.key == K_LEFT: 
       moveleft = True 
       moveright = False 
      if event.key == ord('d') or event.key == K_RIGHT: 
       moveleft = False 
       moveright = True 
      if event.key == ord('g'): 
       bmoveup = True 
       if number == 1: 
        bmoveleft = True 
       else: 
        bmoveright = True 
     if event.type == KEYUP: 
      if event.key == ord('a') or event.key == K_LEFT: 
       moveleft = False 
      if event.key == ord('d') or event.key == K_RIGHT: 
       moveright = False 

    if moveleft and paddlerect.left > 0: 
     paddlerect.left -= SPEED 
    if moveright and paddlerect.right < WINDOWWIDTH: 
     paddlerect.right += SPEED 

    if bmovedown and ballrect.bottom < WINDOWHEIGHT: 
     ballrect.top += BALLSPEED 
    if bmoveup and ballrect.top > 0: 
     ballrect.top -= BALLSPEED 
    if bmoveleft and ballrect.left > 0: 
     ballrect.left -= BALLSPEED 
    if bmoveright and ballrect.right < WINDOWWIDTH: 
     ballrect.right += BALLSPEED 

    if ballrect.top <= 0: 
     bmovedown = not bmovedown 
     bmoveup = not bmoveup 
    if ballrect.left <= 0: 
     bmoveleft = not bmoveleft 
     bmoveright = not bmoveright 
    if ballrect.right >= WINDOWWIDTH: 
     bmoveleft = not bmoveleft 
     bmoveright = not bmoveright 
    if ballrect.bottom >= WINDOWHEIGHT: 
     bmovedown = not bmovedown 
     bmoveup = not bmoveup 

    mainwindow.fill(WHITE) 
    mainwindow.blit(paddle, paddlerect) 
    mainwindow.blit(ball, ballrect) 


    for b in range(len(level1blocks)): 
     mainwindow.blit(level1blocks[b], level1rects[b]) 

    for i in level1rects[:]: 
     if ballrect.colliderect(i): 
      level1blocks.remove(i) 
      level1rects.remove(i) 
      bmovedown = not bmovedown 
      bmoveup = not bmoveup 
      bmoveleft = not bmoveleft 
      bmoveright = not bmoveright 


    if ballrect.colliderect(paddlerect): 
     bmovedown = not bmovedown 
     bmoveup = not bmoveup 
     bmoveleft = not bmoveleft 
     bmoveright = not bmoveright 




    pygame.display.update() 
    fpsclock.tick(35) 

错误:

Traceback (most recent call last): 
    File "C:/Python32/brick breaker", line 140, in <module> 
    if ballrect.colliderect(i): 
TypeError: Argument must be rect style object 

我不知道如何解决这个错误,请帮助。

+0

[学习调试(https://plone.org/documentation/kb/using-pdb)总是值得 – goncalopp

+1

'(这是随机文本,这是必要的,所以我可以发布所有这些代码)“这个问题的一个聪明的解决方案。我假设考虑错误信息并改进问题会花费太多精力? – Voo

回答

0

问题是,pygame期望数组level1rects中的所有内容都是一个rectange,在这种情况下,您必须在该数组中有一些不是的东西。

+1

OP从原始列表中删除元素,同时迭代它的副本。迭代列表并从中删除元素不是一个好主意。 – Blender

+0

啊,woops,我没有注意到他正在从清单中删除项目,没关系。 –

+0

@Blender你究竟是什么意思? – user1952081

0

level1rects目前是一个元组列表,不是因为rects:

rbrect = rb.get_rect().topleft = (0, 0) 
rb1rect = rb1.get_rect().topleft = (40, 0) 
rb2rect = rb2.get_rect().topleft = (80, 0) 
level1rects = [rbrect, rb1rect, rb2rect] 
相关问题