Планы и всякое
Апр 24
Я давно не писал в блог “просто так”, о жизни. Этот пост будет посвящен этому. Я расскажу о том, чем я живу в последнее время, о прогрессе в разработке Ignite и о своих планах на будущее.
С 2009-го года я был в свободном плавании – будучи некрасиво уволенным по сокращению с предыдущего места работы, я не нашел ничего лучшего, чем открыть субъект предпринимательской деятельности и продолжить работать самостоятельно, на себя. Дела шли неплохо, но этот пост не про это, как и не про то, как в нашем государстве(Украина) способствуют развитию мелкого бизнеса. Скажу только, что к 2013-му году работать стало окончательно невозможно, и я начал искать работу программиста на стороне.
Этим я занимался полтора месяца (с конца января). После ведения своего бизнеса, было интересно окунуться в работу других предприятий, в то как они предлагая копейки, пытаются найти нормального специалиста, в то что узнав про какой-нибудь пробел в знаниях его раздували до размеров слона и т.д. В итоге, работу я конечно же нашел, и сейчас все еще продолжаю получать письма с предложениями на все те же вакансии, куда не прошел. Забавно.. но этот пост не про это.
Я пошел работать на должность web developer`a и разрабатываю сейчас интересное web-приложение для своей компании. Она не занимается аутсорсом (как 99% компаний в Украине) и это первое, что меня радует. Второе – то что мне удалось совладать с собой и стресс с депресняком, которые преследовали меня при поиске работы и получении отказов, не заставили меня сменить ни род деятельности, ни даже язык программирования.. хотя конечно акцент с десктопов сместился на веб. Я все также продолжаю совершенствовать свои знания C# и .net framework.
От работы перейдем к личным проектам: работа над Ignit’ом опять застопорилась – за последние три недели я не написал ни строчки кода(ну может быть несколько). Если честно, мне просто надоело его писать. И, вероятно, это будет концом его разработки. В ближайшие дни я соберу версию, пригодную для публикации, и выдам ее на гора. Возможно, исходные коды уедут на github, но, если честно, мне стыдно за некоторые(многие) места времен hello world моего обучения языку C#. Возможно, публичный (сырой) релиз подстегнет мой интерес.. если же нет, то в задумке крутится новая (и совершенно не похожая на предыдущую) игра:
Игра будет написана с использованием MonoGame и будет поддерживать Windows/Linux из коробки и MacOS/iOS/Android в перспективе. Рабочее название Into the Void. Тематика: первое освоение далекого космоса.

C# Отложенное получение данных
Апр 13
Иногда при программировании сталкиваешься с задачей, которая выполняется длительное время. Обычно такие операции выполняют в отдельном потоке, чтобы не мешать ходу работы программы – таким образом решается проблема недоступности потока программы во время выполнения длительной операции, однако тут же возникает проблема синхронизации полученных в результате длительных вычислений данных с данными программы. Тут не работает привычная присваивания:
|
1 |
var a = someAction(); |
В моей программе, я использую BackgroundWorker’ы для выполнения длительных вычислений. BackgroundWorker асинхронно выполняет поставленную ему задачу (в событии DoWork), а после ее выполнения может сделать еще какие-нибудь действия (событие RunWorkerCompleted):
|
1 2 3 4 5 6 7 8 9 10 |
public static void someAction() { var worker = new BackgroundWorker(); //действие worker.DoWork += (sender, args) => {}; //результат worker.RunWorkerCompleted += (sender, args) => {}; //запускаем асинхронный процесс worker.RunWorkerAsync(); } |
К сожалению, если мы передадим переменную, которая должна измениться в результате выполнения асинхронного запроса с модификаторами out или ref следующим образом:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void someAction(ref int i) { var worker = new BackgroundWorker(); //действие worker.DoWork += (sender, args) => {}; //результат записываем worker.RunWorkerCompleted += (sender, args) => { i = 1; }; //запускаем асинхронный процесс worker.RunWorkerAsync(); } |
, то это приведет к ошибке на этапе компиляции, т.к. передача ref/out переменных в анонимные методы запрещена.
Обойдем это с использованием собственного класса:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Interfaced<T> { private T _value; public T Value { get { return _value; } set { if (value.Equals(_value)) return; _value = value; ValueChanged.Invoke(this, null); } } public EventHandler ValueChanged; } |
Класс очень простой: он состоит из свойства Value типа Т (т.е. любого, заявленного заранее, типа) и события, которое срабатывает, когда Value изменяется.
Пример использования класса:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Main { string[] strings; public Main() { var iValue = new Interfaced<string[]>(); iValue.ValueChanged += (sender, args) => strings = ((Interfaced<String[]>) sender).Value; Helper.AsyncAction(iValue); } } class Helper { public static void AsyncAction(Interfaced<string[]> iValue) { var worker = new BackgroundWorker(); worker.DoWork += += (sender, args) => {}; worker.RunWorkerCompleted += (sender, args) => {iValue.Value = new string[5];}; worker.RunWorkerAsync(); } } |
В данном случае, strings перестанет равняться null в момент завершения асинхронной операции.
Ignite – Fire Damage
Фев 18
Сегодня добавил в игру первый элементальный эффект от урона – огонь. На данный момент он встречается только на факелах или при выпадении соответствующего аффикса при генерации редкого предмета:

В Игнайте огненный урон вешает на персонажа дебаф “Горение”, который сработает на следующем ходу и причинит часть уже нанесенного урона. Некоторые таланты будут увеличивать урон и продлевать время действия горения для его синергии с активными талантами. Наличие этого эффекта является базовой механикой для класса “Пиромант”.

FanArt – рост pagerank
Фев 8
Некоторое время назад я писал про собственноручно написанное приложение для автоматической генерации контента для сайта. Доделав программу, я поюзал ее несколько дней (700+ постов) и законсервировал в ожидании результатов. Результаты не заставили себя ждать: через пару недель сайт появился в выдаче Google, с поиска начались переходы (сейчас 20-30 юников в день), а сегодня, после очередного апдейта, поисковая система добавила + 2 PR.
Ignite – Увеличение дальности обзора
Фев 8
После просмотра видео, опубликованного в прошлом посте, мне пришло замечательное предложение, реализовав которое я стал на один большой шаг ближе к более качественному проекту. Предложение заключалось в том, чтобы увеличить отображаемую на экране игровую площадь. В итоге, я увеличил дальность зрения игрока с 25 до 50 клеток, и чрезвычайно доволен тем, как стала выглядеть игра:
Одновременно с этим, я увеличил непрозрачность непроходимых тайлов с 0,6 до 1,0 (т.е. теперь за первым тайлом стены не будет видно второй, как в стандартных рогаликах), и прозрачность частично прозрачных тайлов (лес) до 0,45. Пока тестирую эти изменения.

