我现在正在为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上阅读了这个主题的其他问题。我无法解决问题。
答案 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.x
,self.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:,使代码更具可读性,使用CamelCase
名称作为函数/方法和变量class Button
的类lower_case
和self.text_image
名称, self.text_rect