пятница, 20 июня 2014 г.

НОВЫЙ ТРАНСЛЯТОР ДЛЯ AGK 2

во втором поколении AppGameKit сегодня большой праздник — после условного затишья (условного, потому как новости всё поступали и поступали в так называемом Official Development Blog'е) в течение двух с половиной месяцев со времени последней сборки (а то была AGK 2 Alpha 3 от 21 марта 2014) The Game Creators запустили тест нового компилятора.

компилятор (транслятор) вместе с интерпретатором были переписаны полностью, «from scratch». теперь компилятор очень быстр и создаёт байт-код гораздо меньшего размера.

по словам Sean Mann, создателя игры Wordspionage, который был допущен к ранним сборкам компилятора, размер байткода этой игры сократился с 35MB до 3.5MB, а время компиляции с 3:45 минут до того, что он не успевает включить таймер или хотя бы глазом моргнуть.

к сожалению, мне не удалось убедиться в этом на собственных проектах, так как компилятор пока ещё весьма сырой и потому чересчур изобилует ошибками. однако, он шустро нашёл некоторые мои собственные ошибки с повторным объявлением массивов и переменных, пропускаемые старым компилятором, и сделал это действительно шустро.

также быстро Paul Johnston, программист, занимающийся ядром, выкатил первое исправление, учитывающее отзывы первых тестеров.

пятница, 31 января 2014 г.

НОВЫЕ СБОРКИ AGK

в первом поколении AGK 30-ого января выпущена сборка 108.21, в названии которой устранена между прочим приставка beta.

во втором поколении — 17-ого января вышла сборка alpha 2.

суббота, 7 декабря 2013 г.

HELLO WORLD

первый блин?
в качестве IDE в AGK предлагают использовать существенно обрезанную версию Code::Blocks. в ней нет многих удобств, вроде code folding или function list, нет отладчика обещают добавить всё это в V2, но худо-бедно работать можно.
на официальном форуме рассказывали об успешном применении Sublime Text ($70), Edit Plus ($35), и даже пробовали Notepad++ (бесплатно).
запустим Code::Blocks, благо это проще всего, и создадим новый проект, выполнив следующую последовательность действий:
File > New > Project >> AGK Generic Project > Go >> Project title: "my_project_1" > Finish
как кое-кто успел заметить по полю Folder to create project in:, по умолчанию проекты создаются в папке "путь_установки_AGK/Projects/Basic".
соседняя папка "путь_установки_AGK/Projects/Native" содержит файлы, необходимые для работы с Tier 2.
кое-кто найдёт в ней папку с примерами Examples и свежеиспечённую папку проекта my_project_1. в папке проекта были созданы три файла:

main.agcосновной файл с исходным кодом
setup.agcфайл с настройками отображения приложения
my_project_1.cbpфайл проекта, где Code::Blocks хранит служебную информацию
исходнее!
файлы с исходным кодом имеют расширение agc и представляют собой текст, по умолчанию закодированный в ASCII. Code::Blocks в случае нужды меняет кодировку например, если в окно с редактируемым кодом вставить символ, не представленный в ASCII, и затем сохранить, но, вообще, особой нужды в этом нет: набор символов, которыми способен оперировать AGK ограничен 8-битной кодировкой.
исходный код проекта может храниться в нескольких файлах. чтобы облегчить себе работу, кое-кто может рассосредоточить его по смыслу: инициализация переменных в var_ini.agc, загрузка элементов меню в menu_load.agc и т.д.
чтобы добавить новый файл к проекту, нужно нажать:
File > New > Empty file >> Да >> Имя файла: "var_ini" > Сохранить
после чего нужно сохранить проект:
File > Save project
кое-кто может добиться того же, создав файл var_ini.agc вручную и дописав в файл my_project_1.cbp блок строк:
  <Unit filename="var_ini.agc">
   <Option link="0" />
  </Unit>
непосредственно до или после блока:
  <Unit filename="main.agc">
   <Option link="0" />
  </Unit>
от того, как кое-кто расположит в файле эти блоки относительно друг друга, зависит последовательность расположения вкладок в Code::Blocks.
чтобы настроить какой текст будет во всех создаваемых файлах по умолчанию, проделай:
Settings > Editor >> Default code: "// кое-кто захватит мир, йо!" > Ok
когда уже начнём?
если кое-кто всё сделал правильно, то у него перед глазами открыто окно, в котором открыт проект my_project_1, в котором открыт файл var_ini.agc с двумя пустыми строками.
вторую строку — не учитывать, потому что последняя пустая строка в случае её отсутствия автоматически будет добавлена Code::Blocks при сохранении.
пиши:
1  author$ = "genius"
сохрани всё:
File > Save everything
закрой всё:
File > Close workspace
иди в настройки:
Settings > Environment >> On project load: open all project files > Ok
теперь, открыв проект:
File > Recent projects > my_project_1
кое-кто увидит окно, в котором открыт проект my_project_1, в котором открыты все 3 файла проекта.

во вкладке main.agc уже есть стандартный hello world, в котором кое-кто должен понять следующее:
remкоманда указывающая на то, что все последующие символы в строке являются комментарием, и не должны учитываться компилятором. команды rem, // и ` эквивалентны.
doкоманда, объявляющая начало безусловного цикла
print( a$ )функция, выводящая текстовую строку a$ в буфер
sync()функция, отрисовывающая буфер на экран
loopкоманда, завершающая цикл

и цикл здесь — это круг. он не имеет условия завершения и в процессе исполнения программы длится, пока кое-кто не закроет её. всё, что находится между do и loop выполняется шаг за шагом пока не встретится какой-нибудь exit или не кончится электричество. у нас же — в буфер выводится "hello world", буфер выводится на экран — всё повторяется заново.
в двойные кавычки в AGK заключаются строки. потому у нас, собственно, в буфер выводится "hello world" без кавычек.
print() — это функция. функции могут принимать до 9, включительно, аргументов разных типов, производить с ними некоторые операции, и возвращать или не возвращать какое-либо значение. print() принимает строку, суёт её в буфер, добавляет перенос строки, никакого значения не возвращает.

sync() — это функция. не принимает значений, последовательно вызывает update(), render() и swap(), никакого значения не возвращает.
а зачем var_ini.agc?
в var_ini.agc кое-кто объявил, что он гений. точка зрения небезынтересная, но нам потребуются доказательства. объясняю: строковой переменной author$ присваивается значение "genius". всего же в AGK есть три типа данных:

\целочисленныес плавающей точкойстроковые
объявление:varvar#var$
объявление:var as integervar as floatvar as string
пределы значения:-2,147,483,648 ... 2,147,483,6473.4E +/- 38 (7 цифр)пустая строка ... ограничение по оперативной памяти


кое-кто может определять собственные типы, комбинируя вышеперечисленные. например, пиши в var_ini.agc:
1  type tp_my_rgb
2   red as integer
3   green as integer
4   blue as integer
5  endtype
6
7  color as tp_my_rgb
8   color.red = 255
9   color.green = 128
10   color.blue = 128
11
12  author$ = "genius"
в строках 1-5 объявляется тип tp_my_rgb, в строке 7 объявляется переменная color типа tp_my_rgb. в строках 8-10 переменной присваиваются значения.
кроме того в AGK можно и нужно использовать массивы. заменим строку 12 на четыре новых:
12  dim author[3] as string
13   author[1] = "genius"
14   author[2] = "newbie"
15   author[3] = "tolstoy"
в строке 12 объявляется строковый массив author[] из 3 элементов (на самом деле из 4, т.к. нумерация ведётся с 0-ого элемента, который — условимся на будущее — оставлять пустым). в строках 13-15 элементам массива присваиваются значения.
то же можно было сделать и в одну строчку:
12  dim author[3] as string = ["", "genius", "newbie", "tolstoy"]
тут также объявляется строковый массив author[] из 3 элементов, элементам массива последовательно присваиваются значения (0-ому присваивается пустая строка).
в main.agc объявим до начала цикла строковую переменную signature, присвоим ей значение случайного элемента массива author[] и попытаемся вывести её на экран сразу после "hello world".
7  signature as string
8  signature = author[random(1,3)]
9
10  do
11   print("hello world")
12   print(signature)
13   sync()
14  loop
random() — это функция. принимает два целочисленных аргумента — начальный и конечный пределы, возвращает целое число из промежутка между ними или равное одному из них.
если кое-кто нетерпелив, то может попробовать скомпилировать и запустить программу. нажав F5 или Build > Compile, run and broadcast но, разумеется, в этом случае он получит сообщение об ошибке:
Array 'author' used without being declarated at line 8.
происходит вызов массива author[], который с точки зрения компилятора ещё не был объявлен, и попытка присвоить переменной signature значения случайного элемента этого массива невозможна, как и любые действия чтения или записи из/в него. это потому, что хотя кое-кто и Code::Blocks знают о существовании var_ini.agc, но компилятору-то о том ничего не известно.
компилятор?
компилятор находится по адресу "путь_установки_AGK/IDE/Compiler/AGKCompiler.exe". Code::Blocks обращается к нему, чтобы транслировать исходный код AGK Script (BASIC) в байт-код, который затем может исполняться некоторым интерпретатором на некотором устройстве.
в целом, кое-кто не должен пользоваться словами компиляция и компилятор в работе с AGK, и правильно говорить только о трансляции, но в community уже прочно привит ошибочный вариант.
байт-код сохраняется в папку "путь_установки_AGK/Projects/Basic/текущий_проект/media/"; под Windows создаётся исполняемый файл-интерпретатор по адресу "путь_установки_AGK/Projects/Basic/текущий_проект/текущий_проект.exe".
приятной особенностью компилятора является возможность broadcast. после успешной компиляции компилятор через Wi-Fi выполняет в локальной сети поиск устройств с запущенным AGK Player. это приложение принимает байт-код и запускает его, загружая в процессе исполнения необходимые медиа-файлы. то есть кое-кто может сразу протестировать свою игру на своём Galaxy Tab, например.
компилятор работает с файлом main.agc, предлагаемым ему Code::Blocks, и кроме данных, указанных в нём, другой информацией не владеет. потому необходимо указать в main.agc, что проект включает в себя var_ini.agc. до объявления переменной signature — пиши:
7  #include "var_ini.agc"
директива #include включает исходный код из указанного файла, и может быть указано любое местоположение относительно файла, содержащего директиву. например, если main.agc в папке "путь_установки_AGK/Projects/Basic/my_project_1/", а var_ini.agc в папке "путь_установки_AGK/Projects/Basic/common/", тогда можно включить его так: #include "../common/var_ini.agc"
если кое-кто попытается скомпилировать проект теперь, то компиляция успешно завершится, программа запустится, но... завершится с ошибкой:
Array does not exist at line 9 in root
строка в этом сообщении указана неверно это какой-то внутренний баг интерпретатора, зачастую нужно прибавить единицу к номеру строки, на самом деле ошибка случилась в 10-ой. вот полный код, как он выглядел перед компиляцией:
1  rem
2  rem AGK Application
3  rem
4
5  rem A Wizard Did It!
6
7  #include "var_ini.agc"
8
9  signature as string
10  signature = author[random(1,3)]
11
12  do
13   print("hello world")
14   print(signature)
15   sync()
16  loop
17
1  type tp_my_rgb
2   red as integer
3   green as integer
4   blue as integer
5  endtype
6
7  color as tp_my_rgb
8   color.red = 255
9   color.green = 128
10   color.blue = 128
11
12  dim author[3] as string = ["", "genius", "newbie", "tolstoy"]
то есть #include добавил содержимое var_ini.agc в конец текущего исходника следующий #include добавит ещё что-либо к этому и так далее.
с точки зрения компилятора массив был объявлен, ошибки нет — но он не проверил, где именно объявлен массив. получается же, что вызов одного из элемента массива происходит на 19 строк раньше, чем массив объявляется. фактически, в данном коде он не объявится никогда, так как не предусмотрен выход из цикла; после 16-ой строки код не выполнится.
что делать?
кое-кто может поместить 12-ую строку в var_ini.agc внутрь функции, и затем вызвать эту функцию в main.agc перед чтением из массива:
12  function author_setup()
13   dim author[3] as string = ["", "genius", "newbie", "tolstoy"]
14  endfunction
author_setup() — это функция, созданная своими руками. она не принимает никаких параметров, создаёт и наполняет строковый массив author[], никакого значения не возвращает.
область видимости массива в AGK распространяется на всю программу, и массивы в AGK глобальны. поэтому теперь, вызвав функцию author_setup() вовремя, кое-кто сможет читать из массива author[] отовсюду, откуда пожелает и, таким образом, наконец, получить первую работающую программу.
кайф!
поздравляю, но это ещё не всё. кое-кто ввёл в код переменную color, но никак не использовал. исправим это упущение:
7  function color_setup()
8   global color as tp_my_rgb
9    color.red = random(125,255)
10    color.green = random(125,255)
11    color.blue = random(125,255)
12  endfunction
как кое-кто успел заметить, теперь переменная color объявлена глобальной, чтобы её можно было использовать вне функции color_setup().
теперь займёмся main.agc:
7  #include "var_ini.agc"
8
9  color_setup()
10
11   setPrintColor(color.red,color.green,color.blue)
12
13  author_setup()
14
15   signature as string
16   signature = author[random(1,3)]
17
18  do
19   print("hello world")
20   print(signature)
21   sync()
22  loop
setPrintColor() — это функция. принимает три целочисленных аргумента — красная составляющая цвета, зелёная составляющая цвета и синяя составляющая цвета (может принимать и четвёртый — прозрачность); устанавливает цвет для всего текста, выводимого функцией print(); не возвращает значения.
voila!
и это всё?
да, с виду кажется, что программа не делает ничего особенного. но ведь и кое-кто сперва не умел ничего. а, при условии вдумчивого изучения урока, кое-кто смог многое почерпнуть. так держать!

это может стать началом большого пути.

суббота, 30 ноября 2013 г.

ПРЕДЛОЖЕНИЯ

рациональные предложения прошу оставлять здесь. вопросы — там.

например, темы для будущих статей, предложения по дополнению/пересмотру/улучшению существующих и такое прочее.

ВОПРОСЫ

место для вопросов, неуместных где-либо ещё. предложения — туда.

кое-кому лучше убедиться, что вопрос нужно задать именно здесь и именно нужно задать, прежде чем предпринимать какие-либо попытки. в остальном — чувствуй себя свободно и непосредственно.

ПРАВИЛА ВЕДЕНИЯ БОЯ

я и сам терпеть не могу следовать всяческим предписаниям. но я признаю, что многие из них бывают полезны и целесообразны. у нас здесь будет город-сад, и кое-кто должен следовать определённому обычаю в том случае, если хочет увидеть этот учебник годным, а свои комментарии опубликованными.

  • твой вопрос и/или предложение должны соответствовать теме комментируемого сообщения.
  • будем взаимовежливы.
    • у всех нас есть неотъемлимые права, и одно из важнейших — право заблуждаться. кое-кому не следует высказывать неуважение к чужим слабостям, по крайней мере — в форме оскорбления;
    • существует верный способ поделиться оценочными суждениями о личности друг друга — с глазу на глаз. прилюдно щёлкаться позорно и постыдно;
    • вообще, не мешает помнить, что иметь положительный образ в глазах собеседника может быть полезно каждому;
  • будем добродетельны. доброе семя — добрый и всход, а в добре жить хорошо.
  • будем осторожны и бдительны, ведь за нами наблюдают. к чему подставляться?
  • не будем робеть. любой ручеёк значим, что впадает куда следует, а в местной стадной иерархии только одному богу слава — учению, — и его солнце светит для всех. кое-кто может спрашивать, кое-кто может отвечать, и станет похвалы достойно, если эти полномочия ты примешь не только твоим правом, но и твоим святым долгом.

sic volo, sic jubeo, sit pro ratione voluntas. да будет так!

пятница, 29 ноября 2013 г.

ВВОДНАЯ

корованы!
что ж, кое-кто хочет научиться делать игры или программировать хоть что-то?
начинаю череду уроков, конечной целью будем считать обучение программированию на AGK Script, а попутно затронем темы игростроения и некоторые другие.
что за AGK?
App Game Kit — это набор программ и компонентов, предназначенный его содателями, британской компанией The Game Creators Ltd, для быстрой разработки игр. язык AGK Script входит в первую голову, иначе говоря — AGK Tier 1, и представляет собой подразновидность языка BASIC с некоторыми небезполезными свистелками и перделками. весьма пригоден для начинающих или собирающихся таковыми стать.
в AGK Tier 2 входит библиотеки и заголовочные файлы для разработки с помощью языка C++, и в дальнейшем, если кое-кто почувствует себя способным, он может невозбранно перейти к работе с ним.
как объясняют TGC, они захотели сделать одно общее средство, позволяющее одномоментно делать игры для большинства мобильных устройств; для того чтобы проводить время, создавая новые игры, а не занимаясь портированием между платформами. они выпустили AGK в 2011, и с тех пор непрерывно шлифуют и оттачивают его.
в рунете TGC [были] известны семейством языков DarkBASIC, средствами 3D GameMaker и FPS Creator, сейчас их основные продукты — AGK и FPSC Reloaded.
у AGK есть Box2D. AGK использует OpenGL. AGK может на Android, Blackberry, iOS, MacOS и Windows. AGK сразу после компиляции попадает по Wi-Fi на тестируемое устройство.
дайте две!
на здоровье: недавно Kickstarter успешно профинансировал AGK V2, осенью 2013-ого TGC начали работу над ней и 20 декабря выпустили первую альфа-версию.
текущая версия AGK, 1.08.19, — это преимущественно про 2D, грядущая же подойдёт для игр любого типа, 2D или 3D. также появятся многие другие улучшения.
в данный момент все ещё возможно поддержать чуваков через PayPal. всего $40.99 и кое-кто получит V2, начиная с альфа-версий, в то время как окончательная цена заявлена около $150. V1 сейчас продают за $59.99.
дальше что?
планирую — урок в неделю. вопросы и ответы. захватить что-либо. сегодня информации об AGK в русскоязычном интернете с гулькин нос, или того меньше: только лишь обрывочные общие сведения. я заинтересовался им почти с самого момента выпуска, купил весной 2012-ого, с тех пор кое в чём разобрался. поделюсь.
могу изменить этот пост, как и любой другой в этом блоге. вероятно, в лучшую сторону.
я в деле!
а может быть, кое-кто — просто безвкусная жопа? вот первый урок: разницы нет, de gustibus non est disputandum. приходи на следующий.