【问题标题】:How to make buttons unique in pygame?如何使按钮在pygame中独一无二?
【发布时间】:2016-03-01 21:19:49
【问题描述】:

我现在正在 pygame 中为一门课程创建 Battleship,我正在尝试超越,因为我喜欢使用 python 并用它用 pygame 创建东西。无论如何,我创建了一个 Button 类,它工作得很好,除了一个问题,如果我在屏幕上有多个按钮,它们都运行相同的代码:/ 我需要它们是唯一的,并且在它们被点击时运行不同的代码我似乎无法完成,哈哈。

这里是按钮类:

import pygame

red = (255, 0, 0)
darkRed = (153, 0, 0)
green = (0, 204, 0)
darkGreen = (0, 102, 0)
black = (0, 0, 0)
white = (255, 255, 255)
gray = (192, 192, 192)
darkGray = (96, 96, 96)


class Button(pygame.sprite.Sprite):

def __init__(self, color, color2, value):
    pygame.sprite.Sprite.__init__(self)
    self.color = color
    self.color2 = color2
    self.value = value

    self.image = pygame.Surface([80, 50])
    self.image.fill(self.color)

    self.rect = self.image.get_rect()

def update(self):
    pos = pygame.mouse.get_pos()

    xPos = self.rect[0]
    yPos = self.rect[1]
    width = self.rect[2]
    height = self.rect[3]

    if xPos + width > pos[0] > xPos and yPos + height > pos[1] > yPos:
        self.image.fill(self.color2)

    else:
        self.image.fill(self.color)

def click(self):
    click = pygame.mouse.get_pressed()

    if click[0] == True:
        return self.value

    else:
        return False

下面是运行一切的主要代码:

from Button import *
from TextDisplay import *
from wallPositions import *

screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))


def screen0():
pygame.init()

button_list = pygame.sprite.Group()

button = Button(green, darkGreen, True)
button_list.add(button)

text = Text("Battleship", white, 115, (screen_width * .5), (screen_height * .5 - 50))

done = False

clock = pygame.time.Clock()

button.rect.x = (screen_width * .5 - 35)
button.rect.y = (screen_height * .5 + 70)

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        if button.click() == True:
            screen1()

        button_list.update()

    screen.fill(black)

    text.draw(screen)

    button_list.draw(screen)

    pygame.display.flip()

    clock.tick(30)

pygame.quit()


def screen1():
pygame.init()

button_list = pygame.sprite.Group()

button = Button(gray, darkGray, 1)
button_list.add(button)
button.rect.x = x_list[4]
button.rect.y = y_list[2]

button2 = Button(gray, darkGray, 2)
button_list.add(button2)
button2.rect.x = x_list[6]
button2.rect.y = y_list[2]

button3 = Button(gray, darkGray, 3)
button_list.add(button3)
button3.rect.x = x_list[8]
button3.rect.y = y_list[2]

button4 = Button(gray, darkGray, 4)
button_list.add(button4)
button4.rect.x = x_list[10]
button4.rect.y = y_list[2]

button5 = Button(gray, darkGray, 5)
button_list.add(button5)
button5.rect.x = x_list[4]
button5.rect.y = y_list[4]

button6 = Button(gray, darkGray, 6)
button_list.add(button6)
button6.rect.x = x_list[6]
button6.rect.y = y_list[4]

button7 = Button(gray, darkGray, 7)
button_list.add(button7)
button7.rect.x = x_list[8]
button7.rect.y = y_list[4]

button8 = Button(gray, darkGray, 8)
button_list.add(button8)
button8.rect.x = x_list[10]
button8.rect.y = y_list[4]

button9 = Button(gray, darkGray, 1)
button_list.add(button9)
button9.rect.x = x_list[4]
button9.rect.y = y_list[8]

button10 = Button(gray, darkGray, 2)
button_list.add(button10)
button10.rect.x = x_list[6]
button10.rect.y = y_list[8]

button11 = Button(gray, darkGray, 3)
button_list.add(button11)
button11.rect.x = x_list[8]
button11.rect.y = y_list[8]

button12 = Button(gray, darkGray, 4)
button_list.add(button12)
button12.rect.x = x_list[4]
button12.rect.y = y_list[10]

button13 = Button(gray, darkGray, 5)
button_list.add(button13)
button13.rect.x = x_list[6]
button13.rect.y = y_list[10]

button14 = Button(gray, darkGray, 6)
button_list.add(button14)
button14.rect.x = x_list[8]
button14.rect.y = y_list[10]

button15 = Button(red, darkRed, True)
button_list.add(button15)
button15.rect.x = x_list[12]
button15.rect.y = y_list[10]

instructions = Text("Select your row and column then hit 'Fire!'", white, 30, (screen_width * .5), 20)

text = Text('1', black, 50, (button.rect.x + 40), (button.rect.y + 25))
text1 = Text('2', black, 50, (button2.rect.x + 40), (button2.rect.y + 25))
text2 = Text('3', black, 50, (button3.rect.x + 40), (button3.rect.y + 25))
text3 = Text('4', black, 50, (button4.rect.x + 40), (button4.rect.y + 25))
text4 = Text('5', black, 50, (button5.rect.x + 40), (button5.rect.y + 25))
text5 = Text('6', black, 50, (button6.rect.x + 40), (button6.rect.y + 25))
text6 = Text('7', black, 50, (button7.rect.x + 40), (button7.rect.y + 25))
text7 = Text('8', black, 50, (button8.rect.x + 40), (button8.rect.y + 25))
text8 = Text('1', black, 50, (button9.rect.x + 40), (button9.rect.y + 25))
text9 = Text('2', black, 50, (button10.rect.x + 40), (button10.rect.y + 25))
text10 = Text('3', black, 50, (button11.rect.x + 40), (button11.rect.y + 25))
text11 = Text('4', black, 50, (button12.rect.x + 40), (button12.rect.y + 25))
text12 = Text('5', black, 50, (button13.rect.x + 40), (button13.rect.y + 25))
text13 = Text('6', black, 50, (button14.rect.x + 40), (button14.rect.y + 25))
text14 = Text('Fire!', black, 40, (button15.rect.x + 40), (button15.rect.y + 25))

rows = Text('Rows', white, 45, (x_list[1] + 10), (y_list[2] + 25))

columns = Text('Columns', white, 45, (x_list[1] + 40), (y_list[8] + 25))

done = False

clock = pygame.time.Clock()

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        # I am using this to see if the buttons are working
        # But every button is running this code not just the first one
        if button.click() == 1:
            print("Yay!")

        button_list.update()

    screen.fill(black)

    button_list.draw(screen)

    instructions.draw(screen)
    text.draw(screen)
    text1.draw(screen)
    text2.draw(screen)
    text3.draw(screen)
    text4.draw(screen)
    text5.draw(screen)
    text6.draw(screen)
    text7.draw(screen)
    text8.draw(screen)
    text9.draw(screen)
    text10.draw(screen)
    text11.draw(screen)
    text12.draw(screen)
    text13.draw(screen)
    text14.draw(screen)
    rows.draw(screen)
    columns.draw(screen)

    pygame.display.flip()

    clock.tick(30)

pygame.quit()

screen0()

我一整天都被困在这个问题上,我问了我的老师,他说因为我在做一些不同的事情,我必须自己弄清楚,我什至问了学校的技术人员,他们都不知道:/我已经在堆栈中查看了大约一个小时,似乎没有人遇到与我相同的问题...请帮助,如果我的代码似乎有任何缩进问题,那是因为我只是复制并粘贴了它.

【问题讨论】:

  • button.click() 只运行第一个按钮的点击功能。所以我不确定你的问题是什么?顺便说一句,你做错了。您应该在事件循环中检查鼠标单击事件,然后再检查是否单击了任何按钮。
  • 我只有一个 button.click() 因为当按下任何按钮时,它会运行那个按钮,而不仅仅是第一个按钮。但我会改为在事件循环中进行检查,看看是否可行,谢谢:p
  • 还有一件事,现在您的代码不会检查是否单击了实际按钮。你只检查鼠标是否被点击。 Pygame 矩形有一个碰撞点函数,您可以使用它来检查一个点是否在矩形内。会派上用场的。
  • 感谢您的帮助,当我看到您指出我在额头上打了自己的耳光时又好又重哈哈。我能够修复它,再次感谢您。

标签: python button pygame


【解决方案1】:

在您的主程序中,编写 2 个按钮函数(func1 ()、func2 ())。然后将一个变量添加到您的按钮类“self.action”和一个方法“def setaction(函数)。创建按钮时,请使用正确的函数调用方法:button.setaction (func1)。然后在时钟代码上你就可以'self.action'来调用相应的函数了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2012-04-27
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多