Сбой окна Pygame и проблема спрайт-листа - PullRequest
1 голос
/ 16 марта 2019

Итак, я тестировал этот код, нашел учебник по добавлению таблиц спрайтов в pygame и решил попробовать его: https://www.spriters -resource.com / 3ds / dragonballzextremebutoden / sheet / 67257/

Я сделал, как видео сказал, и подсчитал столбцы и строки, это мой код:

pygame.init()
CLOCK = pygame.time.Clock()
DS = pygame.display.set_mode((W, H))
FPS = 60

class spritesheet:
    def __init__(self, filename, cols, rows):
        self.sheet = pygame.image.load(filename).convert_alpha()

        self.cols = cols
        self.rows = rows
        self.totalCellCount = cols * rows

        self.rect = self.sheet.get_rect()
        w = self.cellWidth = self.rect.width / cols
        h = self.cellHeight = self.rect.height / rows
        hw, hh = self.cellCenter = (w / 2, h / 2)

        self.cells = list([(index % cols * w, index / cols * h, w, h) for index in range(self.totalCellCount)])
        self.handle = list([
            (0,0), (-hw, 0), (-w, 0),
            (0, -hh), (-hw, -hh), (-w, -hh),
            (0, -h), (-hw, -h), (-w, -h),])

    def draw(self, surface, cellIndex, x, y, handle = 0):
        surface.blit(self.sheet, 
        (x + self.handle[handle][0], y + self.handle[handle][1],
         self.cells[cellIndex][2], self.cells[cellIndex][3]))


s = spritesheet('Number18.png', 58, 6)

CENTER_HANDLE = 6

Index = 0

#mainloop
run = True
while run:

    s.draw(DS, Index % s.totalCellCount, HW, HH, CENTER_HANDLE)
    Index +=1

    #pygame.draw.circle(DS, WHITE, (HW, HW), 20, 10)
    DS.blit(bg,(0,0))

    pygame.display.update()
    CLOCK.tick(FPS)
    DS.fill(BLACK)

Строка s = spritesheet("Number18.png", 58, 6) имеет номера 58,6 , которые в основном представляют собой количество строк и столбцов, которые я посчитал в этом блоке spritesheet, но у меня возникают проблемы, такие как окно pygame с надписью «не отвечает», изображение не загружается, и я не могу переместитьэкран пигмея.

1 Ответ

1 голос
/ 16 марта 2019

У меня возникают проблемы, такие как окно pygame на "не отвечает", [...]

Первое, что вам нужно сделать, это добавить событие enloop to main loop приложения.
pygame.event удаляет ожидающее сообщение о событии из очереди и возвращает его.По крайней мере, вы должны обработать событие QUIT.Установите значение управляющей переменной для основного цикла False:

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

Плитки на листе спрайтов не имеют одинаковый размер.Ограничьте список cells некоторыми частями листа одинакового размера.
Попробуйте выполнить следующее:

class spritesheet:
    def __init__(self, filename, py, tw, th, tiles):
        self.sheet = pygame.image.load(filename).convert_alpha()

        self.py = py
        self.tw = tw
        self.th = th
        self.totalCellCount = tiles

        self.rect = self.sheet.get_rect()
        w, h = tw, th
        hw, hh = self.cellCenter = (w / 2, h / 2)

        self.cells = [(1+i*tw, self.py, tw-1, th-1) for i in range(tiles)]
        self.handle = list([
            (0,0), (-hw, 0), (-w, 0),
            (0, -hh), (-hw, -hh), (-w, -hh),
            (0, -h), (-hw, -h), (-w, -h),])
s = spritesheet('Number18.png', 1085, 80, 134, 8)

[...] изображение делаетне загружается [...]

Убедитесь, что изображение находится в рабочем каталоге приложения.
Если вы хотите нарисовать вспомогательное изображение таблицы, то вы 've для установки параметра area (3-й параметр) pygame.Surface.blit в область прямоугольника подизображения:

def draw(self, surface, cellIndex, x, y, handle = 0):
    hdl = self.handle[handle]
    surface.blit(self.sheet, (x + hdl[0], y + hdl[1]), area=self.cells[cellIndex])

[...] Я не могу двигаться [...]

Вы должны изменить положение спрайта.Обработка события KEYDOWN.Сохраните положение спрайта (px, py).Изменение положения при нажатии клавиши K_UP, K_DOWN, K_LEFT или K_RIGHT:

run = True
px, py, speed = HW, HH, 10
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                py -= speed
            elif event.key == pygame.K_DOWN:
                py += speed
            elif event.key == pygame.K_LEFT:
                px -= speed
            elif event.key == pygame.K_RIGHT:
                px += speed
...