D:\sideБлогHaxe — пока, GMS, было весело

Это по большей части небольшой но мощный и разочаровывающий (скорее всего) для многих анонс. Этот момент должен был наступить, вопрос был во времени. Я нашёл хорошую альтернативу GMS для себя, в которой у меня будет больше контроля над ситуацией. Я, в общем-то, её не искал. Но безумные идеи, которые приходили в голову, подталкивали к тому, что с GMS и GM вообще мне стало весьма неудобно работать.

С чего всё началось? С Parakeet. Он мне напомнил о том, что сколько бы я ни привыкал к костылям GML, это всё ещё костыли. Он ввёл собственный синтаксис обработки событий… что мило, но на данный момент исполнено на редкость криво. Parakeet, как IDE, поддерживается очень хило, но его фичи заманчивы, и хочется ещё. К тому же, категорический отказ автора выпустить исходный код Parakeet лично меня разочаровал — он потерял много продуктивных человекочасов ради возможности однажды превратить Parakeet в коммерческий проект, который бы оказался слишком узкоспециализирован. Даже на лицензию GMS многим жаль потратиться, что уж говорить о среде, которая вряд ли будет дешёвой для своей мощи (которой, хочется надеяться, он будет обладать).

Поэтому я задумался над тем, чтобы реализовать для GML язык-обёртку на основе Ruby. Сам язык к этому располагает, я уже писал о фичах. Я начитался интересных вещей про Ruby, и вроде изучил достаточно, чтобы сделать в GML годный настоящий ООП на классах… но я не успел начать этот проект, потому что наткнулся на Haxe. Забавно, но он делает примерно то же самое, только на куда более широкий набор языков и технологий. Вокруг него более крупное сообщество, кодовая база, а набор платформ всё ещё покрывает все мои нужды.

Что касается языка-обёртки, реализовать мне хотелось, в основном, две фичи.

  1. Сделать проверку типов. В свежем GML 4 типа, в более старых вариантах и того меньше — 2. Реальных же типов больше десятка, но большая их часть кодируется числами.
  2. Завернуть группы функций для конкретных ресурсов в классы с их методами.

Выглядеть это могло бы примерно следующим образом:

surf = Surface.new(800, 600);

surf.on do
  self.draw(alpha: 0.8, scale: 0.5)
  5.times do |i|
    sprite0.draw(x: 20, y: 20, image: i)
  end
end
var i = 0;
surf = surface_create(800, 600);

surface_set_target(surf);
draw_sprite_ext(sprite_index, image_index, x, y, 0.5, 0.5, image_angle, image_blend, 0.8);
for(i = 0; i < 5; i++)
{
  draw_sprite(sprite0, i, 20, 20);
}
surface_reset_target();

То есть, перечисляю штуки, которые лично меня в GML вымораживают:

В общем, теперь я ушёл в Haxe. Придётся привыкать, но это цена системы, с которой удобно работать. Мне понравился Ruby, и я даже могу объяснить, чем (и объяснял в постах ранее).