2014-02-16 3 views
0

я создаю класс, который должен вернуть мне поверхность квадрата и текста, как показано ниже:Создание новой поверхности с заполненной площади и текстовой строки в Pygame

surface

площади (в настоящее время) показывает цвет пользователя для игры, а текст - имя игрока. Я буду blit эти поверхности на экране после вычисления позиций из массива подобных поверхностей.

Я могу легко сгенерировать поверхность text. Я не хочу пропускать поверхность экрана в класс для pygame.draw.rect; а, наоборот, создать прямоугольник отдельно; слейте прямоугольник и текстовую поверхность, а затем верните эту сгруппированную поверхность. Мое текущее определение класса просто:

from pygame.locals import * 
from pygame import font as pyfont, event as pyevent, display as pydisplay 
from sys import exit 

class Info: 
    GRAY = (214, 171, 127) 
    def __init__(self, name, colour): 
     pyfont.init() 
     self.name = name 
     self.colour = colour 
     self.font = pyfont.Font(None, 36) 

    def generate(self): 
     text = self.font.render(self.name, True, self.GRAY) 
     # The rectangle surface to be drawn here 
     return text 
+0

@jonrsharpe Ничего. Я могу создать прямоугольники, если передать поверхность экрана в качестве параметра в класс, но, как я уже упоминал в вопросе; Я не хочу этого делать. Я хочу оставить все позиционные вычисления позже. Я также рассмотрел функцию ['suburface'] (http://www.pygame.org/docs/ref/surface.html#pygame.Surface.subsurface); но опять же, я должен был бы вычислить свои позиции позиции перед инициализацией класса. – hjpotter92

ответ

1

После немного большего количества чтения Pygame документации, я обновил класс, чтобы быть что-то вроде:

import pygame 
from pygame.locals import * 
from pygame import font as pyfont, event as pyevent, display as pydisplay 
from sys import exit 

class Info: 
    GRAY = (214, 171, 127) 
    def __init__(self, surface, name, colour): 
     pyfont.init() 
     self.surface = surface 
     self.name = name 
     self.colour = colour 
     self.font = pyfont.Font(None, 36) 

    def generate(self): 
     t = pygame.Rect(5, 5, 32, 32) 
     pygame.draw.rect(self.surface, self.colour, t, 0) 
     text = self.font.render(self.name, True, self.GRAY) 
     return self.surface.blit(text, (50, 5)) 

и его можно использовать следующим образом:

if __name__ == "__main__": 
    x = pygame.Rect(50, 50, 250, 100) 
    screen = pydisplay.set_mode((1024, 576)) 
    pydisplay.set_caption("Title goes") 
    srf = screen.subsurface(x) 
    x = Info(srf, "hjpotter92", (230, 150, 51)) 
    c = pygame.time.Clock() 
    screen.fill((255, 255, 255)) 
    while True: 
     pydisplay.update() 
     c.tick(1) 
     print x.generate() 
     for event in pyevent.get(): 
      if event.type == QUIT: 
       exit(0) 
      elif event.type == KEYDOWN: 
       if event.key == K_ESCAPE: 
        exit(0) 

Но это грязный/фол решение проблемы, и создает что-то вроде:

current-output

Я открыт для изменения текущего дизайна. В противном случае мне пришлось бы заранее рассчитывать позиции для последующих экземпляров класса Info.

 Смежные вопросы

  • Нет связанных вопросов^_^