суббота, 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!
и это всё?
да, с виду кажется, что программа не делает ничего особенного. но ведь и кое-кто сперва не умел ничего. а, при условии вдумчивого изучения урока, кое-кто смог многое почерпнуть. так держать!

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

Комментариев нет :

Отправить комментарий

и мудрому человеку совет требуется.