Решил начать серию статей о создании своей игры "первого опыта" - это первая игра, создаваемая мною, с целью получения опыта в программировании. Это будет небольшой 2D платформер в стиле пиксель-арта с минимальной игровой механикой и, возможно, минимальными зачатками РПГ элементов.
| Содержание |
Необходимо знать
Для начала работы нам необходимо знать следующее:
- язык программирования Python. Лично я использую python 3.3. Если вы совсем мало знаете о программировании, то советую начать с этого - М. Лутц "Изучаем Python" (подробнее здесь)
- мультимедийный пакет PyGame. Я буду пользоваться версией 1.9.2a0, но думаю если у вас версия пакета не ниже 1.8.1 - то разницы в коде особой быть не должно. (подробнее здесь)
- Какой либо IDE для написания исходного кода. Можно конечно использовать IDLE, входящий в состав стандартной сборки python, но я не считаю его пригодным для больших программ, и использую, если необходимо выполнить не более пары-тройки команд в интерактивном режиме. Сам пользуюсь ERIC5 IDE, который имеет мультиоконный интерфейс, умеет работать с проектами, подсвечивает синтаксис (многих языков, не только python), имеет встроенное окно интерпритатора и очень неплохой дебаггер. А еще он бесплатен! (ведь это чуть ли не самое главное, не правда ли? :) ) Однако работа с ним требует тренировки, опыта и навыков. (подробнее здесь)
- некоторые навыки в рисовании, либо набор готовых спрайтов.
Что имеем?
К началу работ я уже изучил основы языка python версии 3.х и имею опыт в некотором частном программировании около года. В основном это небольшие программки для личного пользования. PyGame я изучал по статьям т-ща noTformaT и в результате получил некую техническую альфа-версию движка игры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | # coding: utf-8
import os, sys
import pygame
from pygame.locals import *
from math import modf
work_way = (os.path.dirname(__file__))
os.chdir(work_way)
if work_way not in sys.path:
sys.path.insert (0, work_way)
from const import *
pygame.init ()
mainloop = True
# initial screen
screen_size = (640, 480)
screen = pygame.display.set_mode (screen_size, 0, 32)
pygame.display.set_caption('PyGame Project')
# initial clock
clock = pygame.time.Clock()
milli = 0.0
sec = 0.0
# initial data
newSurf = pygame.Surface(screen_size)
print (os.path.join(work_way,'images','hero.png'))
hero = pygame.image.load(r'C:\Users\CaufMAN\YandexDisk\Programming\pygame_'+
r'project\image\hero.png')
osn = 32
shag_osn = 1
pers = Rect (osn*3, osn*3, osn, osn)
pers_color = COLOR_GENERAL
pers_speed = osn*6
new_pos = (pers.x, pers.y)
#dest = Rect (0, 0, 30, 30)
dm = 0
while mainloop:
for event in pygame.event.get():
# "if-else" events
if event.type == KEYDOWN:
if event.key == K_w:
pers.move_ip (0, -osn)
new_pos = (pers.x, pers.y)
if event.type == KEYDOWN:
if event.key == K_s:
pers.move_ip (0, osn)
new_pos = (pers.x, pers.y)
if event.type == KEYDOWN:
if event.key == K_a:
pers.move_ip (-osn, 0)
new_pos = (pers.x, pers.y)
if event.type == KEYDOWN:
if event.key == K_d:
pers.move_ip (osn, 0)
new_pos = (pers.x, pers.y)
if event.type == MOUSEBUTTONDOWN:
if event.button == 1:
new_pos = (int((modf(event.pos[0]/osn))[1]*osn),
int((modf(event.pos[1]/osn))[1]*osn))
print (new_pos, new_pos[0]/osn, new_pos[1]/osn)
if event.type == QUIT:
mainloop = False
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
mainloop = False
# - calc clock
milli = clock.tick(60)
sec = milli / 1000.0
# - initializ screen
screen.fill(COLOR_BG)
# - create frame
dm = pers_speed*sec
if pers.x != new_pos[0]:
if (new_pos[0]-pers.x)>0:
pers.move_ip(dm, 0)
if (new_pos[0]-pers.x)<0:
pers.move_ip(-dm, 0)
if pers.y != new_pos[1]:
if (new_pos[1]-pers.y)>0:
pers.move_ip(0, dm)
if (new_pos[1]-pers.y)<0:
pers.move_ip(0, -dm)
pygame.draw.rect(screen, COLOR_GENERAL, pers)
newSurf.blit(hero, (pers.x, pers.y))
pygame.display.update()
pygame.quit()
|
На данный момент этот код выдает лишь экран с бегающим квадратиком в точку клика. Но что нам еще надо на первый порах? :)
Стоит отметить, что в данном коде заметна попытка привязать к активному объекту спрайт героя (строки 32 и 90)... Но именно попытка. Так как ничего здравого не получилось, и для меня на данный момент не стояло главной задачей реализация графической составляющей.
Так же замечу, что здесь цветовые константы с префиксом COLOR_ прописаны мною отдельно в модуле const.py, который импортируется в строке 14 модуля game.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # coding: utf-8
'''
Инициализация констант
'''
# Цвета стандартные (R, G, B)
COLOR_BLACK = (0 , 0 , 0 )
COLOR_WHITE = (255 , 255 , 255 )
COLOR_RED = (255 , 0 , 0 )
COLOR_BLUE = (0 , 0 , 255 )
COLOR_GREEN = (0 , 255 , 0 )
COLOR_YELLOW = (255 , 255 , 0 )
COLOR_PURPLE = (255 , 0 , 255 )
COLOR_GREY = (128 , 128 , 128 )
# Локальные цветовые константы
COLOR_BG = (200 , 220 , 200 ) # светлый хакки
COLOR_GENERAL = (50 , 70 , 50 ) # темный хакки
|
<< Наверх
ToDo
Собственно мои ближайшие планы в отношении данного проекта (актуальный ToDo смотреть здесь):
- разработать класс существа, включающий в себя
- координаты расположения объекта
- базовые игровые характеристики
- загрузка и хранение спрайта существа