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

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

В методе 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))

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

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

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

Любая помощь приветствуется. Спасибо.


person Antillies    schedule 02.01.2013    source источник
comment
blit() конечные координаты относительно верхнего левого угла целевой поверхности. Что произойдет, если вы измените первый блит на цель (0, 0)?   -  person atomicinf    schedule 03.01.2013
comment
Вау, хороший звонок. Вы абсолютно правы - и мне очень неловко, что я этого не осознавал, ха-ха. Спасибо за вашу помощь.   -  person Antillies    schedule 03.01.2013


Ответы (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))

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

person atomicinf    schedule 02.01.2013