gpt4 book ai didi

python - 在python中,有没有办法使用类和继承将两个(或更多)按钮输出到屏幕上?

转载 作者:行者123 更新时间:2023-12-01 00:35:20 25 4
gpt4 key购买 nike

问题:我正在创建一个小游戏,我正在尝试找出主菜单屏幕。我想在某些位置有两个按钮,但是,我似乎无法真正将它们显示在屏幕上。

我尝试调用我制作的 Button 类(这可能有问题,我不太确定),并且我尝试移动该行代码。我也尝试过创建该类的实例,但这似乎根本不起作用。

下面是我的主要游戏类(父类):

pygame.init()
winWidth = 1000
winHeight= 600
FPS = 27
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (200,0,0)
LIGHTRED = (255,96,96)
TITLE_FONT_SIZE = 60
MENU_FONT = 'oldenglishtext'

class mainMenu():
def __init__ (self):
self.title = pygame.display.set_caption('Game')
self.screen = pygame.display.set_mode((winWidth, winHeight))
self.clock = pygame.time.Clock()
self.running = True
self.state = 'menu'

def run(self):
while self.running:
if self.state == 'menu':
self.menuEvents()
self.menuDraw()
Button(self.screen, 400, 200, 200, 75, RED, LIGHTRED)
elif self.state == 'options':
pass

self.clock.tick(FPS)
def menuEvents(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()

def menuDraw(self):
self.screen.fill(WHITE)
self.drawText('GAME', self.screen, (winWidth//2, winHeight-575),
TITLE_FONT_SIZE, BLACK, MENU_FONT)
pygame.display.update()


def drawText(self, words, screen, pos, size, colour, fontName):
font = pygame.font.SysFont(fontName, size)
text = font.render(words, False, colour)
textSize = text.get_size()
pos = list(pos)
pos[0] = pos[0] - textSize[0]//2
pos[1] = pos[1] - textSize[1]//2
pos = tuple(pos)
screen.blit(text, pos)

下面是我的按钮类(子类):

    def __init__(self, screen, buttonX, buttonY, buttonWidth, buttonHeight, colour, hoverColour):
super().__init__()
self.buttonX = buttonX
self.buttonY = buttonY
self.buttonWidth = buttonWidth
self.buttonHeight = buttonHeight
self.hovered = False
self.screen = screen

def mouseHovering(self, pos):
self.mouse = mouse
self.button = button
mouse = pygame.mouse.get_pos()
if event.type == pygame.MOUSEMOTION:
if button.collidepoint(event.pos):
pygame.draw.rect(self.screen, self.hoverColour, ((self.buttonX,self.buttonY),(self.buttonWidth,self.buttonHeight)))
return True
else:
pygame.draw.rect(self.screen, self.colour, ((self.buttonX,self.buttonY),(self.buttonWidth,self.buttonHeight)))
return False
def buttonUpdate(self):
if self.mouseHovering(pos):
self.hovered = True
else:
self.hovered = False
def setColour(self, colour, hoverColour):
self.colour = colour
self.hoverColour = hoverColour

def drawButton(self):
if self.hovered:
pygame.draw.rect(self.screen, self.hoverColour,((self.buttonX,self.buttonY),(self.buttonWidth,self.buttonHeight)))
print("hovered")
else:
pygame.draw.rect(self.screen, self.colour, ((self.buttonX,self.buttonY),(self.buttonWidth,self.buttonHeight)))
print("not hovered")

if __name__ == '__main__':
game = mainMenu()
game.run()

我希望按钮实际出现在屏幕上,并且当我将鼠标悬停在按钮上时能够改变颜色。最终我将添加文本和点击功能,但现在我希望拥有这些基本功能。目前,代码输出游戏标题,仅输出其他内容。

最佳答案

首先,你忘记了Button.__init__

self.colour = colour
self.hoverColour = hoverColour
<小时/>

要查看两个按钮,您必须创建 Button 类的两个实例在__init__

def __init__ (self):
self.title = pygame.display.set_caption('Game')
self.screen = pygame.display.set_mode((winWidth, winHeight))
self.clock = pygame.time.Clock()
self.running = True
self.state = 'menu'

self.button1 = Button(self.screen, 400, 200, 200, 75, RED, LIGHTRED)
self.button2 = Button(self.screen, 400, 400, 200, 75, RED, LIGHTRED)

以及后来在 menuDraw() 中绘制按钮

def menuDraw(self):
self.screen.fill(WHITE)

self.button1.drawButton()
self.button2.drawButton()

self.drawText('GAME', self.screen, (winWidth//2, winHeight-575),
TITLE_FONT_SIZE, BLACK, MENU_FONT)
pygame.display.update()
<小时/>

至于悬停,你必须使用 mouseHoveringmenuEvent但你在mouseHovering中有错误- 您使用变量 mouse button , even该函数中不存在它,并且您不将它们用作 def mouseHovering(...) 中的参数

但你只需要event作为参数,因为它包含有关鼠标位置、鼠标按钮等的信息

def mouseHovering(self, event):
if event.type == pygame.MOUSEMOTION:
self.hovered = self.rect.collidepoint(event.pos)

但这需要将按钮大小和位置保持在 pygame.Rect()

class Button():

def __init__(self, screen, buttonX, buttonY, buttonWidth, buttonHeight, colour, hoverColour):
super().__init__()

self.buttonX = buttonX
self.buttonY = buttonY
self.buttonWidth = buttonWidth
self.buttonHeight = buttonHeight

self.hovered = False
self.screen = screen

self.colour = colour # forgot
self.hoverColour = hoverColour

self.rect = pygame.Rect(self.buttonX, self.buttonY, self.buttonWidth, self.buttonWidth)

然后你可以使用mouseHoveringmenuEvent

def menuEvents(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
self.button1.mouseHovering(event)
self.button2.mouseHovering(event)
<小时/>

编辑:其他更改后的代码。它在按钮上显示文本。它使用类 pygame.Rect()将文本在按钮上居中(有一些问题,但对于其他元素,它可以正确居中)。它生成 draw_text()仅一次,因为它永远不会改变。

import pygame

# --- constants --- (UPPER_CASE_NAMES)

WIN_WIDTH = 1000
WIN_HEIGHT = 600

FPS = 27

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

RED = (200, 0, 0)
LIGHTRED = (255, 96, 96)

GREEN = (0, 200, 0)
LIGHTGREEN = (96, 255, 96)

TITLE_FONT_SIZE = 60
MENU_FONT = 'oldenglishtext'

# --- classes --- (UpperCaseNames)

class Button():

def __init__(self, screen, x, y, width, height, color, hover_color, text):
super().__init__()

self.screen = screen
self.rect = pygame.Rect(x, y, width, height)

self.color = color
self.hover_color = hover_color
self.text = text

self.hovered = False

# create image with text
font = pygame.font.SysFont(MENU_FONT, TITLE_FONT_SIZE)
self.text_image = font.render(text, False, WHITE)
self.text_rect = self.text_image.get_rect()
# center text on button
self.text_rect.center = self.rect.center

def handle_events(self, event):
if event.type == pygame.MOUSEMOTION:
self.hovered = self.rect.collidepoint(event.pos)

def update(self):
pass
# not needed at this moment

def draw(self):
if self.hovered:
color = self.hover_color
else:
color = self.color

# draw button
pygame.draw.rect(self.screen, color, self.rect)
# draw text on button
self.screen.blit(self.text_image, self.text_rect)


class MainMenu():

def __init__ (self):
self.title = pygame.display.set_caption('Game')

self.screen = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
self.screen_rect = self.screen.get_rect()

self.clock = pygame.time.Clock()
self.running = True
self.state = 'menu'

self.button1 = Button(self.screen, 400, 200, 200, 75, RED, LIGHTRED, "HELLO")
self.button2 = Button(self.screen, 400, 400, 200, 75, GREEN, LIGHTGREEN, "WORLD")

# generate text only once because it doesn't change
self.text_image, self.text_rect = self.draw_text('GAME', (self.screen_rect.centerx, self.screen_rect.bottom-575), TITLE_FONT_SIZE, BLACK, MENU_FONT)

def run(self):
while self.running:
if self.state == 'menu':
self.handle_events()
self.draw()
elif self.state == 'options':
pass

self.clock.tick(FPS)

def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()

self.button1.handle_events(event)
self.button2.handle_events(event)

def draw(self):

self.screen.fill(WHITE)

self.button1.draw()
self.button2.draw()

self.screen.blit(self.text_image, self.text_rect)

pygame.display.update()


def draw_text(self, words, pos, size, color, font_name):
font = pygame.font.SysFont(font_name, size) # it could be done once at start in __init__
image = font.render(words, False, color)
rect = image.get_rect()
rect.centerx = pos[0]
rect.top = pos[1]
return image, rect

if __name__ == '__main__':
pygame.init()
game = MainMenu()
game.run()
# pygame.quit()

enter image description here

关于python - 在python中,有没有办法使用类和继承将两个(或更多)按钮输出到屏幕上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57825789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com