первый блин?
в качестве 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 есть три типа данных:\ | целочисленные | с плавающей точкой | строковые |
объявление: | var | var# | var$ |
объявление: | var as integer | var as float | var as string |
пределы значения: | -2,147,483,648 ... 2,147,483,647 | 3.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!и это всё?
да, с виду кажется, что программа не делает ничего особенного. но ведь и кое-кто сперва не умел ничего. а, при условии вдумчивого изучения урока, кое-кто смог многое почерпнуть. так держать!это может стать началом большого пути.
Комментариев нет :
Отправить комментарий
и мудрому человеку совет требуется.