четверг, 26 декабря 2013 г.

Первый опыт. Начало работы.


Решил начать серию статей о создании своей игры "первого опыта" - это первая игра, создаваемая мною, с целью получения опыта в программировании. Это будет небольшой 2D платформер в стиле пиксель-арта с минимальной игровой механикой и, возможно, минимальными зачатками РПГ элементов.

Содержание
  1. Необходимо знать
  2. Что имеем?
  3. ToDo

Необходимо знать

Для начала работы нам необходимо знать следующее:

  • язык программирования 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 смотреть здесь):
  • разработать класс существа, включающий в себя
    • координаты расположения объекта
    • базовые игровые характеристики
    • загрузка и хранение спрайта существа
<< Наверх