2011-11-29 80 views
0

我正在创建一个黑色方块在屏幕上移动的基本游戏。还有另外两个广场,一个绿色广场和一个红色广场。当黑色方块与红色方块相撞时,退出程序,当它与绿色方块相撞时,它将添加到您的积分计数器中。我已经将红色部分放下了,但我无法使用精灵和类创建动态文本。我之前问过的一个问题告诉我,我应该把分数放到屏幕上,然后在每次广场与绿色广场相撞时重新敲击它。但我不知道如何正确地做到这一点。这里是我的代码:使用blit方法创建动态文本

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函数吗?一旦大广场接触到绿色的小广场,我该如何提高分数?

回答

0

老实说,我不认为你真的需要对得分一个单独的类,你可以有一个附加分数方法被称为每当大和小广场的rects碰撞:

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中自己测试过它

这是否适合您?