【发布时间】: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 矩形有一个碰撞点函数,您可以使用它来检查一个点是否在矩形内。会派上用场的。
-
感谢您的帮助,当我看到您指出我在额头上打了自己的耳光时又好又重哈哈。我能够修复它,再次感谢您。