Есть у меня идея, на мой взгляд, хорошая. Но, как справедливо заметил товарищ Сиверс, идеи ничего не стоят без реализации. Идея довольно сложная с точки зрения программирования, и я пока ещё ничего сложнее 500 строк кода не писал, но всё случается в первый раз. На данном этапе я занимаюсь (громко сказано) разработкой архитектуры (ещё громче сказано) программы: разбиваю основную задачу на подзадачи и составляю график выполнения работ. Вот тут-то и начинаются проблемы. Если с разбиением я худо-бедно справляюсь (на бумаге составил граф, что с чем связано), то вот с графиком у меня проблемы: хочется взяться за всё и сразу, а так нельзя. Нужен совет более опытного мастера. Ну и вообще любая помощь приветствуется. Ещё два месяца спустя Желание реализовать эту задумку не утихает, скорее даже наоборот: зреет и крепнет. За это время со мной много чего случилось и не всегда было время на то, чтобы исследовать панду и заниматься проектом. Но я всё-таки успел пройти туториал на MyGameFast (к сожалению, незавершённое автором), наговнокодить змейку, которая вполне себе играбельная. Правда, в ней нет ни меню, ни возможности изменить скорость, ни таблицы результатов, в неё можно просто играть. Сейчас думаю над тем, стоит ли приводить её в более опрятный (с точки зрения кода и особенностей панды) вид или бросить её как есть и начать вплотную работать уже с Mad Lab Худо-бедно список фич, которые должны быть в версии 0.1 я набросал, но прежде всего нужно грамотно определить общую архитектуру программы с учётом особенностей панды, чтобы потом всё заново переписывать не пришлось. UPD OCT Отчёт за сентябрь Отчёт за октябрь Долго думал выкладывать тут эти ссылки или нет. Если прочитаете, то поймёте почему. Даже не знаю, буду ли выкладывать тут отчёт за ноябрь. В этом вопросе, пожалуй, лучше уже ничего не писать, если вдруг захотите со мной связаться, то пишите в джаббер: montreal@jabber.ru или на почту, указанную в профиле. Лучше будет сразу указать причину, по которой пишете. UPD NOV Отчёт за ноябрь. Точнее, ноябрьский отчёт за октябрь. Написан, разумеется, в большей степени для себя и там вы найдёте все мои мысли о прошедшем месяце. PS Не знаю, насколько всё это соответствует правилам хэшкода. Если мой вопрос сильно им противоречит, то я его переработаю. PPS Если эта идея всё ещё кому-то интересна, то я могу завести бложик на blogspot'e, где можно писать "новости" 1-2 раза в месяц.
Ответ
Вообще, после составления 5-6 графов, которые изображали бы архитектуру программы, у меня получилась вот такая штука.
И, честно говоря, она мне не очень нравится. Вот почему: все остальные модули зависят от ядра и если вдруг придётся его изменить, то изменения могут затронуть всю программу, а это явный признак плохой архитектуры.
И потом: данный рисунок не отражает степень связанности разных модулей с ядром. Пожалуй, наиболее сильно с ядром связаны модули Input, GUI, Save/Load и AI. Чуть слабее связан 3D Render, так как он просто отрисовывает картинку, ну а генератор карт вообще почти никак с ядром не связан, от него требуется только генерировать карту по сигналу.
Возвращаясь к вопросу о том, как грамотно составить Roadmap, теперь я понимаю, что нужно начать с ядра, как бы это не было банально. После чего перейти к модулям ввода и рендера. Дальше GUI, Save/Load, генератор карт и AI.
Пока как-то так.
Два месяца спустя
За прошедшие два месяца в моей жизни поменялось довольно много: я переехал в другой город и нашёл работу. Мысли о Mad Lab не покидали мою голову и тут, ВНЕЗАПНО, случился невероятный прорыв: в сети я наткнулся на замечательный игровой движок, именуемый Panda3D. Написан он на С++, но все функции можно вызывать из питона. Открыт для любого использования и включает в себя очень обширный набор инструментов, таких как работа с GUI, физикой и звуком!
Знакомиться с движком я только начал, но уже написал по инструкции своеобразный helloworld, в котором по небольшой сценке туда-сюда бродит панда, а камера вращается вокруг центра сцены. Всё это счастье укладывается в 45 строк кода на питоне, что не может не радовать. В голове уже начинает складываться пресловутый roadmap: "так сейчас нам нужно реализовать перемещение человечка по карте при помощи point-and-click, затем добавить врагов,NPC, шмот и всё заверте..."
А вот, собственно, и код:
from math import pi, sin, cos
from panda3d.core import Point3
from direct.task import Task
from direct.actor.Actor import Actor
from direct.showbase.ShowBase import ShowBase
from direct.interval.IntervalGlobal import Sequence
class MyApp( ShowBase ):
def __init__( self ):
ShowBase.__init__( self )
self.disableMouse( )
self.environ = self.loader.loadModel( "models/environment" )
self.environ.reparentTo( self.render )
self.environ.setScale( 0.25, 0.25, 0.25 )
self.environ.setPos( -8, 42, 0 )
self.taskMgr.add( self.spinCameraTask, "SpinCameraTask" )
self.pandaActor = Actor( "models/panda-model", { "walk": "models/panda-walk4" } )
self.pandaActor.setScale( 0.005, 0.005, 0.005 )
self.pandaActor.reparentTo( self.render )
self.pandaActor.loop( "walk" )
pandaPosInterval1 = self.pandaActor.posInterval( 13, Point3( 0, -10, 0 ), startPos=Point3( 0, 10, 0 ) )
pandaPosInterval2 = self.pandaActor.posInterval( 13, Point3( 0, 10, 0 ), startPos=Point3( 0, -10, 0 ) )
pandaHprInterval1 = self.pandaActor.hprInterval( 3, Point3( 180, 0, 0 ), startHpr=Point3( 0, 0, 0) )
pandaHprInterval2 = self.pandaActor.hprInterval( 3, Point3( 0, 0, 0 ), startHpr=Point3( 180, 0, 0 ) )
self.pandaPace = Sequence( pandaPosInterval1, pandaHprInterval1, pandaPosInterval2, pandaHprInterval2, name="pandaPace")
self.pandaPace.loop( )
def spinCameraTask( self, task ):
angleDegrees = task.time * 6.0
angleRadians = angleDegrees * ( pi / 180.0 )
self.camera.setPos( 20 * sin( angleRadians ), -20.0 * cos( angleRadians ), 3 )
self.camera.setHpr( angleDegrees, 0, 0 )
return Task.cont
app = MyApp( )
app.run( )