首页 > 解决方案 > Pygame SysFont 不在函数内部渲染

问题描述

我正在制作一个游戏,你每天在森林里砍木头,并通过在屏幕底部放置一个 SysFont 来执行在 3 秒后摧毁一棵树的功能,从三秒开始倒计时,到那时它会移除树. 我绑定了键 Q 来砍掉第一棵树(出于测试目的),但是我没有移除树,也没有 SysFont 倒计时 - 因为time.sleep(1)我输入了它,它所做的只是延迟了游戏。整个代码如下:

import pygame
import time
pygame.init()
root = pygame.display.set_mode((603, 573))
pygame.display.set_caption("Homework")
window_is_open = True
white = (255, 255, 255)
black = (0, 0, 0)
width = 10
leaves_width = 30
height = 20
leaves_height = 10
x = 0
tree_trunk_x = 10
y = 0
tree_trunk_y = 10
vel = 5
brown = (150, 75, 0)
green = (58, 95, 11)
tree_one_property = True
tree_two_property = True
tree_three_property = True
tree_four_property = True
tree_five_property = True
tree_six_property = True
tree_seven_property = True
tree_eight_property = True
tree_nine_property = True
tree_ten_property = True
tree_eleven_property = True
tree_twelve_property = True
tree_thirteen_property = True
tree_fourteen_property = True
tree_fifteen_property = True
tree_sixteen_property = True
tree_seventeen_property = True
tree_eighteen_property = True
tree_nineteen_property = True
tree_twenty_property = True
tree_twenty_one_property = True
tree_twenty_two_property = True
tree_twenty_three_property = True
tree_twenty_four_property = True
tree_twenty_five_property = True
def create_tree(tree_x, tree_y, tree):
    if tree:
        trunk_x = tree_x + 10
        trunk_y = tree_y + 10
        pygame.draw.rect(root, brown, (trunk_x, trunk_y, width, height))
        pygame.draw.rect(root, green, (tree_x, tree_y, leaves_width, leaves_height))
def destroy_tree(tree_property_name):
    count = pygame.font.SysFont('Tahoma', 18, True, False)
    countdown = count.render('3', True, (0, 0, 0))
    root.blit(countdown, (590, 569))
    pygame.display.update()
    time.sleep(1)
    count = pygame.font.SysFont('Tahoma', 18, True, False)
    countdown = count.render('2', True, (0, 0, 0))
    root.blit(countdown, (590, 569))
    pygame.display.update()
    time.sleep(1)
    count = pygame.font.SysFont('Tahoma', 18, True, False)
    countdown = count.render('1', True, (0, 0, 0))
    root.blit(countdown, (590, 569))
    pygame.display.update()
    time.sleep(1)
    tree_property_name = False
root.fill(white)
while window_is_open:
    pygame.time.delay(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            window_is_open = False
    keys = pygame.key.get_pressed()
    if keys[pygame.K_RIGHT]:
        x += vel
    if keys[pygame.K_LEFT]:
        x -= vel
    if keys[pygame.K_UP]:
        y -= vel
    if keys[pygame.K_DOWN]:
        y += vel
    if keys[pygame.K_q]:
        destroy_tree(tree_one_property)
    root.fill(white)
    font = pygame.font.SysFont('Tahoma', 18, True, False)
    score = font.render('Score:', True, (0, 0, 0))
    root.blit(score, (410, 0))
    rectangle = pygame.draw.rect(root, (0, 0, 0), (x, y, width, 10)) 
    tree_one = create_tree(0, 0, tree_one_property)
    tree_two = create_tree(50, 0, tree_two_property)
    tree_three = create_tree(100, 0, tree_three_property)
    tree_four = create_tree(150, 0, tree_four_property)
    tree_five = create_tree(200, 0, tree_five_property)
    tree_six = create_tree(0, 50, tree_six_property)
    tree_seven = create_tree(50, 50, tree_seven_property)
    tree_eight = create_tree(100, 50, tree_eight_property)
    tree_nine = create_tree(150, 50, tree_nine_property)
    tree_ten = create_tree(200, 50, tree_ten_property)
    tree_eleven = create_tree(0, 100, tree_eleven_property)
    tree_twelve = create_tree(50, 100, tree_twelve_property)
    tree_thirteen = create_tree(100, 100, tree_thirteen_property)
    tree_fourteen = create_tree(150, 100, tree_fourteen_property)
    tree_fifteen = create_tree(200, 100, tree_fifteen_property)
    tree_sixteen = create_tree(0, 150, tree_sixteen_property)
    tree_seventeen = create_tree(50, 150, tree_seventeen_property)
    tree_eighteen = create_tree(100, 150, tree_eighteen_property)
    tree_nineteen = create_tree(150, 150, tree_nineteen_property)
    tree_twenty = create_tree(200, 150, tree_twenty_property)
    tree_twenty_one = create_tree(0, 200, tree_twenty_one_property)
    tree_twenty_two = create_tree(50, 200, tree_twenty_two_property)
    tree_twenty_three = create_tree(100, 200, tree_twenty_three_property)
    tree_twenty_four = create_tree(150, 200, tree_twenty_four_property)
    tree_twenty_five = create_tree(200, 200, tree_twenty_five_property)
    pygame.display.update()    
pygame.quit()




标签: python-3.xpygamerendering

解决方案


看起来您正在(几乎)完全从屏幕底部绘制字体。下面的行:

root = pygame.display.set_mode((603, 573))

  ...

    root.blit(countdown, (590, 569))

表示您的屏幕高度为 573 像素。您正在用 569 的顶部对文本进行 blit'ing,这在屏幕上只有 4 个像素。实际上,这可能意味着文本完全不在屏幕底部。

试着把它移高一点。

实际上,您实际上可以countdown像这样获得文本表面的边界框的大小:

text_box_size = countdown.get_size()

请参阅此处的文档。您可以像这样获取文本框的高度和宽度,并使用它来确定要传递到的屏幕底部的偏移量blit()

我已编辑此答案以在您的评论中添加对问题的回复,询问您的树为何仍在渲染。这将是在后续评论中添加的太多内容。

在您的代码中,您有一个方法def destroy_tree(tree_property_name),在其中您尝试更新变量tree_property_name并将其设为 False。如果将变量作为按引用传递传递给函数,那将起作用,但在 python 中,这不是传递参数的方式。因此,当您在方法内将其设置为 False 时,所做的只是更改在方法范围内看到的值。函数调用者看到的值不会改变。

您可以通过查看如何通过引用传递变量的答案来获得更多解释?

如果你把树变成一个类,你的代码会更干净。它还允许您在将类传递给方法时更改类中的内部值。


推荐阅读