pygame.draw.rect TypeError:Rect参数无效

时间:2017-01-05 19:09:19

标签: python pygame typeerror

我现在正在为Python 3和Pygame写一个Jump'n'Run。 这次我试图用我的旧功能制作一个“按钮”类,使游戏更具可读性并获得更好的表现。 这是我的旧代码:

"Permanent ID"="Sorted"

现在我开始写一个课了:

    def button(msg,x,y,w,h,ic,ac,action=None):
        time.sleep(0)
        mouse=pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()
        if x+w > mouse[0] > x and y+h > mouse[1] > y:
            pygame.draw.rect(screen,black,(x,y,w,h),2)
            pygame.draw.rect(screen, ac,(x,y,w,h))
            noevent = False
            if click[0] == 1 and action != None:
                    action()
        else:
            pygame.draw.rect(screen,black,(x,y,w,h),4)
            pygame.draw.rect(screen, ic,(x,y,w,h))
        textSurf, textRect = text_objects(msg, smallText)
        textRect.center = ( (x+(w/2)), (y+(h/2)) )
        screen.blit(textSurf, textRect)

但它给了我同样的问题:

    class buttons():
    def __init__(self,sort,msg,x,y,w,h,ic,ac,action=None):
            self.type=sort
            self.msg=msg
            self.x=x
            self.y=y
            self.w=w
            self.h=h
            self.ic=ic
            self.ac=ac
            self.action=action
            self.mouse=pygame.mouse.get_pos()
            self.click = pygame.mouse.get_pressed()
            self.noevent = False
    def render(self):
            if self.x+self.w > self.mouse[0] > self.x and self.y+self.h > self.mouse[1] > self.y:
                    pygame.draw.rect(screen,black,(self.x,self.y,self.w,self.h),2)
                    pygame.draw.rect(screen, self.ac,(self.x,self.y,self.w,self.h))
                    if click[0] == 1 and action != None:
                            self.action()
            else:
                    pygame.draw.rect(screen,black,(self.x,self.y,self.w,self.h),4)
                    pygame.draw.rect(screen, self.ic,(self.x,self.y,self.w,self.h))
            self.textSurf, self.textRect = text_objects(self.msg, smallText)
            self.textRect.center = ( (self.x+int(self.w/2)), (self.y+int(self.h/2)))
            screen.blit(self.textSurf, self.textRect)

我现在不做该做什么。我还在Stackoverflow上阅读了这个主题的其他问题。我无法解决问题。

1 个答案:

答案 0 :(得分:1)

pygame.draw.rect()期望pygame.Rect()对象不是元组(x, y, w, h)

因此请将尺寸和位置保持为pygame.Rect()

self.rect = pygame.Rect()
self.rect.x = x
self.rect.y = y
self.rect.width = w
self.rect.height = h

或更短

self.rect = pygame.Rect(x, y, w, h)

并且您不需要所有这些self.xself.y

pygame.draw.rect(screen, black, self.rect, 4)

screen.blit(self.image, self.rect)

您可以检查鼠标悬停按钮

if self.rect.collidepoint(self.mouse):

而不是

if self.x+self.w > self.mouse[0] > self.x and self.y+self.h > self.mouse[1] > self.y:

您也可以使用

  • self.rect.right代替self.x+self.w
  • self.rect.bottom代替self.y+self.h
  • self.rect.centerx代替self.x+(self.w/2)
  • self.rect.centery代替self.y+(selfh./2)
  • 等。

您可以将文字置于按钮

self.textRect.center = self.rect.center

而不是

self.textRect.center = ( (self.x+int(self.w/2)), (self.y+int(self.h/2)) )

请参阅PyGame doc:pygame.Rect()

BTW: example of button code

BTW:,使代码更具可读性,使用CamelCase名称作为函数/方法和变量class Button的类lower_caseself.text_image名称, self.text_rect

请参阅:PEP 8 -- Style Guide for Python Code