Механика поверхности Pygame

В настоящее время я пишу некоторый код GUI для небольшого проекта, над которым я работаю, и я пришел к тому, что мне нужно реализовать полосы прокрутки и связанные с ними контейнеры. Для простоты выполнения я хотел бы иметь возможность рисовать все элементы внутри "поля прокрутки" (окна, на которое будет воздействовать полоса прокрутки) на отдельной поверхности от моей основной поверхности отображения. Затем отдельная поверхность будет обрезана по мере необходимости и затем нарисована на поверхности отображения в цикле рендеринга. У меня проблемы с тем, чтобы заставить это работать, как бы то ни было.

в draw() метод моего ScrollBox класс, у меня есть следующий код.

def draw(self):
    self.subSurface.blit(self.image, (x, y)) 
    #subSurface is, naturally, a Surface, and image is a pygame.Image; x and y are whatever
    self.displaySurface.blit(self.subSurface, (x,y))

Как и со всеми рисованными элементами GUI в моем коде, draw() вызывается каждый проход через основной цикл рендеринга. Приведенный выше код дает мне заполненный по умолчанию черный Rect и self.image не отображается ни в каком качестве. Я попытался заменить первую строку на

pygame.draw.rect(self.subSurface, color, rect)

но это дало те же результаты. Из моего прочтения в других библиотеках Pygame GUI кажется, что то, что я хочу сделать, возможно, но я не думаю, что выполняю это должным образом. Как мне прикрепить другие источники / поверхности subSurface а затем есть subSurface быть нарисованным (с прикрепленными источниками) displaySurface?

Любая помощь приветствуется. Благодарю.

1 ответ

Решение

Для людей, посещающих этот вопрос в будущем:

Помните, что dest аргумент в пользу Surface.blit() относительно верхнего левого угла поверхности назначения. Поэтому, если вы собираете изображение на поверхности, не забудьте использовать координаты относительно верхнего левого угла объекта, который вы собираете, а не абсолютные координаты отображения.

Итак, чтобы собрать полосу прокрутки и нарисовать ее где-нибудь:

class ScrollBar:
    # ... code ...
    def render(self, display, x, y):
        self.subSurface.blit(self.handle_image, (0, self.handle_pos))
        self.subSurface.blit(self.upbtn_image, (0, 0))
        self.subSurface.blit(self.dnbtn_image, (0, self.height - self.btn_height))
        # ... other rendering operations
        display.blit(self.subSurface, (x, y))

Настройте все числа и имена переменных по вкусу, но вы поняли идею. Обратите внимание, что все элементы полосы прокрутки расположены в "локальных" полосах прокрутки, при этом только последний блик на поверхности дисплея расположен в координатах экрана / приложения.

Другие вопросы по тегам