首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pygame.draw.rect TypeError: Rect参数无效

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

Stack Overflow用户
提问于 2017-01-05 19:09:19
回答 1查看 2.6K关注 0票数 0

我现在正在用Python 3和Pygame编写一个跳跃式fun。这一次,我试着用我的旧功能做一个“按钮”类,以使游戏更易读,并获得更好的性能。这是我的旧密码:

代码语言:javascript
复制
    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)

现在我开始用它写一门课:

代码语言:javascript
复制
    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)

但它也给了我同样的问题:

代码语言:javascript
复制
        pygame.draw.rect(screen,black,(self.x,self.y,self.w,self.h),4)
        TypeError: Rect argument is invalid

我现在不知道该怎么办了。我还阅读了关于Stackoverflow这个主题的其他问题。我搞不懂这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-05 20:39:52

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

所以保持pygame.Rect()的大小和位置

代码语言:javascript
复制
self.rect = pygame.Rect()
self.rect.x = x
self.rect.y = y
self.rect.width = w
self.rect.height = h

或者更短

代码语言:javascript
复制
self.rect = pygame.Rect(x, y, w, h)

你不需要所有这些self.xself.y,等等。

代码语言:javascript
复制
pygame.draw.rect(screen, black, self.rect, 4)

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

你可以检查鼠标在上面的按钮

代码语言:javascript
复制
if self.rect.collidepoint(self.mouse):

而不是

代码语言:javascript
复制
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)
  • 等。

您可以在按钮上将文本居中。

代码语言:javascript
复制
self.textRect.center = self.rect.center

而不是

代码语言:javascript
复制
self.textRect.center = ( (self.x+int(self.w/2)), (self.y+int(self.h/2)) )

参见PyGame doc:pygame.Rect()

BTW: 按钮代码示例

BTW:使代码更具可读性,使用类的CamelCase名称( class Button )和函数/方法的lower_case名称以及变量( self.text_imageself.text_rect )

请参阅:PEP 8 -- Python代码样式指南

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41492817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档