Advertisement
Guest User

Untitled

a guest
Feb 29th, 2012
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 38.15 KB | None | 0 0
  1. ================================================
  2. DUMMY - простой язык программирования для 2D игр
  3. ================================================
  4. версия за март 2012. автор - 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-tetris). Береги этот файл. Он тебе понадобится. Создай рядом папку 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. $ WAIT(1000)
  25. $ END
  26. Это простейшая программа, состоящая из трех строчек. Она создаёт пустое окно и показывает его в течение секунды. WINDOW или FULLSCREEN (полноэкранный режим) вначале и END в конце - это обязательные команды твоей программы.
  27. Ширина и высота окна задается по желанию один раз, перед #include <DUMMY>:
  28.  
  29. #define WWIDTH 1024
  30. #define WHEIGHT 768
  31. #include <DUMMY>
  32. $ WAIT(1000)
  33. $ END
  34.  
  35. Для того, чтобы игра запускалась в полноэкранном режиме, нужно добавить команду #define FULLSCREEN
  36.  
  37. #define FULLSCREEN
  38. #define WWIDTH 1024
  39. #define WHEIGHT 768
  40. #include <DUMMY>
  41. $ WAIT(1000)
  42. $ END
  43.  
  44. ==========================================
  45. О СРЕДЕ РАЗРАБОТКИ
  46. ==========================================
  47. Ты можешь писать свою программу в обычном блокноте. Да! Невероятно, но DUMMY не требует каких-то хитромудрых "СТУДИЙ". Хорошим выбором будет Notepad++. Можно также писать в Microsoft Office Excel (если ты хорошо им владеешь, то тебе будет удобнее, чем в блокноте). Во многих текстовых редакторах есть подсветка синтаксиса и автодополнения. Если захочешь настроить свои - в папке DUMMY есть keywords.txt (ключевые слова для подсветки) и autocomplete (ключевые слова для автодополнения в формате xml, подойдут для notepad++).
  48.  
  49. ==========================================
  50. А ТЕПЕРЬ ПОДРОБНЕЕ ОБО ВСЕХ ВСЕХ КОМАНДАХ:
  51. ==========================================
  52.  
  53. Главное
  54. -------
  55. WW - ИСПОЛЬЗУЕТСЯ ДЛЯ _ПОЛУЧЕНИЯ_ ШИРИНЫ ОКНА. СОКРАЩЕНИЕ ДЛЯ WWIDTH
  56. WH - ТО ЖЕ САМОЕ ДЛЯ ВЫСОТЫ
  57. TITLE("..") - ЗАДАЁТ ЗАГОЛОВОК ОКНУ
  58. SHOWFPS - показать текущую скорость кадров в заголовке. использовать после GETDELTA
  59. TOGGLE - КОМАНДА ПЕРЕКЛЮЧЕНИЯ МЕЖДУ ОКОННЫМ И ПОЛНОЭКРАННЫМ РЕЖИМОМ
  60. CLEAR(c) - ОЧИСТИТЬ ОКНО. УДАЛИТЬ ВСЁ НАРИСОВАННОЕ. CLEAR(RED) ОЧИСТИТ КРАСНЫМ ЦВЕТОМ. ПРОСТО CLEAR() - ЧЕРНЫМ
  61. CLS(c) - ОЧИСТИТЬ ОКНО ЗАДАННЫМ ЦВЕТОМ И УСТАНОВИТЬ (LOCATE) ТЕКСТОВЫЙ КУРСОР В ПОЗИЦИЮ 0,0
  62. UPDATE - ОБНОВИТЬ ОКНО. ВСЁ, ЧТО БЫЛО НАРИСОВАНО - ПОКАЖЕТСЯ В ОКНЕ.
  63. BEGIN - НАЧАЛО ЛОКАЛЬНОЙ ОБЛАСТИ. ЧТОБЫ НЕ СОРИТЬ: ВСЕ ПЕРМЕННЫЕ, СОЗДАННЫЕ В ЛОКАЛЬНОЙ ОБЛАСТИ БУДУТ ДОСТУПНЫ ТОЛЬКО В НЕЙ.
  64. END - КОНЕЦ ЛОКАЛЬНОЙ ОБЛАСТИ. ТАКЖЕ СТАВИТСЯ В САМОМ КОНЦЕ ПРОГРАММЫ. НЕ ПУТАТЬ С ВЫХОДОМ ИЗ ПРОГРАММЫ. ВЫХОД ЭТО EXIT
  65. EXIT - НЕМЕДЛЕННЫЙ ВЫХОД ИЗ ПРОГРАММЫ.
  66. GOTO(label) - ПРЫГНУТЬ НА МЕТКУ. ВЕРНУТЬСЯ БУДЕТ НЕЛЬЗЯ. GOTO(METKA)
  67. ПРИМЕЧАНИЕ: метки делаются так $ METKA:
  68. GOSUB(label) - ИДТИ НА МЕТКУ С ВОЗМОЖНОСТЬЮ ВОЗВРАТА. GOSUB(METKA)
  69. RETURN - ВОЗВРАТИТЬСЯ ТУДА, ОТКУДА ПРИШЕЛ
  70. JUMP(условие,метка) - ПРЫГНУТЬ НА МЕТКУ, ЕСЛИ УСЛОВИЕ ВЫПОЛНЯЕТСЯ
  71. RJUMP(условие,метка) - ИДТИ НА МЕТКУ С ВОЗМОЖНОСТЬЮ ВОЗВРАТА, ЕСЛИ УСЛОВИЕ ВЫПОЛНЯЕТСЯ
  72.  
  73. Изображения
  74. ------------
  75. IMAGE name ( "filename" ) - ЗАГРУЖАЕТ КАРТИНКУ. IMAGE KARTINKA1 ( "TEST.BMP", 1 ) 1 ЗНАЧИТ ЧТО РОЗОВОГО ЦВЕТА НЕ БУДЕТ
  76. SETPOINT(x,y,color) - УСТАНАВЛИВАЕТ ТОЧКУ В КАРТИНКЕ. KARTINKA1.SETPOINT ( 10,10,RED)
  77. GETPOINT(x,y) - ВЗЯТИЕ ТОЧКИ ИЗ КАРТИНКИ ULONG TZVET = KARTINKA1.GETPOINT (X,Y)
  78. WIDTH - ШИРИНА КАРТИНКИ KARTINKA1.WIDTH
  79. HEIGHT - ВЫСОТА КАРТИНКИ.
  80. DRAW(...) - РИСОВАТЬ КАРТИНКУ ИЛИ ШРИФТ. KARTINKA1.DRAW(X,Y) ИЛИ KARTINKA1.DRAW(X,Y,CX,CY,CW,CH) ДЛЯ ЧАСТИЧНОЙ ОТРИСОВКИ
  81. SETALPHA(n) - устанавливает прозрачность изображению от 0 (прозрачный) до 255 (непрозрачный). $ KARTINKA1.SETALPHA(128)
  82. SCALE(x) - масштабирует картинку на целую степень. не использовать много раз, иначе память всю съедите. $ KARTINKA1.SCALE(2.0f) х2 $ KARTINKA1.SCALE(0.5f) /2
  83. ROTATE(a) - поворачивает картинку на ПРЯМОЙ угол. тоже часто не используйте. создали - повернули и пользуйтесь. $ KARTINKA1.ROTATE(270) $ KARTINKA1.ROTATE (-90)
  84. FLIPV() - отразить по вертикали. KARTINKA1.FLIPV(). тоже часто не использовать
  85. FLIPH() - отразить по горизонтали. KARTINKA1.FLIPH(). тоже часто не использовать
  86. SAVEBMP(картинка,имя файла)
  87.  
  88. RIMAGE name ( "filename" ) - другой тип картинки. объявлением похож на IMAGE. но после объявления можно сделать просчет поворотов с некоторой точностью. перед просчетом рекомендуется увеличить картинку вдвое чтобы пиксели не "поехали".
  89. PRECACHE(n) - просчет поворотов. $ RIMAGE tank ( "tank.png" ) $ tank.PRECACHE ( 10 ) $ - будет создано 36 поворотов (360/10). Чем меньше число точности, тем больше памяти и времени займет просчет поворотов.
  90. Рисование RIMAGE также отличается от IMAGE. SETALPHA для RIMAGE не работает. Вот как рисуется RIMAGE:
  91. tank.DRAW(x,y,angle) или tank.DRAW(x,y,angle,alpha). Angle это угол в градусах. Будет выбрано изображение с ближайшим доступным просчитанным углом.
  92.  
  93.  
  94. Файлы
  95. ------
  96. FILEWRITER name ( "filename" ) - СОЗДАЁТ ФАЙЛОВОГО ПИСАТЕЛЯ. FILEWRITER FP1 ( "TEST.TXT" )
  97. FILEREADER name ( "filename" ) - СОЗДАЁТ ФАЙЛОВОГО ЧИТАТЕЛЯ. FILEREADER FCHI1 ( "TEST.TXT" )
  98. OPEN("filename") - ЕСЛИ ФАЙЛОВЫЙ НЕ ИНИЦИАЛИЗИРОВАН, МОЖНО ОТКРЫТЬ ПОЗЖЕ. FP1.OPEN ( "TEST.TXT" )
  99. CLOSE() - ЗАКРЫТИЕ ФАЙЛОВОГО. FP1.CLOSE()
  100. WRITE(file,data) - ПИСАТЬ В ФАЙЛ. WRITE(FP1,"TEST")
  101. READ(file,var) - ЧИТАТЬ ИЗ ФАЙЛА В ПЕРЕМЕННУЮ. $ STRING S $ READ(FCHI1, S)
  102. ПРИМЕЧАНИЕ: при записи в файл добавляйте '\n' между переменными, чтобы потом можно было прочитать их по очереди
  103.  
  104. Разное
  105. ------
  106. CONVERT(A,B) - ПЕРЕВОДИТ ВЕЛИЧИНЫ ИЗ ПЕРВОЙ ВО ВТОРУЮ. $ STRING S $ INT X = 5 $ CONVERT(X,S). В S БУДЕТ "5"
  107. RANDOMIZE() - МЕШАТЬ СЛУЧАЙНЫЕ ЦИФРЫ СЛУЧАЙНЫМ ОБРАЗОМ, ЧТОБЫ БЫЛО СЛУЧАЙНЕЙ. НО МОЖНО И ПЕРЕДАТЬ ЗЕРНО RANDOMIZE(4)
  108. RANDOM - ВЫДАТЬ СЛУЧАЙНОЕ ЧИСЛО. INT R = RANDOM(10) В ЧИСЛЕ R БУДЕТ ЧИСЛО ОТ 0 ДО 9
  109. Есть еще математические функции, они будут рассмотрены ниже.
  110. SYSTEM ("..команда..") - выполнить системную команду. calc, например, запустит калькулятор
  111. VAL(S) - ВОЗВРАЩАЕТ ЧИСЛОВОЕ ЗНАЧЕНИЕ СТРОКИ
  112. DVAL(S) - ВОЗВРАЩАЕТ ЧИСЛОВОЕ ЗНАЧЕНИЕ СТРОКИ (ЧИСЛО С ПЛАВАЮЩЕЙ ТОЧКОЙ)
  113. TXT(V) - ВОЗВРАЩАЕТ СТРОКОВОЕ ЗНАЧЕНИЕ ИЗ ЧИСЛА
  114. PUSH, POP, а также эти команды с приставками I, UI, L, UL, F, D см ниже в приложении "СТЕК"
  115. MOD - возвращает число без знака
  116. SETCURSORPOS(х,у) - устанавливает позицию курсора
  117. HIDECURSOR - прячет курсор
  118. SHOWCURSOR - показывает курсор
  119.  
  120. Шрифты
  121. ------
  122. FONT name ( "filename", size) - ЗАГРУЖАЕТ ШРИФТ. FONT shrift1 ( "TEST.TTF", 16 ). 16 - РАЗМЕР В ПИКСЕЛЯХ.
  123. ПРИНИМАЮТСЯ ТОЛЬКО TTF. РИСУЕТСЯ ШРИФТ ТАК: shrift1.DRAW ( x,y,message,color)
  124. Шрифты можно взять в папке WINDOWS.
  125. Для удобства существуют также команды PRINT и LOCATE
  126. PRINT(текст) печатает текст шрифтом default.ttf из папки дата и переводит строку
  127. команда IPRINT(число) эквивалентна PRINT(TXT(число))
  128. перед #include <DUMMY> надо указать #define TEXTSIZE N, где N - желаемый размер шрифта
  129. цвет текста же можно менять в любом месте программы:
  130. TEXTCOLOR = RED
  131. LOCATE(X,Y) - устанавливает точку, с которой будет печататься следующий текст по команде PRINT
  132.  
  133. Графика
  134. -------
  135. LINE(...) - РИСОВАТЬ ЛИНИЮ. LINE (X1,Y1,X2,Y2,ЦВЕТ). ЦВЕТА СМ. НИЖЕ
  136. CIRCLE(...) - РИСОВАТЬ КРУГ. CIRCLE (X,Y,РАДИУС,ЦВЕТ)
  137. RECT(...) - РИСОВАТЬ ПРЯМОУГОЛЬНИК. RECT (X,Y,ШИРИНА,ВЫСОТА,ТОЛЩИНА,ЦВЕТ)
  138. FCIRCLE(...) - ЗАКРАШЕННЫЙ КРУГ.
  139. FRECT(...) - ЗАКРАШЕННЫЙ ПРЯМОУГОЛЬНИК. !В ОТЛИЧИЕ ОТ ПРОСТОГО, ТОЛЩИНА ЛИНИИ ЗДЕСЬ НЕ ПЕРЕДАЕТСЯ!
  140. GETPIXEL(X,Y) - получает цвет пикселя из окна
  141. SETPIXEL(X,Y,C) - устанавливает цвет пикселя в окне
  142.  
  143.  
  144. Тайминг
  145. -------
  146. WAIT(N) - ЖДАТЬ N МИЛЛИСЕКУНД. WAIT(500) - ПОДОЖДЕТ ПОЛСЕКУНДЫ. ИСПОЛЬЗУЙТЕ НЕБОЛЬШИЕ ЗНАЧЕНИЯ В ЦИКЛАХ, ЧТОБЫ РАЗГРУЗИТЬ CPU
  147. DELAY(N) - ЖДАТЬ N МИЛЛИСЕКУНД. ПРИ ЭТОМ DELTA не будет расти, в отличие от WAIT. Точность до 10 мс.
  148. DELTA - встроенная переменная, хранящая время в миллисекундах прошедшее с прошлого вызова команды GETDELTA
  149. GETDELTA - получает новую дельту. делает возможным использование функции CAPFPS(n). использовать в начале цикла.
  150. CAPFPS(fps) - использовать в конце цикла, чтобы подождать ровно столько, чтобы FPS был равен определенному числу. $ CAPFPS(60)
  151.  
  152. Ввод
  153. ----
  154. INPUT - ПРИНЯТЬ ВВОД - УЗНАТЬ КАКАЯ КЛАВИША НАЖАТА ИТП
  155. KEY(..) - ЕСЛИ ВЫЗЫВАЛСЯ ВВОД, МОЖНО УЗНАТЬ НАЖАТА ЛИ КЛАВИША. KEY(ENTER) БУДЕТ РАВНЯТЬСЯ 1/TRUE ЕСЛИ НАЖАТ ENTER. Для проверки можно использовать и KEY[..]. Можно обнулить флаг нажатой клавиши: KEY[ENTER]=false
  156. BUTTON(..) - ПОХОЖИМ ОБРАЗОМ ПОСЛЕ ПОЛУЧЕНИЯ ВВОДА МОЖНО УЗНАТЬ О СОСТОЯНИИ КНОПОК МЫШИ. НАЗВАНИЯ ВСЕХ КНОПОК СМ. НИЖЕ
  157. MOUSEX - А ТАКЖЕ КООРДИНАТЫ МЫШИ ПО ОСИ АБСЦИССЫ
  158. MOUSEY - И ОРДИНАТЫ
  159.  
  160. Звуки
  161. -----
  162. SOUND name ( "filename" ) - ЗАГРУЖАЕТ ЗВУК. SOUND ZVUK1 ( "TEST.WAV" )
  163. PLAY() - ИГРАТЬ ЗВУК. ZVUK1.PLAY(). ZVUK1.PLAY(leftvolume,rightvolume,channel)
  164. STOP() - ОСТАНОВИТЬ ЗВУК. ZVUK1.STOP(). Доступно только если указывалась громкость и канал. каналов всего 8 (0-7). -1 - любой доступный канал
  165. LOOP() - ЗАЦИКЛИТЬ ЗВУК.
  166. STOPSOUNDS - глобально останавливает все звуки.
  167.  
  168. Музыка:
  169. -------
  170. MUSIC name = LOADMUSIC ( "filename" )
  171. Поддерживаются форматы wav, ogg, mp3, трекерная музыка. формат вроде бы 44100 16 бит
  172. PLAYMUSIC(name) - начинает играть музыку
  173. STOPMUSIC - глобально останавливает музыку
  174. PAUSEMUSIC - глобально ПРИостанавливает музыку
  175. RESUMEMUSIC - продолжает приостановленную музыку
  176.  
  177. ОПЕРАТОРЫ ВЕТВЛЕНИЯ
  178. -------------------
  179.  
  180. ===
  181. IF:
  182. ===
  183.  
  184. Пример программы, использующей IF. Поиграйтесь со значениями A и B
  185.  
  186. #include <DUMMY>
  187.  
  188. $ WINDOW
  189. $ FONT FONT1 ( "test.ttf", 16 )
  190. $ INT A = 5, B = 7
  191. $ IF (A > B) THEN
  192. $ FONT1.DRAW (0,0,"A bolshe B",RED)
  193. $ ELSEIF (A >= B ) THEN
  194. $ FONT1.DRAW (0,0,"A bolshe ili ravno B",RED)
  195. $ ELSE
  196. $ FONT1.DRAW (0,0,"A menshe B",RED)
  197. $ ENDIF
  198. $ UPDATE
  199. $ WAIT(1000)
  200. $ END
  201.  
  202. Запомните, что == это оператор сравнения, а = - оператор присваивания. Другие операторы сравнений: != (не равно), >, >=, <, <=.
  203.  
  204. Можно объединять несколько условий с помощью операторов AND, OR и NOT
  205. $ IF (A > B) OR ( A == B ) THEN
  206. $ FONT1.DRAW (0,0,"A bolshe B",RED)
  207.  
  208. Есть еще тернарный оператор
  209. условие ? действияесливыполняется : действияеслиНЕвыполняется
  210. $ (A>B OR A==B) ? FONT1.DRAW (0,0,"A bolshe B",RED) : 0 //0 - значит ничего не делать
  211.  
  212. Мы избавились от назойливых функций, классов и прочей ереси из мира ООП. Но осталось одно зло - циклы. Будьте осторожны, старайтесь использовать GOTO(метка), GOSUB(метка) и RETURN там где можно. Там где не получается - используйте следующие конструкции:
  213. ====
  214. FOR:
  215. ====
  216. $ FOR (INT I=0;I<10;I++)
  217. $ .....действия.....
  218. $ NEXT
  219.  
  220. Пример (с предположением, что макрос PRINT определен, про МАКРОСЫ см. ниже ) печатает числа от 0 до 9:
  221. $ FOR (INT I=0;I<10;I++)
  222. $ STRING S
  223. $ CONVERT ( I, S )
  224. $ PRINT ( S )
  225. $ NEXT
  226. ======
  227. WHILE:
  228. ======
  229. $ WHILE ( условие )
  230. $ ....действия......
  231. $ WEND
  232. Пример:
  233. $ INT I=0
  234. $ WHILE ( I<10 )
  235. $ STRING S
  236. $ CONVERT ( I, S )
  237. $ PRINT ( S )
  238. $ I++
  239. $ WEND
  240.  
  241. ===
  242. DO:
  243. ===
  244. $ DO
  245. $ .....действия......
  246. $ REDO ( условие )
  247. DO от WHILE отличается тем, что DO выполнится хотя бы один раз, а WHILE не выполнится ни разу если условие не соблюдено.
  248.  
  249. Пример:
  250. $ DO
  251. $ STRING S
  252. $ CONVERT ( I, S )
  253. $ PRINT ( S )
  254. $ I++
  255. $ REDO ( I<10 )
  256.  
  257. ======
  258. SELECT
  259. ======
  260.  
  261. $ SELECT (переменная)
  262. $ CASE значение:
  263. $ ..действия..
  264. $ BREAK
  265. $ CASE значение:
  266. $ ..действия..
  267. $ BREAK
  268. $ DEFAULT:
  269. $ ..действия..
  270. $ BREAK
  271. $ ENDSELECT
  272. Учтите, что SELECT нельзя использовать для строк.
  273. ПРИМЕР:
  274. $ INT I=1
  275. $ SELECT (I)
  276. $ CASE 0:
  277. $ PRINT ( "zero" )
  278. $ BREAK
  279. $ CASE 1:
  280. $ PRINT ( "one" )
  281. $ BREAK
  282. $ DEFAULT:
  283. $ PRINT ( "unknown" )
  284. $ BREAK
  285. $ ENDSELECT
  286.  
  287.  
  288. Полезные команды для циклов:
  289. ----------------------------
  290. BREAK - выйти из цикла
  291. CONTINUE - перескочить на начало цикла
  292.  
  293. ==========================================
  294. ТИПЫ ДАННЫХ
  295. ==========================================
  296. BOOL - булев тип. значение 1 (TRUE) или 0 (FALSE)
  297. INT - целое число от -30 до 30 тысяч
  298. CINT - такое же целое число, но его нельзя будет изменить. удобно для констант
  299. UINT - беззнаковое целое ( до 60 тысяч)
  300. LONG - Большое ЧИСЛО. миллионы
  301. ULONG - Большое Беззнаковое число. без знака минус то есть.
  302. STRING - строка
  303. CHAR - символ
  304. FLOAT - число с плавающей точкой пониженной точности. для экономии памяти
  305. DOUBLE - число с плавающей точкой повышенной точности
  306.  
  307. Модификатор CONST сделает число неизменным. Объявлять нужно сразу. Пример $ CONST LONG L = 5
  308.  
  309. Объявления переменных:
  310. $ ТИП идентификатор_переменной
  311. или
  312. $ ТИП идентификатор_переменной = присваиваемое_значение
  313.  
  314. =================
  315. СТРОКОВЫЕ ФУНКЦИИ
  316. =================
  317. Можно получать отдельные символы - STRING G="abcd" $ G[2] вернет 'c'.
  318. Строки можно складывать с помощью +
  319. Длина строки - G.LENGTH выдаст 4
  320. Часть строки - G.MID(start,N) выдаст строку из N символов, начиная со start
  321.  
  322. Есть функция для замены текста внутри строки:
  323. STRING text1 = "text to be replaced"
  324. STRING text2 = "to be"
  325. STRING text3 = REPLACE ( text1, text2, "was" )
  326. В text3 будет "text was replaced"
  327.  
  328. Есть функция разбиения строки на несколько:
  329. STRING gge = "testing split string"
  330. STRING strl[256] //массив, в котором будут храниться строки
  331. INT cncnt = SPLIT ( gge, ' ', strl ) //разделитель - пробел ' '
  332. // cncnt содержит полученное количество элементов
  333. FOR (int ie = 0; ie < cncnt; ie++) //печатаем все элементы
  334. PRINT ( strl[ie] ) //функцию PRINT см. в макросах
  335. NEXT
  336. Получится:
  337. testing
  338. split
  339. string
  340.  
  341. Для сравнения строк можно использовать такую функцию:
  342. STRING a = "test"
  343. STRING b = "test"
  344. IF (a.COMPARE(b)==0) THEN //сравниваем a с b
  345. //если они идентичны, этот код выполнится
  346. ENDIF
  347.  
  348. ========
  349. МАССИВЫ
  350. ========
  351.  
  352. Массивы обозначаются [] скобками. Двойные - двойными [][]:
  353.  
  354. $ INT ARR[10]
  355. $ ARR[0]=5
  356. $ ARR[1]=6
  357. или
  358. $ INT ARR[]={1,2,7,4}
  359.  
  360. ==========================================
  361. ВЕКТОРЫ
  362. ==========================================
  363. VECTOR vect1 (x,y) или VECTOR name() для вектора со значениями 0,0
  364. vect1.x, vect1.y - доступ к значениям
  365. vect1.SET(2.3d,-2.5d) - установка значений. d значит double
  366. vect1.NORMALIZE() - нормализует вектор
  367. vect1.GETANGLE() - возвращает угол в ГРАДУСАХ*
  368. vect1.MOVE(ANGLE,STEP) - движет в сторону указанного угла на расстояние равное STEP
  369. Векторы можно также перемножать, складывать, сравнивать как и обычные типы не только с векторами но и с дробными числами.
  370.  
  371. ==========================================
  372. *Чтобы сконвертировать градусы в радианы и наоборот (пример):
  373. ==========================================
  374. DOUBLE R = RADIANS(180)
  375. DOUBLE D = DEGREES(R)
  376.  
  377. =========
  378. ОПЕРАТОРЫ
  379. =========
  380. Используются операторы как в языке Си:
  381. + - / * += -= *= /= ++ --
  382. Умножение и деление имеют высший приоритет, так что пользуйтесь скобками в неоднозначных ситуациях.
  383.  
  384. ============
  385. МАКРОСЫ
  386. ============
  387.  
  388. ПРИМЕЧАНИЕ: макрокоманды PRINT, CLS и LOCATE УЖЕ ВКЛЮЧЕНЫ В DUMMY и реализованы немного по-другому. Следующие макросы показаны лишь в качестве примера.
  389.  
  390. Макросы это мощные команды процессора. С их помощью можно создавать свои функции. Например, можно реализовать функцию PRINT, чтобы каждый раз не писать имя шрифта. Допустим мы загрузили шрифт в переменную FONT1. А в переменной COLOR у нас хранится цвет.
  391. $ FONT FONT1 ( "test.ttf", 16 )
  392. $ ULONG COLOR = 0xFF0000 // можно написать RED
  393.  
  394. В самом начале программы, без знака доллара пишем:
  395.  
  396. #define PRINT(X,Y,M) FONT1.DRAW((X),(Y),(M),COLOR)
  397. Это и есть наша макрофункция.
  398.  
  399. Теперь, в программе можно написать:
  400. $ PRINT ( 0, 0, "Hello!" ) // будет написано красным цветом
  401. $ COLOR = CYAN
  402. $ PRINT ( 0, 20, "Hello!" ) // будет написано голубым цветом
  403.  
  404. Полный код этой программы:
  405. --------------------------
  406. #include <DUMMY>
  407. #define PRINT(X,Y,M) FONT1.DRAW((X),(Y),(M),COLOR)
  408. $ WINDOW
  409. $ FONT FONT1 ( "test.ttf", 16 )
  410. $ ULONG COLOR = RED
  411. $ PRINT ( 0, 0, "Hello!" )
  412. $ COLOR = CYAN
  413. $ PRINT ( 0, 20, "Hello!" )
  414. $ UPDATE
  415. $ WAIT (1000)
  416. $ END
  417.  
  418.  
  419.  
  420. Давайте немного модифицируем нашу программу, чтобы переход на новые строчки осуществлялся автоматически. Для этого создадим переменные TEXTX и TEXTY, а также TEXTHEIGHT.
  421. $ INT TEXTX = 0, TEXTY = 0, TEXTHEIGHT = 16, TEXTMARGIN = 4
  422. В начале программы ( после #include <DUMMY> ) напишем обновленную макрофункцию:
  423. #define PRINT(M) FONT1.DRAW(TEXTX,TEXTY,(M),COLOR);TEXTY+=TEXTHEIGHT+TEXTMARGIN
  424. Добавим еще пару функций, которые были в старом добром BASIC:
  425. #define LOCATE(X,Y) TEXTX=(X);TEXTY=(Y);
  426. #define CLS(C) LOCATE(0,0);CLEAR((C))
  427.  
  428. -------------------------
  429. Вот программа с примером:
  430. -------------------------
  431. #include <DUMMY>
  432. #define PRINT(M) FONT1.DRAW(TEXTX,TEXTY,(M),COLOR);TEXTY+=TEXTHEIGHT+TEXTMARGIN
  433. #define LOCATE(X,Y) TEXTX=(X);TEXTY=(Y);
  434. #define CLS(C) LOCATE(0,0);CLEAR((C))
  435. $ WINDOW
  436. $ INT TEXTX = 0, TEXTY = 0, TEXTHEIGHT = 16, TEXTMARGIN = 4
  437. $ FONT FONT1 ( "test.ttf", TEXTHEIGHT )
  438. $ ULONG COLOR = RED
  439. $ PRINT ( "Hello!" )
  440. $ COLOR = CYAN
  441. $ PRINT ( "Hello!" )
  442. $ UPDATE
  443. $ WAIT (1000)
  444. $ CLS (BLACK)
  445. $ PRINT ( "Cleared!" )
  446. $ LOCATE ( 200, 200 )
  447. $ PRINT ( "Moved!" )
  448. $ UPDATE
  449. $ WAIT (1000)
  450. $ END
  451.  
  452. Как видите, возможности макросов очень обширны. Это последнее слово в программировании. Используйте макросы, чтобы облегчить свои задачи.
  453.  
  454. ==================================================
  455. ПРИЛОЖЕНИЕ: КНОПКИ, ЦВЕТА и МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
  456. ==================================================
  457.  
  458. Кнопки мыши: LB, MB, RB, WUP, WDOWN
  459.  
  460. Названия клавиш
  461. ===============
  462. 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
  463.  
  464. Цвета и их значения в HTML формате.
  465. Можно создавать свои цвета
  466. ----------------------------------
  467. RED 0xFF0000
  468. BLUE 0x0000FF
  469. GREEN 0x00FF00
  470. YELLOW 0xFFFF00
  471. MAGENTA 0xFF00FF
  472. CYAN 0x00FFFF
  473. BLACK 0
  474. WHITE 0xFFFFFF
  475. GRAY 0x888888
  476. DARKGRAY 0x444444
  477. SILVER 0xAAAAAA
  478. BROWN 0x752500
  479. ORANGE 0xFF5000
  480. DARKRED 0x750000
  481. DARKGREEN 0x007500
  482. DARKBLUE 0x000075
  483.  
  484.  
  485. ========
  486. ЧИСЛО ПИ
  487. ========
  488. PI - содержит число Пи.
  489.  
  490. Математические функции
  491. ----------------------
  492. ABS Возвращает абсолютную величину числа
  493. ACOS арккосинус
  494. ACOSH гиперболический арккосинус
  495. ASIN арксинус
  496. ASINH гиперболический арксинус
  497. ATAN арктангенс
  498. ATAN2 арктангенс с двумя параметрами
  499. ATANH гиперболический арктангенс
  500. CBRT кубический корень
  501. CEIL округление до ближайшего большего целого числа
  502. COPYSIGN(X,Y) возвращает величину, абсолютное значение которой равно x, но знак которой соответствует знаку y
  503. COS косинус
  504. COSH гиперболический косинус
  505. ERF функция ошибок
  506. ERFC Дополнительная функция ошибок
  507. EXP вычисление экспоненты
  508. EXP2(X) значение числа 2, возведённого в степень x, pow(2,x)
  509. EXPM1(X) значение функции pow(e,x)-1
  510. FABS абсолютная величина (числа с плавающей точкой)
  511. FDIM(X,Y) вычисление положительной разницы между x и y, fmax(x-y, 0)
  512. FLOOR округление до ближайшего меньшего целого числа
  513. FMA(X,Y,Z) значение функции (x * y) + z
  514. FMAX(X,Y) наибольшее значение среди x и y
  515. FMIN(X,Y) наименьшее значение среди x и y
  516. FMOD вычисление остатка от деления нацело для чисел с плавающей точкой
  517. FREXP разбивает число с плавающей точкой на мантиссу и показатель степени.
  518. HYPOT(X,Y) гипотенуза, sqrt(x*x + y*y)
  519. ILOGB экспонента числа с плавающей точкой, конвертированная в int
  520. LDEXP умножение числа с плавающей точкой на целую степень двух
  521. LGAMMA натуральный логарифм абсолютного значения гамма-функции
  522. LLRINT округление до ближайшего целого (возвращает long long)
  523. LLROUND округление до ближайшего целого в направлении от нуля (возвращает long long)
  524. LOG натуральный логарифм
  525. LOG10 логарифм по основанию 10
  526. LOG1P(X) натуральный логарифм 1 + x
  527. LOG2 логарифм по основанию 2
  528. LOGB целочисленная часть логарифма x по основанию 2
  529. LRINT округление до ближайшего целого (возвращает long)
  530. LROUND округление до ближайшего целого в направлении от нуля (возвращает long)
  531. NEXTAFTER(X,Y) следующий ближайшее представимое для x (по направлению к y)
  532. NEXTTOWARD(X,Y) то же, что и nextafter, но y имеет тип long double
  533. POW(X,Y) результат возведения x в степень y
  534. REMAINDER(X,Y) вычисляет остаток от деления согласно стандарту IEC 60559
  535. RINT округление до целого (возвращает int) с вызовом ошибки inexact, если результат отличается от аргумента.
  536. ROUND округление до целого (возвращает double)
  537. SCALBLN(X,N) x * FLT_RADIX^n (n is long)
  538. SCALBN(X,N) x * FLT_RADIX^n (n is int)
  539. SIN синус
  540. SINH гиперболический синус
  541. SQRT квадратный корень
  542. TAN тангенс
  543. TANH гиперболический тангенс
  544. TGAMMA гамма-функция
  545. TRUNC округление до ближайшего целого числа в направлении к нулю
  546.  
  547.  
  548. ==============
  549. ПРИЛОЖЕНИЕ: СТЕК
  550. ==============
  551. СТЕК и EXT1
  552.  
  553. Здравствуй, дорогой русский разработчик игр.
  554. Ты наверняка уже написал много замечательных игр с помощью ДУММИ. Сегодня я хочу тебя познакомить со стеком. Что такое стек? Стек это замечательная вещь. Во многих учебниках о стеке говорят как о стопке тарелок. Ты кладешь тарелки в стопку и можешь снимать только сверху. Так и с переменными - кладешь несколько переменных, вызываешь подпрограмму, и достаешь в этой подпрограмме эти переменные (в обратном порядке). Есть две замечательные команды: POP и PUSH. PUSH помещает в стек, POP достаёт. Они работают с байтами (CHAR). Байты имеют значение от 0 до 255 либо символ ('a', ';' итп).
  555. Пример использования команд PUSH и POP:
  556.  
  557. CHAR Z = 124
  558. PUSH(10)
  559. PUSH('t')
  560. ....
  561. где-то в другом месте:
  562. POP(CHAR T) // во вновь созданной переменной T будет символ t
  563. POP(Z) - в Z будет 10
  564. POP(CHAR N) // в N будет 124
  565.  
  566. Для целых чисел есть эквивалент - IPUSH, IPOP. Другие приставки: UI - беззнаковое целое, L - длинное целое, UL - беззнаковое длинное целое, F - плавающая точка, D - плавающая точка двойной точности. Эти приставки предваряют POP и PUSH: DPOP, UIPUSH.
  567. Следует помнить о глубине стека. В DUMMY она составляет 65535 единиц для каждого типа стека (чего должно хватить с головой).
  568.  
  569. Итак, ты можешь использовать стек чтобы передавать подпрограммам значения:
  570.  
  571. #include <DUMMY>
  572. $ GOTO(START) /* перескочим нашу подпрограмму */
  573.  
  574. $ SUB1:
  575. $ BEGIN /* создадим локальную область, чтобы не сорить переменными */
  576. $ IPOP(INT Y) /* обрати внимание: мы сначала достаём ИГРЕК, так как он был положен последним */
  577. $ IPOP(INT X) /* а теперь ИКС */
  578. $ LOCATE(X,Y)
  579. $ PRINT("TEST!")
  580. $ UPDATE
  581. $ END /* конец локальной области */
  582. $ RETURN
  583.  
  584. $ START:
  585. $ IPUSH(160) /* кладем ИКС */
  586. $ IPUSH(120) /* кладем ИГРЕК */
  587. $ GOSUB(SUB1)
  588. $ WAIT(1000)
  589. $ END
  590.  
  591.  
  592. ================
  593. ПРИЛОЖЕНИЕ: ОТЛАДКА
  594. ================
  595.  
  596. Отладка ДУММИ приложений
  597. -----------------------------------
  598. Чтобы отлаживать свою игру на ДУММИ, тебе нужно убрать на время команду -mwindows из make.bat. Дальше ты в любом месте программы пишешь команду:
  599.  
  600. $ print ( "текст\n" )
  601. print пиши именно маленькими буквами. \n - значит, перенос строки.
  602. Есть еще printLine, который сам переводит строчку. В качестве аргумента ты можешь указать какую нибудь переменную. Суть отладки в том, что ты "ловишь" момент выполнения какого-либо участка кода и можешь точно узнать выполняется он или нет или какое значение у определенной переменной в этот момент и т.д. Это и называется отладка.
  603.  
  604. Когда ты закончишь отладку, верни команду -mwindows на место. Свои отладочные сообщения можешь оставить - их никто не увидит.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement