2009-04-09 2 views
1

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

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

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

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

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

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

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

+0

Прошло некоторое время с тех пор, как я использовал pygame, но мне повезло с этим учебником: [Hulk want animation!] (http: // choosetheforce. blogspot.com/2008/04/third-pygame-hulk-want-animation.html) и этот класс: [animsprite.py] (http://static.raumkraut.net/libs/animsprite.py) Из любопытства, какую книгу вы используете? В конце концов я сдался из-за нехватки времени и хороших материалов. –

+0

Thats sorta funny. Я обнаружил, что тоже экспериментирует. Я попытался заставить его использовать вверх, вниз, влево, вправо, чтобы двигаться, но я так и не получил. Книга: McGugan - Начало разработки игр с Python и Pygame Я сделал это с ним: http://animania1.ca/ShowFriends/antgame.rar включая изображения – RamonLion

ответ

1

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

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 раньше, поэтому, может быть, этот код shoudln't действительно быть приняты В качестве примера. Я надеюсь, что это показывает основы.

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

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

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

+0

фантастический. что отлично работало. Теперь. Я думал. если это так. Будет ли у меня это, так что он в основном работает как система типа сетки. левое и правое на листе - это конкретное действие, а затем оно зацикливает определенное количество кадров вниз? Я вручную задал количество кадров для каждого действия. – RamonLion

+0

Извините, но я не понял ваш вопрос. –

+0

ну код просто говорит, что каждое изменение числа - это то, как много пробелов пробела. и поэтому в моем коде (связанный выше) у меня есть это для запуска и фреймов действий. но они не анимированы. был бы способ иметь другой код цикла вниз после того, как номер спрайта был установлен. ... – RamonLion

0

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

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

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

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

+0

так что вы хотите сказать, что я хотел бы использовать 1 изображение с весь лист спрайта и пусть он бласт один раздел спрайта над каждым тиком? Как выглядел бы код, если спрайт 150p высотой и 100px шириной? – RamonLion

0

чувак единственное, что вам нужно сделать, это Offcourse

импорт 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)) 

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

Смежные вопросы