2017-12-17 37 views
1

투쟁은 파이 게임에서 스프라이트로 한 줄의 텍스트를 렌더링 할 수 있다는 것입니다. 스프라이트가 없어도 멀티 라인 텍스트를 렌더링 할 수 있지만 알아 내지 못합니다. 스프라이트를 사용하여 멀티 라인 텍스트를 렌더링하는 방법.파이 게임 - 스프라이트를 사용하여 여러 줄 텍스트 렌더링하기

나는 (내가 파이 게임 코드를 실행하기위한 기본을 건너 갈거야 - 배경, 초기화 등) 스프라이트를 사용하여 한 줄의 텍스트를 렌더링이있어 :

class Score(pygame.sprite.Sprite): 
    . 
    . 
    def update(self, lives, score): 
     . 
     . 
     self.text = "LIVES: %d SCORE: %d" % (lives, score) 
     self.image = self.font.render(self.text, True, self.color) 
     self.rect = self.image.get_rect() 
     . 
     . 

. 
. 
def main(): 
    . 
    . 
    score = pygame.sprite.RenderUpdates() 
    score.add(Score()) 
    . 
    . 
    while 1: 
     . 
     . 
     score.clear(screen, background) 
     score_list = score.draw(screen) 
     pygame.display.update(score_list) 

     score.update(lives, score) 
    . 
    . 

을 난 그냥이 있는지 알고 싶어요 심지어 내 렌더링 방법을 사용하여 그것을 할 수 또는 내가 다른 방법으로 일을 집중해야합니까?

아마도 하나의 관련 질문입니다. 이 방법이 파이 게임에서 객체 (이미지)를 렌더링하는 올바른 방법입니까?

도움 주셔서 감사합니다.

+0

생명과 점수 만 렌더링하려는 경우 가장 간단한 해결책은 두 개의 텍스트 표면을 별도로 만들고 blit하는 것입니다. – skrx

+0

사실 그렇지만 Sprites없이 언급 한 것처럼 그렇게 할 수 있습니다. 그런 식으로하고 싶지는 않습니다. 프로그램/게임은 실제로 꽤 복잡하고 다른 방법으로 이런 식으로 렌더링하고 있습니다. 게다가 속도가 느려질 수도 있습니다. – mikro45

답변

0

먼저 문자열을 FONT.render으로 렌더링 한 다음 투명 서페이스를 만들고 별도의 텍스트 서페이스를 그 위에 블릿 처리 할 수 ​​있습니다. 투명 기본 이미지의 너비를 확인하려면 .get_width() 별도의 텍스트 표면을 사용하고 높이는 FONT.get_height()을 사용할 수 있습니다.

import pygame as pg 


pg.init() 
screen = pg.display.set_mode((640, 480)) 
clock = pg.time.Clock() 
FONT = pg.font.Font(None, 40) 
BLUE = pg.Color('dodgerblue1') 


class Score(pg.sprite.Sprite): 

    def __init__(self, pos): 
     super(Score, self).__init__() 
     self.lives = 3 
     self.score = 0 
     self.rect = pg.Rect(pos, (1, 1)) 
     self.update_image() 

    def update_image(self): 
     height = FONT.get_height() 
     # Put the rendered text surfaces into this list. 
     text_surfaces = [] 
     for txt in ('lives {}'.format(self.lives), 
        'score {}'.format(self.score)): 
      text_surfaces.append(FONT.render(txt, True, BLUE)) 
     # The width of the widest surface. 
     width = max(txt_surf.get_width() for txt_surf in text_surfaces) 

     # A transparent surface onto which we blit the text surfaces. 
     self.image = pg.Surface((width, height*2), pg.SRCALPHA) 
     for y, txt_surf in enumerate(text_surfaces): 
      self.image.blit(txt_surf, (0, y*height)) 
     # Get a new rect (if you maybe want to make the text clickable). 
     self.rect = self.image.get_rect(topleft=self.rect.topleft) 


def main(): 
    score = Score((100, 100)) 
    all_sprites = pg.sprite.Group(score) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.KEYDOWN: 
       if event.key == pg.K_s: 
        # Increment the score and update the image. 
        # It would be nicer to turn the score into a 
        # property and update the image automatically. 
        score.score += 1 
        score.update_image() 

     all_sprites.update() 
     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
+1

도움을 주셔서 대단히 감사합니다. 그것은 효과가 있었다. "Surface.blit (surface, rect)"를 사용할 수 있다는 것을 몰랐습니다. – mikro45