Wednesday, January 30, 2013

Игра: "Winter hunting for zombie frogs"

  Это реализация в компонентном стиле(поверх ООП) третьего примера из заметки Компонентная философия на ЯП Scala.


  Разработка заняла ~200 часов, половина этого времени ушло на movement(который так и не заработал должным образом:( ), четверть ушла на компонентный рантайм, и последняя четверть на собственно игру.
  В рантайме я реализовал некоторые из возможностей описанных в заметке, в частности сборку из компонентов и интерфейсы, а также(в некоторой степени) управление жизненным циклом компонентов. Вышло это всё довольно криво и многобуквенное(ибо натянуто на ООП и ФП), но тем не менее это работает :)
  Код собирающий программу: 
    /*Build program*/  
    //View
    name += ("frame" -> new Frame(name))
    name += ("viewDraw" -> new ViewDraw(name, "IWidgets",  name("frame")))
    name += ("statusBar" -> new StatusBar(name, "IWidgets",  name("frame")))
    //Matrix
    name += ("space" -> new Space(name))
    name += ("camera" -> new Camera(name))
    connect("ILayout", name("space"), name("camera"))
    connect("IViewDraw", name("viewDraw"), name("camera"))
    //Game
    name += ("arena" -> new Arena(name))
    connect("IViewSettings", name("viewDraw"), name("arena"))
    name += ("joystick" -> new Joystick(name))
    connect("IFrame",name("frame"),name("joystick"))
    connect("IControl",name("space"),name("joystick"))
    connect("IControl",name("camera"),name("joystick"))
    name += ("targetGen" -> new TargetGen(name))
    connect("ITargetGen",name("targetGen"),name("joystick"))
    connect("ITracking",name("targetGen"),name("joystick"))
    connect("ITracking",name("targetGen"),name("arena"))
    name += ("observer" -> new Observer(name))
    connect("IAvatarWatch",name("observer"),name("joystick"))
    connect("ITargetWatch",name("observer"),name("targetGen"))
    connect("IStatusBar",name("observer"),name("statusBar")) 
  Так же при разработке я использовал три тестовых варианта сборки(вы также может их собрать раскомментировав соответствующие строки в файле "Building.scala").
Первый вариант для отладки физики:
Код сборки:
    /*Build test matrix physics*/ 
    //Manager
    name += ("testManager" -> new TestManager(name))
    //View
    name += ("frame" -> new Frame(name))
    connect("IFrame",name("frame"),name("testManager"))
    name += ("testViewDraw"  -> new TestViewDraw(name, "IWidgets",  name("frame")))
    //Matrix
    name += ("space"  -> new Space(name))
    connect("IControl",name("space"),name("testManager"))
    name += ("testCamera"  -> new TestCamera(name))
    connect("IControl",name("testCamera"),name("testManager"))
    connect("ITestViewDraw", name("testViewDraw"), name("testCamera"))
    connect("ILayout", name("space"), name("testCamera"))
    //Objects
    name += ("obj1" -> new TestObj1(name))
    name += ("obj2" -> new TestObj2(name))
Второй для отладки визуализации:
Код сборки:
    /*Build test matrix texture*/ 
    //Manager
    name += ("testManager" -> new TestManager(name))
    //View
    name += ("frame" -> new Frame(name))
    connect("IFrame",name("frame"),name("testManager"))
    name += ("viewDraw"  -> new ViewDraw(name, "IWidgets",  name("frame")))
    connect("IViewSettings",name("viewDraw"),name("testManager"))
    //Matrix
    name += ("space"  -> new Space(name))
    connect("IControl",name("space"),name("testManager"))
    name += ("camera"  -> new Camera(name))
    connect("IControl",name("camera"),name("testManager"))
    connect("IViewDraw", name("viewDraw"), name("camera"))
    connect("ILayout", name("space"), name("camera"))
    //Objects
    name += ("obj1" -> new TestObj1(name))
    name += ("obj2" -> new TestObj2(name))  
И третий для отладки геймплея(без визуализации):
Код сборки:
    /*Build test game*/ 
    //View
    name += ("frame" -> new Frame(name))
    name += ("testViewDraw"  -> new TestViewDraw(name, "IWidgets",  name("frame")))
    //Matrix
    name += ("space"  -> new Space(name))
    name += ("testCamera"  -> new TestCamera(name))
    connect("ILayout", name("space"), name("testCamera"))
    connect("ITestViewDraw", name("testViewDraw"), name("testCamera"))
    //Game
    name += ("arena" -> new Arena(name))
    connect("IViewSettings", name("testViewDraw"), name("arena"))
    name += ("joystick" -> new Joystick(name))
    connect("IFrame",name("frame"),name("joystick"))
    connect("IControl",name("space"),name("joystick"))
    connect("IControl",name("testCamera"),name("joystick"))
    name += ("targetGen" -> new TargetGen(name))
    connect("ITargetGen",name("targetGen"),name("joystick"))
    connect("ITracking",name("targetGen"),name("joystick"))
    connect("ITracking",name("targetGen"),name("arena")) 
Также есть вариант для сборки апплета, но я не стал его рисовать, так как он отличается только одним компонентом(BuildingApplet(также содержащий код конструирования апплета) вместо Frame). Этот вариант собирается файлом "CompilApplet.bat".

Апплет:
Sorry, this browser does not understand Java applets or they are not enabled right now.

No comments:

Post a Comment