Pygame создание поверхностей

Код:

#!/usr/bin/python

import pygame, time, sys, random, os
from pygame.locals import *
from time import gmtime, strftime

pygame.init()

w = 640
h = 400

screen = pygame.display.set_mode((w, h),RESIZABLE)
clock = pygame.time.Clock()
x = y = 100

def starting():
    basicfont = pygame.font.SysFont(None, 48)
    text = basicfont.render('Starting...', True, (255, 255, 255), (0, 0, 255))
    textrect = text.get_rect()
    textrect.centerx = screen.get_rect().centerx
    textrect.centery = screen.get_rect().centery
    screen.fill((0, 0, 255))
    screen.blit(text, textrect)

def taskbar():
    basicfont = pygame.font.SysFont(None, 24)
    taskbarrect = pygame.Rect((0, int(h-40)), (int(w), int(h)))
    text = basicfont.render(strftime("%Y-%m-%d", gmtime()), True, (0, 0, 0))
    text2 = basicfont.render(strftime("%H:%M:%S", gmtime()), True, (0, 0, 0))
    taskbarrect.blit(text, (w - 100, h - 37))
    taskbarrect.blit(text2, (w - 100, h - 17))
    pygame.display.update()

starting()
screen.fill((255,255,255))

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()  
        elif event.type==VIDEORESIZE:
            w = event.dict['size'][0]
            h = event.dict['size'][1]
            screen=pygame.display.set_mode(event.dict['size'],RESIZABLE)
    taskbar()

Поскольку я хочу, чтобы мой код работал быстрее, я хочу создавать поверхности и блики поверх них, чтобы я мог делать pygame.display.update(taskbarrect) и ускорить мой код. Однако я не знаю, как создать несколько поверхностей. я пытался taskbarrect=(xcoordinate, ycoordinate, width, length) затем стряхивая изображение или текст или что-то еще, но пытаясь это говорит tuple object has no attribute blit, Попытка метода в коде (предложенного @elegent) дает 'pygame.Rect' object has no attribute 'blit',

Что я делаю неправильно?

1 ответ

Pygame использует поверхности для представления любой формы изображения. Это может быть

  • ваш главный экран Surface, который возвращается pygame.display.set_mode() функция

    myDisplay = pygame.display.set_mode((500, 300))
    
  • или созданный объект pygame.Surface учебный класс:

    #create a new Surface
    myNewSurface = Surface((500, 300))
    
    #change its background color
    myNewSurface.fill((55,155,255))
    
    #blit myNewSurface onto the main screen at the position (0, 0)
    myDisplay.blit(myNewSurface, (0, 0))
    
    #update the screen to display the changes
    display.update() #or  display.flip()
    

Pygame-х display.update() есть метод, который позволяет обновлять только некоторые части экрана, передавая один объект или список pygame.Rect возражает против этого. Поэтому мы могли бы также позвонить:

myUpdateRect= pygame.Rect((500, 300), (0, 0))
display.update(myUpdateRect)

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

Это позволяет вам передавать эту информацию update() функция, поэтому Pygame обновляет только пиксели только что нарисованных фигур:

myDisplay = pygame.display.set_mode((500, 300))

myRect= pygame.Rect((100, 200), (50, 100))
pygame.display.update(pygame.draw.rect(myDisplay, (55, 155, 255), myRect))

Обновить:

def taskbar():
    basicfont = pygame.font.SysFont(None, 24)

    text = basicfont.render(strftime("%Y-%m-%d", gmtime()), True, (0, 0, 0))
    text2 = basicfont.render(strftime("%H:%M:%S", gmtime()), True, (0, 0, 0))

    screen.fill((55, 155, 255))

    screen.blit(text, (w - 100, h - 37))
    screen.blit(text2, (w - 100, h - 17))

    pygame.display.update()

Надеюсь это поможет:)

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