Pygame 帮助:游戏文本一直卡在屏幕上(计时器不工作)
Pygame help: Game text constantly stuck on screen (timer not working)
我正在尝试在 Pygame 中制作一个简单的潜艇游戏,但是当玩家到达游戏的边界时,我无法显示一段名为 'crashed' 的文本 window.
当潜艇与游戏边界相撞时,文本应该会立即出现在屏幕上 ("You crashed!") - 随后是 2 秒的计时器,然后重生潜艇并清除显示屏上的文本。
我遇到的问题是 'crashed' 文本直到 2 秒计时器结束(潜艇重生时)才出现在屏幕上 - 然后文本一直停留在屏幕上重生后(即每次潜艇重生时文本不会重置)
我有一个名为 'crash' 的函数,它包含消息和一个单独的函数来处理名为 'message_display' 的消息显示。我正在关注 YouTube 上的教程,但与视频中的项目不同,我有一个文本重叠的背景图像,但我无法在潜艇第一次坠毁时显示它,或者在潜艇重生时让它消失。
这是我的完整代码:
**import pygame
import time
pygame.init()
display_width = 1280
display_height = 720
sound = pygame.mixer.Sound('YellowSubmarine.wav')
sound.play()
black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
gameDisplay = pygame.display.set_mode((display_width,display_height))
bg = pygame.image.load("bg.jpg") <<<<<<<< THE BACKGROUND IMAGE
pygame.display.set_caption('The Amazing Yellow Submarine!')
clock = pygame.time.Clock()
SubImage = pygame.image.load('sub.png')<<<< <<<<< SUB IMAGE
SubImage = pygame.transform.scale(SubImage,(160,100)) <<< SCALE SUB IMAGE
def submarine(x,y): <<<<<<<<<< THE SUBMARINE OBJECT
gameDisplay.blit(bg,(0,0)) <<<<<< BLITTING THE BACKGROUND IMAGE
gameDisplay.blit(SubImage,(x,y)) <<<< BLITTING THE SUB IMAGE
def text_objects(text, font): <<<<< CREATING THE TEXT OBJECT
textSurface = font.render(text, True, white)
return textSurface, textSurface.get_rect()
def message_display(text): <<<< DISPLAYING THE TEXT TO THE SCREEN
largeText = pygame.font.Font('freesansbold.ttf',80)
TextSurf, TextRect = text_objects(text, largeText)
TextRect.center = ((display_width/2),(display_height/2))
bg.blit(TextSurf, TextRect) <<< MAKING SURE THE TEXT OVERLAPS THE BACKROUND IMAGE
time.sleep(2) <<<<< TWO SECOND TIMER
game_loop() <<<< RUN THE MAIN GAME LOOP
def crash():
message_display('You Crashed!') <<<<< DISPLAYS THE CRASH MESSAGE
def game_loop(): <<<< RUNS UNLESS THE GAME IS QUIT
x = (display_width * 0.02)
y = (display_height * 0.4)
y_change = 0
x_change = 0
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = -5
y_change = 0
if event.key == pygame.K_RIGHT:
x_change = 5 <<<<<< CONTROLS
y_change = 0
if event.key == pygame.K_UP:
y_change = -2
if event.key == pygame.K_DOWN:
y_change = 2
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_change = -1
if event.key == pygame.K_RIGHT:
x_change = 1
if event.key == pygame.K_DOWN:
y_change = 2
x += x_change
y += y_change
submarine(x,y)
if x > 1125 or x < -25 or y > 650 or y < -25: <<<<<< IF BOUNDARY IS HIT
crash() <<<<< RUNS CRASH FUNCTION (WHICH DISPLAYS THE MESSAGE)
pygame.mixer.Sound.stop()
clock.tick(60)
pygame.display.update() <<<<<<<< UPDATING THE DISPLAY
game_loop()
pygame.quit()
退出()
文本在两秒后出现,因为在将文本 blit 到屏幕后,您在更新屏幕之前暂停了两秒钟的游戏:
bg.blit(TextSurf, TextRect) <<< MAKING SURE THE TEXT OVERLAPS THE BACKROUND IMAGE
time.sleep(2) <<<<< TWO SECOND TIMER
game_loop() <<<< RUN THE MAIN GAME LOOP
因此,与其用 time.sleep(2)
阻塞整个游戏,不如保持主循环 运行。
您可以使用事件来触发游戏的状态更改。要了解自定义事件的工作原理,请查看 here and here.
然后文本永远不会消失,因为您将文本 blit 到用作背景表面的 Surface
,并且您继续将现在更改为 Surface
的文本 blit 到屏幕:
bg.blit(TextSurf, TextRect) <<< MAKING SURE THE TEXT OVERLAPS THE BACKROUND IMAGE
因此,与其将文本绘制到背景 Surface
,不如直接将其 blit 到屏幕 Surface
。
您的代码还有一些其他问题,但这超出了本答案的范围,但您应该了解如何解决您的主要问题。
我正在尝试在 Pygame 中制作一个简单的潜艇游戏,但是当玩家到达游戏的边界时,我无法显示一段名为 'crashed' 的文本 window.
当潜艇与游戏边界相撞时,文本应该会立即出现在屏幕上 ("You crashed!") - 随后是 2 秒的计时器,然后重生潜艇并清除显示屏上的文本。
我遇到的问题是 'crashed' 文本直到 2 秒计时器结束(潜艇重生时)才出现在屏幕上 - 然后文本一直停留在屏幕上重生后(即每次潜艇重生时文本不会重置)
我有一个名为 'crash' 的函数,它包含消息和一个单独的函数来处理名为 'message_display' 的消息显示。我正在关注 YouTube 上的教程,但与视频中的项目不同,我有一个文本重叠的背景图像,但我无法在潜艇第一次坠毁时显示它,或者在潜艇重生时让它消失。
这是我的完整代码:
**import pygame
import time
pygame.init()
display_width = 1280
display_height = 720
sound = pygame.mixer.Sound('YellowSubmarine.wav')
sound.play()
black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
gameDisplay = pygame.display.set_mode((display_width,display_height))
bg = pygame.image.load("bg.jpg") <<<<<<<< THE BACKGROUND IMAGE
pygame.display.set_caption('The Amazing Yellow Submarine!')
clock = pygame.time.Clock()
SubImage = pygame.image.load('sub.png')<<<< <<<<< SUB IMAGE
SubImage = pygame.transform.scale(SubImage,(160,100)) <<< SCALE SUB IMAGE
def submarine(x,y): <<<<<<<<<< THE SUBMARINE OBJECT
gameDisplay.blit(bg,(0,0)) <<<<<< BLITTING THE BACKGROUND IMAGE
gameDisplay.blit(SubImage,(x,y)) <<<< BLITTING THE SUB IMAGE
def text_objects(text, font): <<<<< CREATING THE TEXT OBJECT
textSurface = font.render(text, True, white)
return textSurface, textSurface.get_rect()
def message_display(text): <<<< DISPLAYING THE TEXT TO THE SCREEN
largeText = pygame.font.Font('freesansbold.ttf',80)
TextSurf, TextRect = text_objects(text, largeText)
TextRect.center = ((display_width/2),(display_height/2))
bg.blit(TextSurf, TextRect) <<< MAKING SURE THE TEXT OVERLAPS THE BACKROUND IMAGE
time.sleep(2) <<<<< TWO SECOND TIMER
game_loop() <<<< RUN THE MAIN GAME LOOP
def crash():
message_display('You Crashed!') <<<<< DISPLAYS THE CRASH MESSAGE
def game_loop(): <<<< RUNS UNLESS THE GAME IS QUIT
x = (display_width * 0.02)
y = (display_height * 0.4)
y_change = 0
x_change = 0
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = -5
y_change = 0
if event.key == pygame.K_RIGHT:
x_change = 5 <<<<<< CONTROLS
y_change = 0
if event.key == pygame.K_UP:
y_change = -2
if event.key == pygame.K_DOWN:
y_change = 2
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_change = -1
if event.key == pygame.K_RIGHT:
x_change = 1
if event.key == pygame.K_DOWN:
y_change = 2
x += x_change
y += y_change
submarine(x,y)
if x > 1125 or x < -25 or y > 650 or y < -25: <<<<<< IF BOUNDARY IS HIT
crash() <<<<< RUNS CRASH FUNCTION (WHICH DISPLAYS THE MESSAGE)
pygame.mixer.Sound.stop()
clock.tick(60)
pygame.display.update() <<<<<<<< UPDATING THE DISPLAY
game_loop()
pygame.quit()
退出()
文本在两秒后出现,因为在将文本 blit 到屏幕后,您在更新屏幕之前暂停了两秒钟的游戏:
bg.blit(TextSurf, TextRect) <<< MAKING SURE THE TEXT OVERLAPS THE BACKROUND IMAGE
time.sleep(2) <<<<< TWO SECOND TIMER
game_loop() <<<< RUN THE MAIN GAME LOOP
因此,与其用 time.sleep(2)
阻塞整个游戏,不如保持主循环 运行。
您可以使用事件来触发游戏的状态更改。要了解自定义事件的工作原理,请查看 here and here.
然后文本永远不会消失,因为您将文本 blit 到用作背景表面的 Surface
,并且您继续将现在更改为 Surface
的文本 blit 到屏幕:
bg.blit(TextSurf, TextRect) <<< MAKING SURE THE TEXT OVERLAPS THE BACKROUND IMAGE
因此,与其将文本绘制到背景 Surface
,不如直接将其 blit 到屏幕 Surface
。
您的代码还有一些其他问题,但这超出了本答案的范围,但您应该了解如何解决您的主要问题。