Пример отладки кода Pygame? - PullRequest
2 голосов
/ 24 июня 2011

Простой вопрос: почему этот первый код работает, но, по-видимому, идентичный второй код зависает, когда появляется окно с игрой?

# Moving Pan
# Demonstrates mouse input

from livewires import games

games.init(screen_width = 640, screen_height = 480, fps = 50)

class Pan(games.Sprite):
    """ A pan controlled by the mouse. """
    def update(self):
        """ Move to mouse coordinates. """
        self.x = games.mouse.x
        self.y = games.mouse.y

def main():
    wall_image = games.load_image("wall.jpg", transparent = False)
    games.screen.background = wall_image

    pan_image = games.load_image("pan.bmp")
    the_pan = Pan(image = pan_image,
                  x = games.mouse.x,
                  y = games.mouse.y)
    games.screen.add(the_pan)

    games.mouse.is_visible = False

    games.screen.event_grab = True

    games.screen.mainloop()

# kick it off!
main()

Неисправная секунда:

from livewires import games,color
games.init (screen_width = 640, screen_height = 480, fps = 50)

#Creating a moving object tied to the cursor. This includes one method with two
#lines of code.
class Pan (games.Sprite):
    def moved (self):
    #Receives mouse position
        self.x = games.mouse.x
    #Changes mouse position to new x,y values.
        self.y = games.mouse.y

#The Main
myscr = games.screen
myscr.set_background (games.load_image ("wall.jpg", transparent = False))
pan_image = games.load_image ("pan.bmp")
le_pan = Pan (image = pan_image,
              x = games.mouse.x,
              y = games.mouse.y)

games.mouse.is_visible = False
myscr.add (le_pan)
myscr.event_grab = True
myscr.mainloop()

1 Ответ

2 голосов
/ 24 июня 2011

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

Смысл игрового цикла в том, что вы всегда хотите знать, где находится мышь или какие клавиши нажимаются, а не только один раз! Поэтому вы должны спрашивать Where is the mouse? снова и снова. И чтобы достичь этого, вы используете цикл , который проверяет все, что вы хотите, каждый раз, когда он выполняется.

В первом примере игровым циклом является функция main. Поток приложения выглядит так:

  1. Импорт необходимых библиотек

    from livewires import games
    
  2. Инициализация игрового экрана

    games.init(screen_width = 640, screen_height = 480, fps = 50)
    
  3. Объявить спрайт, который может отображаться на экране

    class Pan(games.Sprite):
        """ A pan controlled by the mouse. """
        def update(self):
            """ Move to mouse coordinates. """
            self.x = games.mouse.x
            self.y = games.mouse.y
    
  4. Объявите основной метод и настройте фон экрана игры

    def main():
        wall_image = games.load_image("wall.jpg", transparent = False)
        games.screen.background = wall_image
    
  5. Добавьте указанный выше спрайт на экран и переместите его в положение курсора мыши

        pan_image = games.load_image("pan.bmp")
        the_pan = Pan(image = pan_image,
                      x = games.mouse.x,
                      y = games.mouse.y)
        games.screen.add(the_pan)
    
  6. Сделать курсор мыши невидимым и активировать события

        games.mouse.is_visible = False
        games.screen.event_grab = True
    
  7. Запуск mainloop . Вызов этого метода говорит: Run me( functionmain)over and over!

        games.screen.mainloop()
    
  8. Вызовите главный впервые

    main()
    

Во втором примере нет цикла игры. Ход приложения (более плотный) выглядит так:

  1. Импорт библиотек, инициализация игрового экрана, объявление спрайта

    from livewires import games,color
    games.init (screen_width = 640, screen_height = 480, fps = 50)
    
    class Pan (games.Sprite):
        def moved (self):
            self.x = games.mouse.x
            self.y = games.mouse.y
    
  2. Установить фон экрана игры и добавить спрайт

    myscr = games.screen
    myscr.set_background (games.load_image ("wall.jpg", transparent = False))
    pan_image = games.load_image ("pan.bmp")
    le_pan = Pan (image = pan_image,
                  x = games.mouse.x,
                  y = games.mouse.y)
    myscr.add(le_pan)
    
  3. Отключить курсор мыши, включить события

    games.mouse.is_visible = False
    myscr.event_grab = True
    
  4. Запуск mainloop . Вызов этого метода говорит: Run me( functionundefined)over and over!

    myscr.mainloop()
    

И вот точка преткновения! Вы не можете вызвать код, который находится в корне Python-файла! Функция mainloop не знает, где вернуться или с чего начать. Звонок теряется, ваша программа зависает. Экран игры не может быть обновлен, потому что ничто не говорит ему, как он должен обновляться.

Вывод: Вы должны иметь функцию для вашего игрового цикла!

...