使用blit方法创建动态文本

-1 投票
1 回答
3083 浏览
提问于 2025-04-17 07:17

我正在制作一个简单的游戏,里面有一个黑色的方块在屏幕上移动。还有两个其他的方块,一个是绿色的,另一个是红色的。当黑色方块碰到红色方块时,程序就会退出;而当它碰到绿色方块时,分数就会增加。我已经搞定了红色方块的部分,但在使用精灵和类来创建动态文本时遇到了困难。之前有人告诉我,我应该把分数显示在屏幕上,然后每次黑色方块碰到绿色方块时重新显示一次分数。不过,我不知道该怎么正确地做到这一点。以下是我的代码:

import os, sys
import pygame
from pygame.locals import *

pygame.init()
mainClock = pygame.time.Clock()

WINDOWWIDTH = 1000
WINDOWHEIGHT = 700
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption("Avoid!")

BLACK = (0, 0, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)

player = pygame.Rect(500, 300, 40, 40)
playerImage = pygame.Surface((40, 40))

enemy = pygame.Rect(300, 400, 20, 20)
enemyImage = pygame.Surface((20, 20))
enemyImage.fill((RED))

food = pygame.Rect(300, 500 , 20, 20)
foodImage = pygame.Surface((20, 20))
foodImage.fill((GREEN))

class Score(pygame.sprite.Sprite):
    """A sprite for the score."""

    def __init__(self, xy):
        pygame.sprite.Sprite.__init__(self)
        self.xy = xy    # save xy -- will center our rect on it when we change the score
        self.font = pygame.font.Font(None, 50)  # load the default font, size 50
        self.color = (BLACK)         # our font color in rgb
        self.score = 0  # start at zero
        self.reRender() # generate the image

    def update(self):
        pass

    def add(self, points):
        """Adds the given number of points to the score."""
        if player.colliderect(food):
            my_score.score += points
        self.reRender()

    def reset(self):
        """Resets the scores to zero."""
        self.score = 0
        self.reRender()

    def reRender(self):
        """Updates the score. Renders a new image and re-centers at the initial coordinates."""
        self.image = self.font.render("%d"%(self.score), True, self.color)
        self.rect = self.image.get_rect()
        self.rect.center = self.xy

my_score = Score((75, 575))
print my_score.score

font = pygame.font.Font(None, 36)
text = font.render("%d" % (my_score.score), 1, (10, 10, 10))
textpos = text.get_rect(centerx=windowSurface.get_width()/2)

moveLeft = False
moveRight = False
moveUp = False
moveDown = False

MOVESPEED = 6

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                moveRight = False
                moveLeft = True
            if event.key == K_RIGHT:
                moveLeft = False
                moveRight = True
            if event.key == K_UP:
                moveDown = False
                moveUp = True
            if event.key == K_DOWN:
                moveUp = False
                moveDown = True
        if event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            if event.key == K_LEFT:
                moveRight = False
                moveLeft = True
            if event.key == K_RIGHT:
                moveLeft = False
                moveRight = True
            if event.key == K_UP:
                moveDown = False
                moveUp = True
            if event.key == K_DOWN:
                moveUp = False
                moveDown = True

    windowSurface.fill(WHITE)

    if moveDown and player.bottom < WINDOWHEIGHT:
        player.top += MOVESPEED
    if moveUp and player.top > 0:
        player.top -= MOVESPEED
    if moveLeft and player.left > 0:
        player.left -= MOVESPEED
    if moveRight and player.right < WINDOWWIDTH:
        player.right +=MOVESPEED

    if player.colliderect(enemy):
        pygame.quit()
        sys.exit()

    windowSurface.blit(playerImage, player)
    windowSurface.blit(enemyImage, enemy)
    windowSurface.blit(foodImage, food)
    windowSurface.blit(text, textpos)

    score = Score((75, 575))

    pygame.display.update()
    mainClock.tick(40)

我是不是应该把 windowSurface.blit(text, textpos) 放到 Score 类的 add 函数里?我该怎么在大方块碰到小绿色方块时增加分数呢?

1 个回答

-1

老实说,我觉得你其实不需要单独为分数创建一个类。你可以直接写一个加分的方法,每当大方块和小方块碰撞的时候就调用这个方法:

def addScore():
     global score
     score += 1 #just increasing thescore
     if pygame.font: #checking if the font loading correctly, this section is taken directly from the Chimp Line by Line tutorial
          font = pygame.font.Font(None, 36)
          text = font.render("score: " + str(score), 1, (10, 10, 10))
          textpos = text.get_rect(centerx=background.get_width()/2)
          background.blit(text, textpos)

注意:我自己在Python里没有测试过这个。

这样做对你有用吗?

撰写回答