Давайте пограємо зі змією/Авіаудар

Матеріал з Вікіпідручника

А тепер треба написати якусь маленьку, та простеньку гру, просто щоб визначити наші можливості. І взагалі все у світі починається з малого. Програмування з привітання зі світом. Я придумав одну, про яку розкажу нижче, ви ж можете написати якусь іншу. Просто зручніше пояснювати все на прикладі, а писати простенькі арканоїди та змійки трохи набридає.

Авіаудар[ред.]

Бомбардувальник B-2 Spirit (Stealth)
155-мм гаубиця M198
Суть гри буде проста. В лівому нижньому куті екрану буде стояти гармата. Чи катюша. Чи кулемет. Гармата може вистрілювати снаряди з однаковою швидкістю під різними кутами до горизонту. Користувач регулює кут, та дає команду вогонь. А справа наліво летять літаки, які хочуть скинути на вас бомбу. Коли бомба попадає в гармату — ви гинете. Завдання — збити всі літаки та вижити.

Гра буде двовимірною, а снаряди та бомби — літатимуть по параболах. Одним словом — шкільний курс фізики, рух тіла кинутого під кутом до горизонту.

Знайомство з Pygame[ред.]

Гру придумали, пора нарешті сідати за код.

Щоб переконатись що ми все правильно встановили, можна використати невеличку програму:

#coding=utf8
""" Перша гра з Pygame """

import pygame #Завантажуємо модуль pygame
from pygame.locals import * #Завантажуємо корисні константи

pygame.init() #Запускаємо движок

print dir() # Надрукуємо те що завантажили.

Вона поки що ніяких вражаючих результатів не дає, просто друкує всі ідентифікатори локального простору імен. Навіть не з'являється вікно для виводу графіки.

Квадрат Малевича[ред.]

Другим кроком логічно було б зробити програмку, яка малює нам шедевр. Наприклад квадрат Малевича:


#coding=utf8
""" Перша гра з Pygame """

import pygame
from pygame.locals import *

class palette(): #Палітра кольорів
	black=(0,0,0) #Запис кольору відповідно до моделі RGB

resolution=(300,300) # Роздільна здатність (розмір вікна)

pygame.init() # Підвантажуємо все що треба

screen=pygame.display.set_mode(resolution,0,32) # Створюємо наше вікно
screen.fill(palette.black) # Та перефарбовуємо його в чорне

pygame.display.set_caption("Квадрат Малевича") # Підписуємо роботу

pygame.display.update() # І робимо так, щоб всі зміни відобразились

while True: #Нескінченний цикл роботи програми
	for event in pygame.event.get(): #Обробляємо події які можуть трапитись
		if event.type == pygame.locals.QUIT: # Якщо трапилась подія на зразок клацання по кнопці закрити
			pygame.quit() # Виходимо

І хоча програмка зовсім нічого не робить, але такий каркас використовують геть усі ігри:

  1. Ініціалізація
  2. Ігровий цикл:
    1. Отримати ввід від користувача
    2. Обробити його.
    3. Вивести отриманий результат (кадр)

Правда в нашому випадку всі результати виводяться під час ініціалізації, а цикл тільки очікує сигналу про завершення.

В лістингу вище напевне варто зазначити функцію[1]

screen=pygame.display.set_mode(resolution,0)

Першим аргументом передається необхідна роздільна здатність в вигляді кортежу з двох цілих чисел. Перше число - ширина в пікселях, друге - висота. Якщо передати (0,0), то роздільна здатність буде така ж як і була до того. Якщо нуль буде в висоті, чи в ширині, то не зміниться відповідно тільки висота чи ширина, але краще таким не зловживати.

Другим параметром є тип необхідного нам дисплею. Можна обирати між такими типами:

   pygame.FULLSCREEN    #Повноекранний режим (інакше віконний)
   pygame.DOUBLEBUF     #Подвійна буферизація (рекомендовано використовувати разом з наступними двома)
   pygame.HWSURFACE     #апаратне прискорення (тільки з  FULLSCREEN)
   pygame.OPENGL        #створити дисплей, що доступний для малювання з допомогою OpenGL
   pygame.RESIZABLE     #створене вікно дозволяє користувачу змінювати свій розмір
   pygame.NOFRAME       #вікно не буде мати рамки та заголовка

Ці типи можна комбінувати за допомогою операції побітового або: "|". Якщо ніяка з опцій не є необхідною, передають нуль, що ми й зробили.

І останнім аргументом є глибина кольору. Його рекомендують не передавати, система сама обирає найкращу та найшвидшу для неї. Якщо раптом вона не підтримує тридцятидвохрозрядну гамму, PyGame самостійно виправить палітру.

Правда, яким би геніальним не був цей чорний квадрат, але він нудний до смерті. Хочеться намалювати щось цікавіше. Наприклад

Пейзаж[ред.]

Що стане полем бою.

Чому я обрав такий пейзаж? Ну, по перше, мені подобається. Осінь, виноградники, красиво (це до речі те саме місце, що на фотографії класичної шпалери Windows XP). І, обороняти виноградники — доблесно! Останнім аргументом може вважатись те, що використання цієї фотографії в власних цілях законне. Якщо звісно похідні роботи поширюються під подібною ліцензією. Можете пошукати іншу картинку, а якщо зумієте намалювати свою — взагалі молодці.

Тепер напишемо ще одну статичну версію програми, яка малює оцю картинку. Для цього її треба зберегти в теці з нашою грою, назвавши, наприклад field.jpg Вона може виглядати, наприклад так:

#coding=utf8
""" Перша гра з Pygame """

import pygame
from pygame.locals import *

class palette(): #Палітра кольорів
	black=(0,0,0) #Запис кольору відповідно до моделі RGB

resolution=(800,600) # Роздільна здатність (розмір вікна)

pygame.init() # Підвантажуємо все що треба

background=pygame.image.load("field.jpg")  #Завантажуємо фонову картинку

screen=pygame.display.set_mode(resolution,0,32) # Створюємо наше вікно

pygame.display.set_caption("Квадрат Малевича") # Підписуємо роботу

screen.blit(background,(0,0)) # Та малюємо її на екрані в лівому верхньому куті.
pygame.display.update() # І робимо так, щоб всі зміни відобразились

def mainloop():
	while True: #Нескінченний цикл роботи програми
		for event in pygame.event.get(): #Обробляємо події які можуть трапитись
			if event.type == pygame.locals.QUIT: # Якщо трапилась подія на зразок клацання по кнопці закрити
				pygame.quit() # Очищуємо всі ресурси
				return  # Та виходимо

mainloop()

А тепер пора спробувати намалювати щось що рухається. Наприклад

Літаки[ред.]

Файл:F-14A.PNG

Так я автор цього опису таки не вміє малювати, він попросив Google пошукати щось вже готове за нього. І знайшлось:

Цілу купу інших різних літачків можна знайти тут. А поки що зробимо так, щоб цей літачок пролетів над нашим полем справа наліво.

  1. http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode

Прикладний курс фізики та аналітичної геометрії[ред.]

Для програмування цієї гри, окрім знання програмування доведеться розібратись з деякою простою математикою, та фізикою...

далі буде...