【问题标题】:Python/Pygame How to make my Score Text update itself forever?Python/Pygame 如何让我的乐谱文本永远自我更新?
【发布时间】:2013-11-13 00:51:00
【问题描述】:

我目前正在创建一个游戏,其中(目前)分数每秒增加 1 分。

但是,使用我当前的代码(我相信它每秒都会更改变量),每当我运行程序时,文本都不会改变。它只是停留在 0。

这是我的代码:(我在这个问题中提供了文本来解释我的代码,例如 cmets。)

第 1 部分:导入 PyGame 和其他标准程序代码。

import sys, pygame
from pygame.locals import *
pygame.init()
size = width, height = 800,500
screen = pygame.display.set_mode(size)

第 2 部分:设置窗口标题和颜色变量。

pygame.display.set_caption("One Score (Created by - Not Really Working Lamp Productions:)")
WHITE = (255,255,255)

第 3 部分:声明变量“score”。我给了它一个单独的代码示例,因为它与问题密切相关。

score = 0

第 4 部分:填充屏幕并声明默认字体变量。

screen.fill (WHITE)
myfont = pygame.font.SysFont("monospace", 16)

第 5 部分:免责声明文本(或者是声明文本,我不太确定。)

disclaimertext = myfont.render("Copyright, 2013, Not Really Working Lamp Productions.", 1, (0,0,0))
screen.blit(disclaimertext, (5, 480))

第 6 部分:添加乐谱文本(可能是最关键的部分。)

scoretext = myfont.render("Score = "+str(score), 1, (0,0,0))
screen.blit(scoretext, (5, 10))

第 7 部分:while 循环(可能是最关键的部分。)

while 1:         
    for event in pygame.event.get():
        pygame.display.flip()
        if event.type == pygame.QUIT:sys.exit()
        pygame.time.wait(100)
        score = score + 1

那么我在我的代码中的什么地方放了什么? (我需要屏幕不断更新分数,因为它从“while 1:”循环中每秒都在变化。)

谢谢。

【问题讨论】:

  • 绘图操作需要在循环内进行。事实上,blitting 只发生一次,在程序开始时,再也不会发生。此外,for event 循环中的所有代码几乎肯定都在该循环之外(但仍在 while 内),if event.type 行除外。
  • 声明,而非免责声明
  • 我写了一个文本渲染类,如果变量发生变化则渲染文本,否则使用缓存的表面。 stackoverflow.com/a/15516132/341744
  • 我建议不要将程序分成几部分。很难将发生的事情拼凑起来。如果代码足够少,只需将所有代码放在一个块中并使用 cmets。

标签: python text pygame


【解决方案1】:

我不确定 pygame 如何构建其逻辑,但通常 while true: 游戏循环处理一些任务:

  • 处理用户输入
  • 更新游戏状态
  • 呈现状态。

所以在你的while 1 循环中你应该这样做,并且按照这个顺序(顺序非常重要)。

您要确保处理来自用户的任何输入,更新游戏状态,然后将其呈现给用户!

更新

一个基本的谷歌搜索告诉我你应该打电话

scoretext = myfont.render("Score = "+str(score), 1, (0,0,0))
screen.blit(scoretext, (5, 10))

循环的每次迭代

修订

import sys
import pygame
from pygame.locals import *

pygame.init()
size = width, height = 800,500
screen = pygame.display.set_mode(size)
pygame.display.set_caption("testing")
myfont = pygame.font.SysFont("monospace", 16)
WHITE = (255,255,255)

score = 0

while True:
    pygame.display.flip()
    for event in pygame.event.get():
        # I remove the timer just for my testing
        if event.type == pygame.QUIT: sys.exit()

    screen.fill(WHITE)

    disclaimertext = myfont.render("Some disclaimer...", 1, (0,0,0))
    screen.blit(disclaimertext, (5, 480))

    scoretext = myfont.render("Score {0}".format(score), 1, (0,0,0))
    screen.blit(scoretext, (5, 10))
    score += 1

请注意,我会填满屏幕并在每个循环中重绘它:https://stackoverflow.com/a/1637386/1072724

您无法撤消写在另一个图形顶部的一个图形 超过你无法撤消绘制在顶部的粉笔插图 同一板上的另一个粉笔插图。

通常在图形中所做的就是您对 黑板 - 清除全部,下次只重画你的东西 想保留。

【讨论】:

  • 但是我不知道要添加什么代码。或者你告诉我我只是移动变量增加脚本的位置?
  • @NotReallyWorkingLampProduc 每次迭代都应该渲染你的游戏状态,这意味着你需要重新绘制已经绘制的东西(因为游戏中的状态变化很快)。您的渲染循环不关心分数是如何更新的(应该在您的逻辑中处理以更新游戏状态),但它确实关心可绘制对象本身。需要注意的一点是,在您的 while 循环中放置一个 wait(100) 会导致整个游戏在每个循环中停止一秒钟。这应该放在一个定时循环中,您可以在其中计算循环之间的时间,并在时间达到 > 1 秒时增加。
  • 我尝试更改我的代码,但现在程序无法运行,而且完全崩溃了。
  • @NotReallyWorkingLampProduc 如果您现在还没有弄清楚,这是一个工作示例...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2021-12-28
相关资源
最近更新 更多