вторник, 22 декабря 2015 г.

Violet sun in unity

Сделал солнце на unity. Спрайты честно спер с одной известной игры. Ближе к релизу переделаю:

вторник, 15 декабря 2015 г.

Сингл vs Мульти

Уже почти 4 месяца прошло с момента начала разработки игры. Сервер пишется на go, клиент на C#(unity3d). С самого начала я не осознавал до конца, какой же это геморрой - пилить мультиплеерную игру :)
Лично для меня основные сложности на данный момент - разная кодовая база и слишком правильная разработка на сервере. Клиент прощает многое, можно кодить много и говнисто. На сервере это проблематично ввиду того, что клиентов уже несколько. Руки выпрямляются сами, но какой ценой...
До сих пор когда пишу код на сервере, отвечающий за спавн ботов, думаю: а на клиенте достаточно было б написать
GameObject.Instantiate(botPrefab, botPos, botRotation);

среда, 3 сентября 2014 г.

Обратный порядок слов в строке

Ходил недавно по собеседованиям, наткнулся на интересную задачу. Поменять порядок слов в строке, разделенной пробелами. Например из "one two three four" сделать "four three two one" за линейное время, не используя дополнительную память. В лучших традициях, на собеседовании до решения я не догадался. Хорошая мысль пришла мне уже дома:
#include <iostream>
#include <string>

void main()
{
    std::string str = "one two three four";

    for (size_t i = 0; i < str.length() / 2; ++i)
    {
        std::swap(str[i], str[str.length() - i - 1]);
    }

    auto inversePartOfString = [](std::string& str, size_t low, size_t high)
    {
        for (size_t j = low, k = 0; j < (low + high) / 2; ++j, ++k)
        {
            std::swap(str[j], str[high - k - 1]);
        }
    };

    int lastFound = 0;
    size_t i = 0;
    for (; i < str.length(); ++i)
    {
        if (str[i] != ' ')
        {
            continue;
        }
        inversePartOfString(str, lastFound, i);
        lastFound = i + 1;
    }
    inversePartOfString(str, lastFound, i);

    std::cout << str << std::endl;
}

воскресенье, 25 марта 2012 г.

Простая задачка о произведении всех элементов в массиве

Не так давно столкнулся с простой задачей: посчитать произведение элементов в массиве. Первое решение, приходящее в голову:
namespace
{
  template<class T>
  class Multiply
  {
  public:
    Multiply(T& result) : TotalResult(result)
    {
    }

    void operator()(const T& v)
    {
      TotalResult *= v;
    }

  private:
    T& TotalResult;
  };
}

void main(void)
{
  int result = 1;
  Multiply<int> functor(result);
  int buffer[] = {1, 2, 3, 4};
  std::for_each(buffer, buffer + 4, functor);
  std::cout << "Result = " << result;
}
Поскольку for_each принимает последний параметр по значению, то функтору нужно передавать ссылку извне. Также, чтобы где-то сохранять ссылку на результат нам пришлось написать класс. Однако можно решить задачу и по-другому, используя std::bind1st.

понедельник, 19 марта 2012 г.

Мелочи жизни

В рабочем коде периодически натыкаюсь на код подобного вида:
class SomeClass
{
  //....
};
typedef std::auto_ptr<SomeClass> SomeClassAutoPtr;
typedef std::tr1::shared_ptr<SomeClass> SomeClassSharedPtr;
//....
SomeClassAutoPtr ptr = getSomePointer();
Читать подобные километровые названия не очень приятно. Решение получше:
class SomeClass
{
  //....
typedef std::auto_ptr<SomeClass> AutoPtr;
typedef std::tr1::shared_ptr<SomeClass> Ptr;
};
//...
SomeClass::AutoPtr ptr = getSomePointer();
ИМХО второй вариант выглядит куда приятнее первого, к тому же не засоряет "глобальное пространство имен".

вторник, 22 ноября 2011 г.

SyntaxHighlighter для блога

Настроил syntaxhighlighter теперь при переключении вкладок "Создать" и "HTML" данные о подсветке не теряются + можно более менее легко править исходники
#include <iostream>
void main()
{
  //hey, look at this
  std::cout << "Hello World!";
}

пятница, 18 ноября 2011 г.

Особенности использования shared_ptr и RefCounter

Бредисловие
Думаю каждый программист слышал или использовал shared pointers и встречался с идиомой ref counter для разделяемых ресурсов. По отдельности их использование не представляет сложности и опасности, но что может быть если совместить их вместе?

А как все начиналось...
Предположим мы расширяем существующий функционал программы. Архитектура программы содержит в себе некий "промежуточный" слой service, который состоит из классов-менеджеров. Т.е. для записи файла на CD есть класс CdWriterManager, для записи файлов на расшаренные папки ShareWriterManager и прочие. И вот нам дают задание написать класс для записи файлов на FTP.