Редактор уровней для Atrium

После долгого перерыва я вновь возвращаюсь к работе над Atrium. Будущей игре нужны инструменты для подготовки контента, и я решил начать с редактора уровней. Конечно, в качестве редактора уровней можно было использовать один из существующих 3D-пакетов – например, Blender – но я отказался от этой идеи по следующим соображениям:

  • Blender “заточен” под моделирование, а не сборку сцен из готовых моделей. Нет встроенной системы ассетов, библиотеки материалов и т.д.;
  • В существующих программах нет возможности создавать новые классы объектов с нестандартными свойствами и функциональностью, специализированные для конкретного игрового движка;
  • Нет полноценного WYSIWYG, в то время как в собственном редакторе уровней используется графический движок от своей же игры, и картинка в редакторе совпадает с картинкой в игре;
  • Собственный редактор можно распространять параллельно с игрой, на тех же лицензионных условиях, а сторонний инструмент – не всегда.

Для разработки редактора я, как обычно, использую D и OpenGL, а в качестве тулкита – GTK+ (через биндинг GtkD). Планируется выпустить версии для Linux и Windows.

Журнал “FPS” №27

Вышел 27 номер электронного PDF-журнала “FPS”, посвященного разработке игр, программированию, компьютерной графике и звуку.

Читайте в этом номере:

> Подборка новостей по Blender
> Тон Розендаль о будущем интерфейса Blender
> GIMP: цветокоррекция на Python
> От мольберта – к дисплею. Заметки о цифровой живописи
> Физический движок своими руками. Часть IV
> Математика в dlib
> Ranges: диапазоны в D
> Игровые новости из мира Linux
> Право на творчество

Номер доступен для онлайн-чтения и загрузки на сервисе Issuu.com, Документах Google и Dropbox.

Последние новости по проекту вы можете узнать в публичной странице журнала в социальной сети Google+: http://gplus.to/fpsmag. Добавляйте нас в круги, оставляйте свои комментарии и отписывайтесь в нашем сообществе.

Архив номеров журнала здесь.

Cook2

В связи с выходом DMD 2.064 с поддержкой пакетного импортирования, была создана новая нестабильная ветка проекта Cook (инкрементальной системы сборки для программ на D).
В Cook2 планируется внесение серьезных изменений без сохранения обратной совместимости: в частности, переписан код обработки опций командной строки (он теперь использует std.getopt), а также удалена устаревшая и ненужная функциональность.
Поддержка пакетных модулей (package.d) уже обеспечена – кроме того, появилась поддержка выборочных и именованных импортов (например, import foo = bar.Foo и import std.stdio: writefln).

Репозиторий проекта:
https://github.com/gecko0307/cook2

Обновление dlib.image

В dlib.image появилась возможность отслеживать прогресс во время работы фильтров. Для этого используется многопоточность – необходимо создать класс-враппер, наследующий от FilteringThread. Прогресс (от 0 до 1) считывается из свойства progress для SuperImage. В данном примере показано, как использовать эту функциональность для вывода прогресса свертки в консоль:

import std.stdio;
import dlib.image.image;
import dlib.image.io.png;
import dlib.image.filters.convolution;
import dlib.image.fthread;

class ConvolutionThread: FilteringThread
{
    float[] kernel;
    
    this(SuperImage img, float[] k)
    {
        super(img);
        kernel = k;
    }
    
    override void run()
    {
        output = image.convolve(kernel);
    }
    
    override void onRunning()
    {
        writef("Convolving %s%%", cast(uint)(image.progress * 100));
        write("r");
        stdout.flush();
    }
    
    override void onFinished()
    {
        writeln();
    }
}

void main()
{
    auto img = loadPNG("test.png");
    img = (new ConvolutionThread(img, Kernel.Emboss)).filtered;
    img.savePNG("output.png");
}

Пример работы с Yahoo! Finance на D

Пример работы с сетевым API Yahoo! Finance: запрос котировок ценных бумаг. Демонстрирует некоторые распространенные идиомы Phobos – например, форматированный ввод, объекты времени и даты. Использует минималистичный HTTP-клиент DHTTPClient. На ввод программа принимает тикер (биржевое обозначение акции) – например, MGNT.ME для акций “Магнит”. Выводит стоимость, дату и время последней сделки.

module main;

import std.stdio;
import std.string;
import std.uri;
import std.format;
import std.datetime;

import dhttpclient;

struct Quote
{
    string symbol;     // s
    string name;       // n
    double lastTrade;  // l1
    string currency;   // c4
    DateTime datetime; // d1 t1
}

Quote getQuote(string sym)
{   
    const request = "snl1c4d1t1";

    const url = 
        "http://finance.yahoo.com/d/quotes.csv?e=.csv"
      ~ "&f=" ~ request
      ~ "&s=" ~ sym.encode;
    
    auto http = new HTTPClient();
    auto data = http.get(url).chomp;

    Quote q;

    with (q)
    {
        uint year, month, day;
        string time;

        formattedRead(data, 
            ""%s","%s",%s,"%s","%s/%s/%s","%s"", 
            &symbol, &name,
            &lastTrade, &currency,
            &month, &day, &year, &time);

        uint hour, minute;
        formattedRead(time, "%s:%s", &hour, &minute);
        if (time[$-2..$] == "pm")
            hour += 12;

        datetime = DateTime(year, month, day, hour, minute);
    }

    return q;
}

void main(string[] args)
{
    string s = "AAPL"; // Apple Inc.
    
    if (args.length > 1)
        s = args[1];

    auto q = getQuote(s);

    writefln("Symbol: %s", q.symbol);
    writefln("Name: %s", q.name);
    writefln("Last trade: %s %s (%s)", 
        q.lastTrade, 
        q.currency, 
        q.datetime);
}