【发布时间】:2020-01-16 22:33:07
【问题描述】:
我很长一段时间都在尝试向我的游戏添加菜单,但它没有显示出来。有一个屏幕出现,但它是空的,只有文字没有按钮,所以无论我点击哪里,它都会带我到同一页面。就像屏幕显示一样,但按钮没有出现,我不知道为什么。如何为选项添加按钮?
background = pygame.image.load('background.png')
backgroundX = 0
backgroundX2 = background.get_width()
homeScreen = pygame.image.load('home_screen.png')
obstacle = pygame.image.load('obstacle.png')
obstacleX = 0
obstacleX2 = obstacle.get_width()
instructions = pygame.image.load('instructions.png')
# frame rate
clock = pygame.time.Clock()
# use procedure for game window rather than using it within loop
def redrawGameWindow():
# background images for right to left moving screen
screen.blit(background, (backgroundX, 0))
screen.blit(background, (backgroundX2, 0))
man.draw(screen)
screen.blit(obstacle, (obstacleX, 400))
screen.blit(obstacle, (obstacleX2, 400))
pygame.display.flip()
pygame.display.update()
# create class for character (object)
class player(object):
def __init__(self, x, y, width, height): # initialize attributes
self.x = x
self.y = y
self.width = width
self.height = height
self.left = True
self.right = True
self.isJump = False
self.stepCount = 0
self.jumpCount = 10
self.standing = True
def draw(self, screen):
if self.stepCount + 1 >= 27: # 9 sprites, with 3 frames - above 27 goes out of range
self.stepCount = 0
if not self.standing:
if self.left:
screen.blit(leftDirection[self.stepCount // 5], (self.x, self.y), )
self.stepCount += 1
elif self.right:
screen.blit(rightDirection[self.stepCount // 5], (self.x, self.y), )
self.stepCount += 1
else:
if self.right:
screen.blit(rightDirection[0], (self.x, self.y)) # using index, include right faced photo
else:
screen.blit(leftDirection[0], (self.x, self.y))
class enlargement(object):
def __init__(self, x, y, radius, color, facing):
self.x = x
self.y = y
self.radius = radius
self.color = color
self.facing = facing
def draw(self, screen):
pygame.draw.circle(screen, self.color, (self.x, self.y), self.radius, 1)
man = player(200, 313, 64, 64)
font = pygame.font.Font(None, 75) # font for home screen
instructionsFont = pygame.font.Font(None, 30) # font for instructions page
# HOME SCREEN
font = pygame.font.Font(None, 75) # font for home screen
instructionsFont = pygame.font.Font(None, 30) # font for instructions page
display_instructions = True
homePage = 1
play_page = 2
done = False
while not done and display_instructions:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == pygame.MOUSEBUTTONDOWN:
homePage += 1
if homePage == 3:
display_instructions = False
# background
screen.blit(homeScreen, (0, 0))
if homePage == 1:
text = font.render("Star Keeper", True, white)
screen.blit(text, [115, 40])
text = font.render("Home", True, white)
screen.blit(text, [180, 130])
text = font.render("Instructions", True, white)
screen.blit(text, [100, 220])
text = font.render("Play", True, white)
screen.blit(text, [200, 300])
if homePage == 2:
# Draw instructions, page 2
text1 = instructionsFont.render("Welcome to Star Keeper", True, white)
text2 = instructionsFont.render("The objective of the game", True, white)
text3 = instructionsFont.render("is to jump over obstacles using ", True, white)
text4 = instructionsFont.render("the space key. Hitting an obstacle", True, white)
text5 = instructionsFont.render("will cause you to lose. Good luck!", True, white)
screen.blit(text1, [130, 50])
screen.blit(text2, [130, 100])
screen.blit(text3, [93, 150])
screen.blit(text4, [93, 200])
screen.blit(text5, [93, 250])
# Limit to 60 frames per second
clock.tick(60)
# Go ahead and update the screen with what we've drawn.
pygame.display.flip()
pygame.display.update()
# main loop
speed = 30 # NEW
man = player(200, 410, 64, 64) # set main character attributes
run = True
while run:
screen.fill(white)
clock.tick(30)
pygame.display.update()
redrawGameWindow() # call procedure
clock.tick(speed) # NEW
backgroundX -= 1.4 # Move both background images back
backgroundX2 -= 1.4
obstacleX -= 1.4
obstacleX2 -= 1.4
if backgroundX < background.get_width() * -1: # If our background is at the -width then reset its position
backgroundX = background.get_width()
if backgroundX2 < background.get_width() * -1:
backgroundX2 = background.get_width()
if obstacleX < obstacle.get_width() * -10:
obstacleX = obstacle.get_width
if obstacleX2 < obstacle.get_width() * -10:
obstacleX2 = obstacle.get_width()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
quit()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
man.left = True
man.right = False
man.standing = False # false, because man is walking
# verify that character is within window parameters
elif keys[pygame.K_RIGHT]:
man.right = True
man.left = False
man.standing = False # false, because man is walking
else:
man.standing = True
man.stepCount = 0
if not man.isJump:
if keys[pygame.K_SPACE]:
man.isJump = True # when jumping, man shouldn't move directly left or right
man.right = False
man.left = False
man.stepCount = 0
else:
if man.jumpCount >= -10:
neg = 1
if man.jumpCount < 0:
neg = -1
man.y -= (man.jumpCount ** 2) * .5 * neg # to jump use parabola
man.jumpCount -= 1
else:
man.isJump = False
man.jumpCount = 10
pygame.quit()
【问题讨论】:
-
你 blit 文本但你不使用
pygame.draw.rect()来绘制按钮的矩形 - 所以你看不到按钮的矩形 -
顺便说一句:
pygame.display.flip()和pygame.display.update()做的几乎一样,所以你只需要其中一个。 -
我在您的代码中看不到任何按钮。你 blit 文本,但它不是按钮。按钮需要
pygame.Rect()来保持位置和大小,你可以用它来绘制矩形pygame.draw.rect(),当你有event.MOUSEBUTTONDOWN-button.rect.collidepoint(event.pos)时,你可以用它来检查与鼠标的碰撞 -
顺便说一句:Example which uses functions 绘制按钮并检查按钮是否被点击。 Example which uses class 创建
Button