Advertisement
Guest User

Untitled

a guest
Feb 25th, 2012
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 31.13 KB | None | 0 0
  1. ================================================
  2. DUMMY - простой язык программирования для 2D игр
  3. ================================================
  4. создан в 2012 году в феврале by jabberx
  5. ================================================
  6. Контакты: 2chgd@conference.jabber.ru
  7. ================================================
  8.  
  9. Здравствуй, дорогой русский создатель игр.
  10.  
  11. Ты скачал лучший на свете язык программирования. Он не такой как все. Все языки программирования сложные и запутанные, а этот простой. Но вместе с тем он довольно мощный и быстрый. С его помощью ты легко сделаешь игру (двухмерную). Ты научишься рисовать линии, прямоугольники, круги, выводить в окно текст, изображения или часть изображения, проигрывать звуки, проверять состояния клавиш и манипулятора "мышь".
  12. Надеюсь, ты распаковал этот архив на диск Эс. Это самый надежный диск, потому что он системный. Путь должен быть таким: C:\DUMMY\. В папке DUMMY должны быть папки data, dlls и example (пример игры - понг). Но если ты распаковал на другой диск или в другой путь, ничего - просто придется внимательно подредактировать make.bat и всё будет хорошо.
  13.  
  14. ==========================================
  15. ДЛЯ НАЧАЛА
  16. ==========================================
  17. Тебе надо создать файл main.txt, положить рядом с ним make.bat (найдешь в папке C:\DUMMY\example). Береги этот файл. Он тебе понадобится. Создай рядом папку data и клади туда свои картинки, шрифты, звуки. Когда напишешь свою программу, запустишь make.bat и если не будет никаких ошибок, то окошко будет пустым. В папке data ( там будет много всяких файлов, не пугайся ) тебе нужен GAME.exe. Ты можешь запустить и run.bat, который появится после успешной компиляции, но тогда на фоне будет висеть черное окошко. Поэтому лучше перейди в папку data и запусти GAME.exe. Это твоя игра. Но учти, чтобы распространять игру, тебе нужно будет упаковать всю папку data в архив. Некоторые dll можешь перед запаковкой удалить, например libpng (если не загружаешь png файлы), vorbis и ogg (если не играешь ogg), smpeg (если не играешь mp3), mikmod (если не играешь трекерную музыку). Остальные лучше не трогать.
  18.  
  19. В начале своей программы напиши строчку:
  20. #include <DUMMY>
  21. Инклудэ это мощная команда макропроцессора компьютерных команд. Ты можешь написать #include "kusok.txt" в любом месте своей программы и код из kusok.txt встроится на то место. Это называется модульность. Модульность нужна чтобы код не превращался в спагетти.
  22.  
  23. После того как ты написал строчку #include <DUMMY>, начинай писать саму программу. Каждая новая строчка должна начинаться со знака доллара. Затем делай отступы. Хотя бы один пробел. Отступы делаются для удобства чтения.
  24. $ WINDOW
  25. $ WAIT(1000)
  26. $ END
  27. Это простейшая программа, состоящая из трех строчек. Она создаёт пустое окно и показывает его в течение секунды. WINDOW или FULLSCREEN (полноэкранный режим) вначале и END в конце - это обязательные команды твоей программы.
  28. Ширина и высота окна задается один раз, перед WINDOW:
  29.  
  30. $ WW = 1024
  31. $ WH = 768
  32. $ WINDOW
  33. $ WAIT(1000)
  34. $ END
  35.  
  36. ==========================================
  37. О СРЕДЕ РАЗРАБОТКИ
  38. ==========================================
  39. Ты можешь писать свою программу в обычном блокноте. Да! Невероятно, но DUMMY не требует каких-то хитромудрых "СТУДИЙ". Хорошим выбором будет Notepad++. Можно также писать в Microsoft Office Excel (если ты хорошо им владеешь, то тебе будет удобнее, чем в блокноте). Во многих текстовых редакторах есть подсветка синтаксиса и автодополнения. Если захочешь настроить свои - в папке DUMMY есть keywords.txt (ключевые слова для подсветки) и autocomplete (ключевые слова для автодополнения в формате xml, подойдут для notepad++).
  40.  
  41. ==========================================
  42. А ТЕПЕРЬ ПОДРОБНЕЕ ОБО ВСЕХ ВСЕХ КОМАНДАХ:
  43. ==========================================
  44.  
  45. Главное
  46. -------
  47. WW - ВСТРОЕННАЯ ПЕРЕМЕННАЯ. ШИРИНА ОКНА. МОЖНО МЕНЯТЬ. WW=1024
  48. WH - ВСТРОЕННАЯ ВЫСОТА ОКНА
  49. WINDOW - СОЗДАЁТ ОКНО
  50. TITLE("..") - ЗАДАЁТ ЗАГОЛОВОК ОКНУ
  51. SHOWFPS - показать текущую скорость кадров в заголовке. использовать после GETDELTA
  52. FULLSCREEN - ИСПОЛЬЗОВАТЬ ВМЕСТО ОКНА. СОЗДАЁТ ПОЛНОЭКРАННЫЙ РЕЖИМ
  53. TOGGLE - КОМАНДА ПЕРЕКЛЮЧЕНИЯ МЕЖДУ ОКОННЫМ И ПОЛНОЭКРАННЫМ РЕЖИМОМ
  54. CLEAR(c) - ОЧИСТИТЬ ОКНО. УДАЛИТЬ ВСЁ НАРИСОВАННОЕ. CLEAR(RED) ОЧИСТИТ КРАСНЫМ ЦВЕТОМ. ПРОСТО CLEAR() - ЧЕРНЫМ
  55. UPDATE - ОБНОВИТЬ ОКНО. ВСЁ, ЧТО БЫЛО НАРИСОВАНО - ПОКАЖЕТСЯ В ОКНЕ.
  56. BEGIN - НАЧАЛО ЛОКАЛЬНОЙ ОБЛАСТИ. ЧТОБЫ НЕ СОРИТЬ: ВСЕ ПЕРМЕННЫЕ, СОЗДАННЫЕ В ЛОКАЛЬНОЙ ОБЛАСТИ БУДУТ ДОСТУПНЫ ТОЛЬКО В НЕЙ.
  57. END - КОНЕЦ ЛОКАЛЬНОЙ ОБЛАСТИ. ТАКЖЕ СТАВИТСЯ В САМОМ КОНЦЕ ПРОГРАММЫ. НЕ ПУТАТЬ С ВЫХОДОМ ИЗ ПРОГРАММЫ. ВЫХОД ЭТО EXIT
  58. EXIT - НЕМЕДЛЕННЫЙ ВЫХОД ИЗ ПРОГРАММЫ.
  59. GOTO(label) - ПРЫГНУТЬ НА МЕТКУ. ВЕРНУТЬСЯ БУДЕТ НЕЛЬЗЯ. GOTO(METKA)
  60. ПРИМЕЧАНИЕ: метки делаются так $ METKA:
  61. GOSUB(label) - ИДТИ НА МЕТКУ С ВОЗМОЖНОСТЬЮ ВОЗВРАТА. GOSUB(METKA)
  62. RETURN - ВОЗВРАТИТЬСЯ ТУДА, ОТКУДА ПРИШЕЛ
  63.  
  64. Изображения
  65. ------------
  66. IMAGE name ( "filename" ) - ЗАГРУЖАЕТ КАРТИНКУ. IMAGE KARTINKA1 ( "TEST.BMP", 1 ) 1 ЗНАЧИТ ЧТО РОЗОВОГО ЦВЕТА НЕ БУДЕТ
  67. SETPOINT(x,y,color) - УСТАНАВЛИВАЕТ ТОЧКУ В КАРТИНКЕ. KARTINKA1.SETPOINT ( 10,10,RED)
  68. GETPOINT(x,y) - ВЗЯТИЕ ТОЧКИ ИЗ КАРТИНКИ ULONG TZVET = KARTINKA1.GETPOINT (X,Y)
  69. WIDTH - ШИРИНА КАРТИНКИ KARTINKA1.WIDTH
  70. HEIGHT - ВЫСОТА КАРТИНКИ.
  71. DRAW(...) - РИСОВАТЬ КАРТИНКУ ИЛИ ШРИФТ. KARTINKA1.DRAW(X,Y) ИЛИ KARTINKA1.DRAW(X,Y,CX,CY,CW,CH) ДЛЯ ЧАСТИЧНОЙ ОТРИСОВКИ
  72. SETALPHA(n) - устанавливает прозрачность изображению от 0 (прозрачный) до 255 (непрозрачный). $ KARTINKA1.SETALPHA(128)
  73. SCALE(x) - масштабирует картинку на целую степень. не использовать много раз, иначе память всю съедите. $ KARTINKA1.SCALE(2.0f) х2 $ KARTINKA1.SCALE(0.5f) /2
  74. ROTATE(a) - поворачивает картинку на ПРЯМОЙ угол. тоже часто не используйте. создали - повернули и пользуйтесь. $ KARTINKA1.ROTATE(270) $ KARTINKA1.ROTATE (-90)
  75. FLIPV() - отразить по вертикали. KARTINKA1.FLIPV(). тоже часто не использовать
  76. FLIPH() - отразить по горизонтали. KARTINKA1.FLIPH(). тоже часто не использовать
  77. RIMAGE name ( "filename" ) - другой тип картинки. объявлением похож на IMAGE. но после объявления нужно сделать просчет поворотов с некоторой точностью. перед просчетом рекомендуется увеличить картинку вдвое чтобы пиксели не "поехали".
  78. PRECACHE(n) - просчет поворотов. $ RIMAGE tank ( "tank.png" ) $ tank.PRECACHE ( 10 ) $ - будет создано 36 поворотов (360/10). Чем меньше число точности, тем больше памяти и времени займет просчет поворотов.
  79. Рисование RIMAGE также отличается от IMAGE. SETALPHA для RIMAGE не работает. Вот как рисуется RIMAGE:
  80. tank.DRAW(x,y,angle) или tank.DRAW(x,y,angle,alpha). Angle это угол в градусах. Будет выбрано изображение с ближайшим доступным просчитанным углом.
  81.  
  82.  
  83. Файлы
  84. ------
  85. FILEWRITER name ( "filename" ) - СОЗДАЁТ ФАЙЛОВОГО ПИСАТЕЛЯ. FILEWRITER FP1 ( "TEST.TXT" )
  86. FILEREADER name ( "filename" ) - СОЗДАЁТ ФАЙЛОВОГО ЧИТАТЕЛЯ. FILEREADER FCHI1 ( "TEST.TXT" )
  87. OPEN("filename") - ЕСЛИ ФАЙЛОВЫЙ НЕ ИНИЦИАЛИЗИРОВАН, МОЖНО ОТКРЫТЬ ПОЗЖЕ. FP1.OPEN ( "TEST.TXT" )
  88. CLOSE() - ЗАКРЫТИЕ ФАЙЛОВОГО. FP1.CLOSE()
  89. WRITE(file,data) - ПИСАТЬ В ФАЙЛ. WRITE(FP1,"TEST")
  90. READ(file,var) - ЧИТАТЬ ИЗ ФАЙЛА В ПЕРЕМЕННУЮ. $ STRING S $ READ(FCHI1, S)
  91.  
  92. Разное
  93. ------
  94. CONVERT(A,B) - ПЕРЕВОДИТ ВЕЛИЧИНЫ ИЗ ПЕРВОЙ ВО ВТОРУЮ. $ STRING S $ INT X = 5 $ CONVERT(X,S). В S БУДЕТ "5"
  95. RANDOMIZE() - МЕШАТЬ СЛУЧАЙНЫЕ ЦИФРЫ СЛУЧАЙНЫМ ОБРАЗОМ, ЧТОБЫ БЫЛО СЛУЧАЙНЕЙ. НО МОЖНО И ПЕРЕДАТЬ ЗЕРНО RANDOMIZE(4)
  96. RANDOM - ВЫДАТЬ СЛУЧАЙНОЕ ЧИСЛО. INT R = RANDOM(10) В ЧИСЛЕ R БУДЕТ ЧИСЛО ОТ 0 ДО 9
  97. Есть еще математические функции, они будут рассмотрены ниже.
  98. SYSTEM ("..команда..") - выполнить системную команду. calc, например, запустит калькулятор
  99.  
  100. Шрифты
  101. ------
  102. FONT name ( "filename", size) - ЗАГРУЖАЕТ ШРИФТ. FONT shrift1 ( "TEST.TTF", 16 ). 16 - РАЗМЕР В ПИКСЕЛЯХ.
  103. ПРИНИМАЮТСЯ ТОЛЬКО TTF. РИСУЕТСЯ ШРИФТ ТАК: shrift1.DRAW ( x,y,message,color)
  104. Как реализовать команду PRINT, см ниже в разделе МАКРОСЫ. Шрифты можно взять в папке WINDOWS.
  105.  
  106. Графика
  107. -------
  108. LINE(...) - РИСОВАТЬ ЛИНИЮ. LINE (X1,Y1,X2,Y2,ЦВЕТ). ЦВЕТА СМ. НИЖЕ
  109. CIRCLE(...) - РИСОВАТЬ КРУГ. CIRCLE (X,Y,РАДИУС,ЦВЕТ)
  110. RECT(...) - РИСОВАТЬ ПРЯМОУГОЛЬНИК. RECT (X,Y,ШИРИНА,ВЫСОТА,ТОЛЩИНА,ЦВЕТ)
  111. FCIRCLE(...) - ЗАКРАШЕННЫЙ КРУГ.
  112. FRECT(...) - ЗАКРАШЕННЫЙ ПРЯМОУГОЛЬНИК. !В ОТЛИЧИЕ ОТ ПРОСТОГО, ТОЛЩИНА ЛИНИИ ЗДЕСЬ НЕ ПЕРЕДАЕТСЯ!
  113.  
  114. Тайминг
  115. -------
  116. WAIT(N) - ЖДАТЬ N МИЛЛИСЕКУНД. WAIT(500) - ПОДОЖДЕТ ПОЛСЕКУНДЫ. ИСПОЛЬЗУЙТЕ НЕБОЛЬШИЕ ЗНАЧЕНИЯ В ЦИКЛАХ, ЧТОБЫ РАЗГРУЗИТЬ CPU
  117. DELTA - встроенная переменная, хранящая время в миллисекундах прошедшее с прошлого вызова команды GETDELTA
  118. GETDELTA - получает новую дельту. делает возможным использование функции CAPFPS(n). использовать в начале цикла.
  119. CAPFPS(fps) - использовать в конце цикла, чтобы подождать ровно столько, чтобы FPS был равен определенному числу. $ CAPFPS(60)
  120.  
  121. Ввод
  122. ----
  123. INPUT - ПРИНЯТЬ ВВОД - УЗНАТЬ КАКАЯ КЛАВИША НАЖАТА ИТП
  124. KEY(X) - ЕСЛИ ВЫЗЫВАЛСЯ ВВОД, МОЖНО УЗНАТЬ НАЖАТА ЛИ КЛАВИША. KLAV(ENTER) БУДЕТ РАВНЯТЬСЯ 1/TRUE ЕСЛИ НАЖАТ ENTER.
  125. BUTTON(X) - ПОХОЖИМ ОБРАЗОМ ПОСЛЕ ПОЛУЧЕНИЯ ВВОДА МОЖНО УЗНАТЬ О СОСТОЯНИИ КНОПОК МЫШИ. НАЗВАНИЯ ВСЕХ КНОПОК СМ. НИЖЕ
  126. MOUSEX - А ТАКЖЕ КООРДИНАТЫ МЫШИ ПО ОСИ АБСЦИССЫ
  127. MOUSEY - И ОРДИНАТЫ
  128.  
  129. Звуки
  130. -----
  131. SOUND name ( "filename" ) - ЗАГРУЖАЕТ ЗВУК. SOUND ZVUK1 ( "TEST.WAV" )
  132. PLAY() - ИГРАТЬ ЗВУК. ZVUK1.PLAY(). ZVUK1.PLAY(leftvolume,rightvolume,channel)
  133. STOP() - ОСТАНОВИТЬ ЗВУК. ZVUK1.STOP(). Доступно только если указывалась громкость и канал. каналов всего 8 (0-7). -1 - любой доступный канал
  134. LOOP() - ЗАЦИКЛИТЬ ЗВУК.
  135. STOPSOUNDS - глобально останавливает все звуки.
  136.  
  137. Музыка:
  138. -------
  139. MUSIC name = LOADMUSIC ( "filename" )
  140. Поддерживаются форматы wav, ogg, mp3, трекерная музыка. формат вроде бы 44100 16 бит
  141. PLAYMUSIC(name) - начинает играть музыку
  142. STOPMUSIC - глобально останавливает музыку
  143. PAUSEMUSIC - глобально ПРИостанавливает музыку
  144. RESUMEMUSIC - продолжает приостановленную музыку
  145.  
  146. ОПЕРАТОРЫ ВЕТВЛЕНИЯ
  147. -------------------
  148.  
  149. ===
  150. IF:
  151. ===
  152.  
  153. Пример программы, использующей IF. Поиграйтесь со значениями A и B
  154.  
  155. #include <DUMMY>
  156.  
  157. $ WINDOW
  158. $ FONT FONT1 ( "test.ttf", 16 )
  159. $ INT A = 5, B = 7
  160. $ IF (A > B) THEN
  161. $ FONT1.DRAW (0,0,"A bolshe B",RED)
  162. $ ELSEIF (A >= B ) THEN
  163. $ FONT1.DRAW (0,0,"A bolshe ili ravno B",RED)
  164. $ ELSE
  165. $ FONT1.DRAW (0,0,"A menshe B",RED)
  166. $ ENDIF
  167. $ UPDATE
  168. $ WAIT(1000)
  169. $ END
  170.  
  171. Запомните, что == это оператор сравнения, а = - оператор присваивания. Другие операторы сравнений: != (не равно), >, >=, <, <=.
  172.  
  173. Можно объединять несколько условий с помощью операторов AND, OR и NOT
  174. $ IF (A > B) OR ( A == B ) THEN
  175. $ FONT1.DRAW (0,0,"A bolshe B",RED)
  176.  
  177. Есть еще тернарный оператор
  178. условие ? действияесливыполняется : действияеслиНЕвыполняется
  179. $ (A>B OR A==B) ? FONT1.DRAW (0,0,"A bolshe B",RED) : 0 //0 - значит ничего не делать
  180.  
  181. Мы избавились от назойливых функций, классов и прочей ереси из мира ООП. Но осталось одно зло - циклы. Будьте осторожны, старайтесь использовать GOTO(метка), GOSUB(метка) и RETURN там где можно. Там где не получается - используйте следующие конструкции:
  182. ====
  183. FOR:
  184. ====
  185. $ FOR (INT I=0;I<10;I++)
  186. $ .....действия.....
  187. $ NEXT
  188.  
  189. Пример (с предположением, что макрос PRINT определен, про МАКРОСЫ см. ниже ) печатает числа от 0 до 9:
  190. $ FOR (INT I=0;I<10;I++)
  191. $ STRING S
  192. $ CONVERT ( I, S )
  193. $ PRINT ( S )
  194. $ NEXT
  195. ======
  196. WHILE:
  197. ======
  198. $ WHILE ( условие )
  199. $ ....действия......
  200. $ WEND
  201. Пример:
  202. $ INT I=0
  203. $ WHILE ( I<10 )
  204. $ STRING S
  205. $ CONVERT ( I, S )
  206. $ PRINT ( S )
  207. $ I++
  208. $ WEND
  209.  
  210. ===
  211. DO:
  212. ===
  213. $ DO
  214. $ .....действия......
  215. $ REDO ( условие )
  216. DO от WHILE отличается тем, что DO выполнится хотя бы один раз, а WHILE не выполнится ни разу если условие не соблюдено.
  217.  
  218. Пример:
  219. $ DO
  220. $ STRING S
  221. $ CONVERT ( I, S )
  222. $ PRINT ( S )
  223. $ I++
  224. $ REDO ( I<10 )
  225.  
  226. ======
  227. SELECT
  228. ======
  229.  
  230. $ SELECT (переменная)
  231. $ CASE значение:
  232. $ ..действия..
  233. $ BREAK
  234. $ CASE значение:
  235. $ ..действия..
  236. $ BREAK
  237. $ DEFAULT:
  238. $ ..действия..
  239. $ BREAK
  240. $ ENDSELECT
  241. Учтите, что SELECT нельзя использовать для строк.
  242. ПРИМЕР:
  243. $ INT I=1
  244. $ SELECT (I)
  245. $ CASE 0:
  246. $ PRINT ( "zero" )
  247. $ BREAK
  248. $ CASE 1:
  249. $ PRINT ( "one" )
  250. $ BREAK
  251. $ DEFAULT:
  252. $ PRINT ( "unknown" )
  253. $ BREAK
  254. $ ENDSELECT
  255.  
  256.  
  257. Полезные команды для циклов:
  258. ----------------------------
  259. BREAK - выйти из цикла
  260. CONTINUE - перескочить на начало цикла
  261.  
  262. ==========================================
  263. ТИПЫ ДАННЫХ
  264. ==========================================
  265. BOOL - булев тип. значение 1 (TRUE) или 0 (FALSE)
  266. INT - целое число от -30 до 30 тысяч
  267. CINT - такое же целое число, но его нельзя будет изменить. удобно для констант
  268. UINT - беззнаковое целое ( до 60 тысяч)
  269. LONG - Большое ЧИСЛО. миллионы
  270. ULONG - Большое Беззнаковое число. без знака минус то есть.
  271. STRING - строка
  272. CHAR - символ
  273. FLOAT - число с плавающей точкой пониженной точности. для экономии памяти
  274. DOUBLE - число с плавающей точкой повышенной точности
  275.  
  276. Модификатор CONST сделает число неизменным. Объявлять нужно сразу. Пример $ CONST LONG L = 5
  277.  
  278. Объявления переменных:
  279. $ ТИП идентификатор_переменной
  280. или
  281. $ ТИП идентификатор_переменной = присваиваемое_значение
  282.  
  283. =================
  284. СТРОКОВЫЕ ФУНКЦИИ
  285. =================
  286. Можно получать отдельные символы - STRING G="abcd" $ G[2] вернет 'c'.
  287. Строки можно складывать с помощью +
  288. Длина строки - G.LENGTH выдаст 4
  289. Часть строки - G.MID(start,N) выдаст строку из N символов, начиная со start
  290.  
  291. Есть функция для замены текста внутри строки:
  292. STRING text1 = "text to be replaced"
  293. STRING text2 = "to be"
  294. STRING text3 = REPLACE ( text1, text2, "was" )
  295. В text3 будет "text was replaced"
  296.  
  297. Есть функция разбиения строки на несколько:
  298. STRING gge = "testing split string"
  299. STRING strl[256] //массив, в котором будут храниться строки
  300. INT cncnt = SPLIT ( gge, ' ', strl ) //разделитель - пробел ' '
  301. // cncnt содержит полученное количество элементов
  302. FOR (int ie = 0; ie < cncnt; ie++) //печатаем все элементы
  303. PRINT ( strl[ie] ) //функцию PRINT см. в макросах
  304. NEXT
  305. Получится:
  306. testing
  307. split
  308. string
  309.  
  310. Для сравнения строк можно использовать такую функцию:
  311. STRING a = "test"
  312. STRING b = "test"
  313. IF (a.COMPARE(b)==0) THEN //сравниваем a с b
  314. //если они идентичны, этот код выполнится
  315. ENDIF
  316.  
  317. ========
  318. МАССИВЫ
  319. ========
  320.  
  321. Массивы обозначаются [] скобками. Двойные - двойными [][]:
  322.  
  323. $ INT ARR[10]
  324. $ ARR[0]=5
  325. $ ARR[1]=6
  326. или
  327. $ INT ARR[]={1,2,7,4}
  328.  
  329. ==========================================
  330. ВЕКТОРЫ
  331. ==========================================
  332. VECTOR vect1 (x,y) или VECTOR name() для вектора со значениями 0,0
  333. vect1.x, vect1.y - доступ к значениям
  334. vect1.SET(2.3d,-2.5d) - установка значений. d значит double
  335. vect1.NORMALIZE() - нормализует вектор
  336. vect1.GETANGLE() - возвращает угол в ГРАДУСАХ*
  337. vect1.MOVE(ANGLE,STEP) - движет в сторону указанного угла на расстояние равное STEP
  338. Векторы можно также перемножать, складывать, сравнивать как и обычные типы не только с векторами но и с дробными числами.
  339.  
  340. ==========================================
  341. *Чтобы сконвертировать градусы в радианы и наоборот (пример):
  342. ==========================================
  343. DOUBLE R = RADIANS(180)
  344. DOUBLE D = DEGREES(R)
  345.  
  346. =========
  347. ОПЕРАТОРЫ
  348. =========
  349. Используются операторы как в языке Си:
  350. + - / * += -= *= /= ++ --
  351. Умножение и деление имеют высший приоритет, так что пользуйтесь скобками в неоднозначных ситуациях.
  352.  
  353. ============
  354. МАКРОСЫ
  355. ============
  356. Макросы это мощные команды процессора. С их помощью можно создавать свои функции. Например, можно реализовать функцию PRINT, чтобы каждый раз не писать имя шрифта. Допустим мы загрузили шрифт в переменную FONT1. А в переменной COLOR у нас хранится цвет.
  357. $ FONT FONT1 ( "test.ttf", 16 )
  358. $ ULONG COLOR = 0xFF0000 // можно написать RED
  359.  
  360. В самом начале программы, без знака доллара пишем:
  361.  
  362. #define PRINT(X,Y,M) FONT1.DRAW((X),(Y),(M),COLOR)
  363. Это и есть наша макрофункция.
  364.  
  365. Теперь, в программе можно написать:
  366. $ PRINT ( 0, 0, "Hello!" ) // будет написано красным цветом
  367. $ COLOR = CYAN
  368. $ PRINT ( 0, 20, "Hello!" ) // будет написано голубым цветом
  369.  
  370. Полный код этой программы:
  371. --------------------------
  372. #include <DUMMY>
  373. #define PRINT(X,Y,M) FONT1.DRAW((X),(Y),(M),COLOR)
  374. $ WINDOW
  375. $ FONT FONT1 ( "test.ttf", 16 )
  376. $ ULONG COLOR = RED
  377. $ PRINT ( 0, 0, "Hello!" )
  378. $ COLOR = CYAN
  379. $ PRINT ( 0, 20, "Hello!" )
  380. $ UPDATE
  381. $ WAIT (1000)
  382. $ END
  383.  
  384.  
  385.  
  386. Давайте немного модифицируем нашу программу, чтобы переход на новые строчки осуществлялся автоматически. Для этого создадим переменные TEXTX и TEXTY, а также TEXTHEIGHT.
  387. $ INT TEXTX = 0, TEXTY = 0, TEXTHEIGHT = 16, TEXTMARGIN = 4
  388. В начале программы ( после #include <DUMMY> ) напишем обновленную макрофункцию:
  389. #define PRINT(M) FONT1.DRAW(TEXTX,TEXTY,(M),COLOR);TEXTY+=TEXTHEIGHT+TEXTMARGIN
  390. Добавим еще пару функций, которые были в старом добром BASIC:
  391. #define LOCATE(X,Y) TEXTX=(X);TEXTY=(Y);
  392. #define CLS(C) LOCATE(0,0);CLEAR((C))
  393.  
  394. -------------------------
  395. Вот программа с примером:
  396. -------------------------
  397. #include <DUMMY>
  398. #define PRINT(M) FONT1.DRAW(TEXTX,TEXTY,(M),COLOR);TEXTY+=TEXTHEIGHT+TEXTMARGIN
  399. #define LOCATE(X,Y) TEXTX=(X);TEXTY=(Y);
  400. #define CLS(C) LOCATE(0,0);CLEAR((C))
  401. $ WINDOW
  402. $ INT TEXTX = 0, TEXTY = 0, TEXTHEIGHT = 16, TEXTMARGIN = 4
  403. $ FONT FONT1 ( "test.ttf", TEXTHEIGHT )
  404. $ ULONG COLOR = RED
  405. $ PRINT ( "Hello!" )
  406. $ COLOR = CYAN
  407. $ PRINT ( "Hello!" )
  408. $ UPDATE
  409. $ WAIT (1000)
  410. $ CLS (BLACK)
  411. $ PRINT ( "Cleared!" )
  412. $ LOCATE ( 200, 200 )
  413. $ PRINT ( "Moved!" )
  414. $ UPDATE
  415. $ WAIT (1000)
  416. $ END
  417.  
  418. Как видите, возможности макросов очень обширны. Это последнее слово в программировании. Используйте макросы, чтобы облегчить свои задачи.
  419.  
  420. ==================================================
  421. ПРИЛОЖЕНИЕ: КНОПКИ, ЦВЕТА и МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
  422. ==================================================
  423.  
  424. Кнопки мыши: LB, MB, RB, WUP, WDOWN
  425.  
  426. Названия клавиш
  427. ===============
  428. BACKSPACE ,TAB ,CLEAR ,ENTER ,PAUSE ,ESCAPE ,SPACE,EXCLAIM ,QUOTEDBL,HASH ,DOLLAR ,AMPERSAND ,QUOTE ,LEFTPAREN ,RIGHTPAREN ,ASTERISK ,PLUS ,COMMA,MINUS ,PERIOD ,SLASH ,_0 ,_1 ,_2 ,_3 ,_4 ,_5 ,_6 ,_7 ,_8 ,_9 ,COLON ,SEMICOLON,LESS,EQUALS ,GREATER ,QUESTION ,AT ,LEFTBRACKET ,BACKSLASH ,RIGHTBRACKET ,CARET ,UNDERSCORE ,BACKQUOTE ,a,b,c,d,e,f,g,h,i,j,k,l,m,o,p,q,r,s,t,u,v,w,x,y,z,DEL,KP0 ,KP1 ,KP2 ,KP3 ,KP4 ,KP5 ,KP6 ,KP7 ,KP8 ,KP9 ,KP_PERIOD ,KP_DIVIDE ,KP_MULTIPLY ,KP_MINUS ,KP_PLUS ,KP_ENTER ,KP_EQUALS ,UP ,DOWN ,RIGHT ,LEFT ,INSERT ,HOME ,END ,PAGEUP ,PAGEDOWN ,F1 ,F2 ,F3 ,F4 ,F5 ,F6 ,F7 ,F8 ,F9 ,F10 ,F11 ,F12 ,F13 ,F14 ,F15 ,NUMLOCK ,CAPSLOCK ,SCROLLOCK ,RSHIFT ,LSHIFT ,RCTRL ,LCTRL ,RALT ,LALT
  429.  
  430. Цвета и их значения в HTML формате.
  431. Можно создавать свои цвета
  432. ----------------------------------
  433. RED 0xFF0000
  434. BLUE 0x0000FF
  435. GREEN 0x00FF00
  436. YELLOW 0xFFFF00
  437. MAGENTA 0xFF00FF
  438. CYAN 0x00FFFF
  439. BLACK 0
  440. WHITE 0xFFFFFF
  441. GRAY 0x888888
  442. DARKGRAY 0x444444
  443. SILVER 0xAAAAAA
  444. BROWN 0x752500
  445. ORANGE 0xFF5000
  446. DARKRED 0x750000
  447. DARKGREEN 0x007500
  448. DARKBLUE 0x000075
  449.  
  450.  
  451. ========
  452. ЧИСЛО ПИ
  453. ========
  454. PI - содержит число Пи.
  455.  
  456. Математические функции
  457. ----------------------
  458. ABS Возвращает абсолютную величину числа
  459. ACOS арккосинус
  460. ACOSH гиперболический арккосинус
  461. ASIN арксинус
  462. ASINH гиперболический арксинус
  463. ATAN арктангенс
  464. ATAN2 арктангенс с двумя параметрами
  465. ATANH гиперболический арктангенс
  466. CBRT кубический корень
  467. CEIL округление до ближайшего большего целого числа
  468. COPYSIGN(X,Y) возвращает величину, абсолютное значение которой равно x, но знак которой соответствует знаку y
  469. COS косинус
  470. COSH гиперболический косинус
  471. ERF функция ошибок
  472. ERFC Дополнительная функция ошибок
  473. EXP вычисление экспоненты
  474. EXP2(X) значение числа 2, возведённого в степень x, pow(2,x)
  475. EXPM1(X) значение функции pow(e,x)-1
  476. FABS абсолютная величина (числа с плавающей точкой)
  477. FDIM(X,Y) вычисление положительной разницы между x и y, fmax(x-y, 0)
  478. FLOOR округление до ближайшего меньшего целого числа
  479. FMA(X,Y,Z) значение функции (x * y) + z
  480. FMAX(X,Y) наибольшее значение среди x и y
  481. FMIN(X,Y) наименьшее значение среди x и y
  482. FMOD вычисление остатка от деления нацело для чисел с плавающей точкой
  483. FREXP разбивает число с плавающей точкой на мантиссу и показатель степени.
  484. HYPOT(X,Y) гипотенуза, sqrt(x*x + y*y)
  485. ILOGB экспонента числа с плавающей точкой, конвертированная в int
  486. LDEXP умножение числа с плавающей точкой на целую степень двух
  487. LGAMMA натуральный логарифм абсолютного значения гамма-функции
  488. LLRINT округление до ближайшего целого (возвращает long long)
  489. LLROUND округление до ближайшего целого в направлении от нуля (возвращает long long)
  490. LOG натуральный логарифм
  491. LOG10 логарифм по основанию 10
  492. LOG1P(X) натуральный логарифм 1 + x
  493. LOG2 логарифм по основанию 2
  494. LOGB целочисленная часть логарифма x по основанию 2
  495. LRINT округление до ближайшего целого (возвращает long)
  496. LROUND округление до ближайшего целого в направлении от нуля (возвращает long)
  497. NEXTAFTER(X,Y) следующий ближайшее представимое для x (по направлению к y)
  498. NEXTTOWARD(X,Y) то же, что и nextafter, но y имеет тип long double
  499. POW(X,Y) результат возведения x в степень y
  500. REMAINDER(X,Y) вычисляет остаток от деления согласно стандарту IEC 60559
  501. RINT округление до целого (возвращает int) с вызовом ошибки inexact, если результат отличается от аргумента.
  502. ROUND округление до целого (возвращает double)
  503. SCALBLN(X,N) x * FLT_RADIX^n (n is long)
  504. SCALBN(X,N) x * FLT_RADIX^n (n is int)
  505. SIN синус
  506. SINH гиперболический синус
  507. SQRT квадратный корень
  508. TAN тангенс
  509. TANH гиперболический тангенс
  510. TGAMMA гамма-функция
  511. TRUNC округление до ближайшего целого числа в направлении к нулю
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement