Pygame: спрайт меняется из-за направления движения - PullRequest
1 голос
/ 09 апреля 2009

Я только начал учиться использовать Pygame вчера. Я прочитал эту книгу, которая была очень полезной и следовала всем ее учебникам, примерам и прочему. Я хотел попробовать сделать действительно простую игру с боковым скроллером / платформером, но книга довольно быстро перешла в 3D-моделирование без инструкций, как сделать смену спрайтов для движения вверх-вниз влево и вправо и как циклически перемещаться между анимационными изображениями.

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

Может кто-нибудь дать мне немного знаний о том, как менять спрайты. Или пришлите мне учебник, который делает?

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

Любая помощь очень ценится.

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

Добавить: Это то, что я собрал до сих пор. http://animania1.ca/ShowFriends/dev/dirmove.rar будет ли возможность сделать так, чтобы направление / действие устанавливало столбец действия, и чтобы маленький код установки столбца также заставлял цикл повторяться в цикле для анимации? (или это будет грубое использование эффективности?)

Ответы [ 3 ]

1 голос
/ 09 апреля 2009

Вот глупый пример, который предупреждает между двумя первыми изображениями таблицы спрайтов при нажатии влево / вправо:

import pygame

quit = False
pygame.init()
display = pygame.display.set_mode((640,480))
sprite_sheet = pygame.image.load('sprite.bmp').convert()

# by default, display the first sprite
image_number = 0

while quit == False:
    event = pygame.event.poll()
    no_more_events = True if event == pygame.NOEVENT else False

    # handle events (update game state)
    while no_more_events == False:
        if event.type == pygame.QUIT:
            quit = True
            break
        elif event.type == pygame.NOEVENT:
            no_more_events = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                image_number = 0
            elif event.key == pygame.K_RIGHT:
                image_number = 1

        event = pygame.event.poll()

    if quit == False:
        # redraw the screen
        display.fill(pygame.Color('white'))
        area = pygame.Rect(image_number * 100, 0, 100, 150)
        display.blit(sprite_sheet, (0,0), area)
        pygame.display.flip()

Я никогда раньше не использовал Pygame, так что, возможно, этот код не будет взят за пример. Я надеюсь, что это показывает основы.

Для большей полноты я должен подождать некоторое время перед обновлением, например, контролировать, что я обновляю только 60 раз в секунду.

Также было бы удобно написать класс спрайтов, который упростил бы вашу работу. Вы передадите размер рамки спрайта в конструкторе, и у вас будут такие методы, как update() и draw(), которые автоматически выполнят работу по выбору следующего кадра, блике спрайта и т. Д.

Pygame, кажется, предоставляет базовый класс для этой цели: текст ссылки .

1 голос
/ 19 ноября 2009

чувак, единственное, что тебе нужно сделать, это безоговорочно

импорт pygame и всего остального необходимого введите код и прочее .......... тогда когда дело доходит до создания spri

class .your class nam here. (pygame.sprite.Sprite):
     def __init__(self):
          pygame.sprite.Sprite.init(self)
          self.image=pygame.image.load(your image and path)
          self.rect=self.image.get_rect()
          x=0
          y=0

          # any thing else is what you want like posistion and other variables

     def update(self):
          self.rect.move_ip((x,y))

и это все !!!! но это еще не конец. если вы сделаете это, вы только что сделали спрайт чтобы переместить его нужно

0 голосов
/ 09 апреля 2009

Я не знаю много о Pygame, но я использовал SDL (на котором основан Pygame).

Если вы используете Surface.blit(): текст ссылки

Вы можете использовать необязательный аргумент area, чтобы выбрать, какую часть поверхности рисовать. Поэтому, если вы поместите все изображения, которые являются частью анимации, в один файл, вы можете выбрать, какое изображение будет отображаться. Это называется "отсечение".

Полагаю, у вас будет игровой цикл, который будет обновлять состояние игры (при необходимости изменяя текущее изображение спрайта), а затем рисовать спрайтов, используя их состояние.

...