Сборка для Windows: atrium-testbuild3-win32.zip (1.18 МБ).
d
Случайная выборка с учетом веса
Один из распространенных приемов в игровой логике – использование элемента случайности. Он используется, например, при машинной генерации уровней, лабиринтов, или когда на локации появляются случайные враги или бонусы. При этом зачастую требуется выбрать случайный объект из какого-либо списка с учетом того, что некоторые из них имеют большую вероятность выбора, чем другие – то есть, имеют больший “вес”.
Я написал особую реализацию алгоритма такой выборки – она работает не с обычными массивами, а с перечислениями (enum). В шаблон функции передаются два перечисления – самих элементов и их весов. Этот пример иллюстрирует также богатые возможности метапрограммирования, CTFE и интроспекции в D.
import std.stdio;
import std.traits;
import std.random;
import std.algorithm;
T weightedRandomEnum(T, W)()
if (isNumeric!W &&
is(T == enum) && is(W == enum) &&
EnumMembers!T.length == EnumMembers!W.length)
{
enum members = [EnumMembers!T];
enum weights = [EnumMembers!W];
enum weightsSum = reduce!("a + b")([EnumMembers!W]);
auto randomNumber = uniform(0, weightsSum);
foreach(i, weight; weights)
{
if (randomNumber < weight)
return members[i];
else
randomNumber -= weight;
}
assert(0, "Should never get here");
}
enum Color
{
Red, Yellow, Green, Blue
}
enum Weights
{
Red = 100,
Yellow = 20,
Green = 20,
Blue = 5
}
void main()
{
foreach(i; 0..10)
writeln(weightedRandomEnum!(Color, Weights));
}
Обновление dlib
- Появилась начальная поддержка быстрого преобразования Фурье (FFT) в dlib.image. Возможна фильтрация и свертка изображений (со стороной 2^n) в частотной области;
- Обновлен пакет dlib.math, добавлена реализация комплексных и дуальных чисел, а также внесены исправления и дополнения в dlib.math.matrix3x3 и dlib.math.matrix4x4;
- Обновлен пакет dlib.geometry, добавлен класс ориентированных боксов (OBB), трехмерных треугольников и полигональных мешей. Реализована проверка на пересечение между сферой и треугольником, а также сферой и OBB. Добавлен модуль dlib.geometry.bezier с реализацией кривых Безье.
Иллюстрация FFT-свертки: быстрое синтетическое боке (оптическое размытие):
Изменения доступны в ревизии r21 и выше. В ближайшем будущем ожидается первый релиз проекта.
Исходники физического движка
physics-src-alpha0.zip (0.95 Мб).
Пример физики на движке Chipmunk
В архиве – исходники и сборки для Win32 и Linux x86:
polyshaper-all-platforms.zip (1.16 МБ)
Внимание! Пример писался достаточно давно – исходный код, скорее всего, не скомпилируется современными версиями DMD без дополнительных “танцев с бубном”.