Пример отладки кода Pygame?
Простой вопрос: почему этот первый код работает, но на первый взгляд идентичный второй код зависает, когда появляется окно pygame?
# 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 ответ
Я никогда не работал с livewires, но в играх вам обычно нужен - более или менее - бесконечный игровой цикл.
Смысл игрового цикла в том, что вы всегда хотите знать, где находится мышь или какие клавиши нажимаются, а не только один раз! Так что вы должны спросить Where is the mouse?
вновь и вновь. И чтобы достичь этого, вы используете цикл, который проверяет все, что вы хотите, каждый раз, когда он выполняется.
В первом примере игровой цикл является функцией main
, Поток приложения выглядит так:
Импорт необходимых библиотек
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
Запустите mainloop. Вызов этого метода говорит:
Run me
( function
main
)
over and over!
games.screen.mainloop()
Позвони на главную впервые
main()
Во втором примере нет цикла игры. Ход приложения (более плотно упакованный) выглядит следующим образом:
Импортировать библиотеки, инициализировать игровой экран, объявить спрайт
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
Настройте фон экрана игры и добавьте спрайт
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)
Деактивировать курсор мыши, включить события
games.mouse.is_visible = False myscr.event_grab = True
Запустите mainloop. Вызов этого метода говорит:
Run me
( function
undefined
)
over and over!
myscr.mainloop()
И вот точка преткновения! Вы не можете вызвать код, который находится в корне Python-файла! mainloop
Функция не знает, где вернуться или с чего начать. Звонок теряется, ваша программа зависает. Экран игры не может быть обновлен, потому что ничто не говорит ему, как он должен обновляться.
Вывод: у вас должна быть функция для вашего игрового цикла!