Download Latest Version DUMMY.7z (11.3 MB) Get Updates
Home
Name Modified Size InfoDownloads / Week
README.txt 2012-08-19 46.7 kB
DUMMY.7z 2012-08-14 11.3 MB
Totals: 2 Items   11.4 MB 0
 dummy2d устарел, попробуйте jdummy2d: http://jdummy2d.sourceforge.net/ ВНИМАНИЕ! ЭТОТ README-ФАЙЛ ВСЕГДА СВЕЖЕЕ ЧЕМ ТОТ, ЧТО В АРХИВЕ! SORRY, ONLY RUSSIAN REAMDE CURRENTLY AVAILABLE. ================================================ dummy2d (далее просто DUMMY) - простой язык программирования для 2D игр ================================================ версия за август 2012. автор - jabberx ================================================ https://sourceforge.net/projects/dummy2d/ dummy2d (DUMMY) полностью бесплатен для коммерческого и некоммерческого использования если есть вопросы - регистрируйтесь на sourceforge и пишите в Wiki ================================================ Здравствуй, дорогой русский создатель игр. Ты скачал лучший на свете язык программирования. Он не такой как все. Все языки программирования сложные и запутанные, а этот простой. Но вместе с тем он довольно мощный и быстрый. С его помощью ты легко сделаешь игру (двухмерную). Ты научишься рисовать линии, прямоугольники, круги, выводить в окно текст, изображения или часть изображения, проигрывать звуки, проверять состояния клавиш и манипулятора "мышь". Надеюсь, ты распаковал этот архив на диск Эс. Это самый надежный диск, потому что он системный. Путь должен быть таким: C:\DUMMY\. В папке DUMMY должны быть папки data, dlls и example (пример игры - понг). Но если ты распаковал на другой диск или в другой путь, ничего - просто придется внимательно подредактировать make.bat и всё будет хорошо. ========================================== ДЛЯ НАЧАЛА ========================================== Тебе надо создать файл main.txt, положить рядом с ним make.bat (найдешь в папке C:\DUMMY\example-tetris или в любой другой папке с примером. Примеров, кстати аж 6 штук!). Береги этот файл (речь о make.bat). Он тебе понадобится. Создай рядом папку data и клади в неё свои картинки, шрифты, звуки. Когда напишешь свою программу, запустишь make.bat и если не будет никаких ошибок, то окошко будет пустым. Если будут ошибки, ты увидишь номер строчки с ошибкой. В папке data ( там будет много всяких файлов, не пугайся ) тебе нужен GAME.exe. Ты можешь запустить и run.bat, который появится после успешной компиляции, но тогда на фоне будет висеть черное окошко. Поэтому лучше перейди в папку data и запусти GAME.exe. Это твоя игра. Но учти, чтобы распространять игру, тебе нужно будет упаковать всю папку data в архив. Некоторые dll можешь перед запаковкой удалить, например libpng (если не загружаешь png файлы), vorbis и ogg (если не играешь ogg), smpeg (если не играешь mp3), mikmod (если не играешь трекерную музыку). Остальные лучше не трогать. В папке data твоей игры должен лежать default.ttf - это дефолтный шрифт. Его можешь заменить на другой, но не удаляй. В начале своей программы напиши строчку: #include <DUMMY> Инклудэ это мощная команда макропроцессора компьютерных команд. Ты можешь написать #include "kusok.txt" в любом месте своей программы и код из kusok.txt встроится на то место. Это называется модульность. Модульность нужна чтобы код не превращался в спагетти. После того как ты написал строчку #include <DUMMY>, начинай писать саму программу. Каждая новая строчка должна начинаться со знака доллара. Затем делай отступы. Хотя бы один пробел. Отступы делаются для удобства чтения. $ WAIT(1000) $ END Это простейшая программа, состоящая из трех строчек. Она создаёт пустое окно и показывает его в течение секунды. #include <DUMMY> вначале и END в конце - это обязательные команды твоей программы. Ширина и высота окна задается по желанию один раз, перед #include <DUMMY>: #define WWIDTH 1024 #define WHEIGHT 768 #include <DUMMY> $ WAIT(1000) $ END Для того, чтобы игра запускалась в полноэкранном режиме, нужно добавить команду #define FULLSCREEN #define FULLSCREEN #define WWIDTH 1024 #define WHEIGHT 768 #include <DUMMY> $ WAIT(1000) $ END По умолчанию окно имеет размеры 640 на 480. Переключиться в полноэкранный режим и обратно можно в любой момент в программе с помощью команды TOGGLE. Типичная программа с пустым игровым циклом выглядит так: #include <DUMMY> $ INT VAR1 // инициализация переменных $ RESETGAME: $ VAR1 = 0 // очистка переменных $ GOTO(START) $ LOGIC: // в этом блоке для любых передвижений ит.п. разумно использовать DELTA (величина в мс, обычно около 17) $ IF(KEY[ESCAPE]) THEN $ EXIT $ ENDIF $ RETURN $ RENDER: $ CLS(BLACK) // очистка экрана и позиции текстового курсора // здесь начинается отрисовка $ PRINT("Hello!") // здесь кончается отрисовка $ UPDATE // показ всего, что нарисовали в один момент $ RETURN $ START: $ INPUT // получение ввода (без этого проверка кнопок не будет работать // и вообще INPUT - в игровом цикле обязательная вещь, // даже в скринсейвере где вы не принимаете никакого ввода) $ GETDELTA // рассчет DELTA (также требуется для работы CAPFPS) $ GOSUB(LOGIC) $ GOSUB(RENDER) $ CAPFPS(60) // ограничение скорости кадров (для экономии энергии) // в особо динамичных играх возможно лучше ставить 120 // сделайте 120 в example-shmup (потому что я забыл и оставил 60) $ GOTO(START) $ END Распространяя игру не забудь удалить make.bat из архива с игрой, т.к. некоторые могут случайно запустить его и удалить исполняемый файл игры. Для распространения игры можешь использовать запаковщик-установщик типа InnoSetup. В этом случае никакие батники или лазанья среди кучи файлов в поисках GAME.exe игроку не понадобятся. ========================================== О СРЕДЕ РАЗРАБОТКИ ========================================== Ты можешь писать свою программу в обычном блокноте. Да! Невероятно, но DUMMY не требует каких-то хитромудрых "СТУДИЙ". Хорошим выбором будет Notepad++. Можно также писать в Microsoft Office Excel (если ты хорошо им владеешь, то тебе будет удобнее, чем в блокноте). Во многих текстовых редакторах есть подсветка синтаксиса и автодополнения. Если захочешь настроить свои - в папке DUMMY есть keywords.txt (ключевые слова для подсветки) и autocomplete (ключевые слова для автодополнения в формате xml, подойдут для notepad++). Если не хочешь возиться с настройкой - поставь любой похожий синтаксис, например Smalltalk. ========================================== А ТЕПЕРЬ ПОДРОБНЕЕ ОБО ВСЕХ ВСЕХ КОМАНДАХ: ========================================== Главное ------- WW - ИСПОЛЬЗУЕТСЯ ДЛЯ _ПОЛУЧЕНИЯ_ ШИРИНЫ ОКНА. СОКРАЩЕНИЕ ДЛЯ WWIDTH WH - ТО ЖЕ САМОЕ ДЛЯ ВЫСОТЫ TITLE("..") - ЗАДАЁТ ЗАГОЛОВОК ОКНУ SHOWFPS - показать текущую скорость кадров в заголовке. использовать после GETDELTA TOGGLE - КОМАНДА ПЕРЕКЛЮЧЕНИЯ МЕЖДУ ОКОННЫМ И ПОЛНОЭКРАННЫМ РЕЖИМОМ CLEAR(c) - ОЧИСТИТЬ ОКНО. УДАЛИТЬ ВСЁ НАРИСОВАННОЕ. CLEAR(RED) ОЧИСТИТ КРАСНЫМ ЦВЕТОМ. ПРОСТО CLEAR() - ЧЕРНЫМ CLS(c) - ОЧИСТИТЬ ОКНО ЗАДАННЫМ ЦВЕТОМ И УСТАНОВИТЬ (LOCATE) ТЕКСТОВЫЙ КУРСОР В ПОЗИЦИЮ 0,0 UPDATE - ОБНОВИТЬ ОКНО. ВСЁ, ЧТО БЫЛО НАРИСОВАНО - ПОКАЖЕТСЯ В ОКНЕ. BEGIN - НАЧАЛО ЛОКАЛЬНОЙ ОБЛАСТИ. ЧТОБЫ НЕ СОРИТЬ: ВСЕ ПЕРМЕННЫЕ, СОЗДАННЫЕ В ЛОКАЛЬНОЙ ОБЛАСТИ БУДУТ ДОСТУПНЫ ТОЛЬКО В НЕЙ. END - КОНЕЦ ЛОКАЛЬНОЙ ОБЛАСТИ. ТАКЖЕ СТАВИТСЯ В САМОМ КОНЦЕ ПРОГРАММЫ. НЕ ПУТАТЬ С ВЫХОДОМ ИЗ ПРОГРАММЫ. ВЫХОД ЭТО EXIT EXIT - НЕМЕДЛЕННЫЙ ВЫХОД ИЗ ПРОГРАММЫ. GOTO(label) - ПРЫГНУТЬ НА МЕТКУ. ВЕРНУТЬСЯ БУДЕТ НЕЛЬЗЯ. GOTO(METKA) ПРИМЕЧАНИЕ: метки делаются так $ METKA: GOSUB(label) - ИДТИ НА МЕТКУ С ВОЗМОЖНОСТЬЮ ВОЗВРАТА. GOSUB(METKA) RETURN - ВОЗВРАТИТЬСЯ ТУДА, ОТКУДА ПРИШЕЛ JUMP(условие,метка) - ПРЫГНУТЬ НА МЕТКУ, ЕСЛИ УСЛОВИЕ ВЫПОЛНЯЕТСЯ RJUMP(условие,метка) - ИДТИ НА МЕТКУ С ВОЗМОЖНОСТЬЮ ВОЗВРАТА, ЕСЛИ УСЛОВИЕ ВЫПОЛНЯЕТСЯ Изображения ------------ IMAGE name ( "filename" ) - ЗАГРУЖАЕТ КАРТИНКУ. IMAGE KARTINKA1 ( "TEST.BMP", 1 ) 1 ЗНАЧИТ ЧТО РОЗОВОГО ЦВЕТА НЕ БУДЕТ SETPOINT(x,y,color) - УСТАНАВЛИВАЕТ ТОЧКУ В КАРТИНКЕ. KARTINKA1.SETPOINT ( 10,10,RED) GETPOINT(x,y) - ВЗЯТИЕ ТОЧКИ ИЗ КАРТИНКИ ULONG TZVET = KARTINKA1.GETPOINT (X,Y) WIDTH - ШИРИНА КАРТИНКИ KARTINKA1.WIDTH HEIGHT - ВЫСОТА КАРТИНКИ. DRAW(...) - РИСОВАТЬ КАРТИНКУ ИЛИ ШРИФТ. KARTINKA1.DRAW(X,Y) ИЛИ KARTINKA1.DRAW(X,Y,CX,CY,CW,CH) ДЛЯ ЧАСТИЧНОЙ ОТРИСОВКИ SETALPHA(n) - устанавливает прозрачность изображению от 0 (прозрачный) до 255 (непрозрачный). $ KARTINKA1.SETALPHA(128) SCALE(x) - масштабирует картинку на целую степень. не использовать много раз, иначе память всю съедите. $ KARTINKA1.SCALE(2.0f) х2 $ KARTINKA1.SCALE(0.5f) /2 ROTATE(a) - поворачивает картинку на ПРЯМОЙ угол. тоже часто не используйте. создали - повернули и пользуйтесь. $ KARTINKA1.ROTATE(270) $ KARTINKA1.ROTATE (-90) FLIPV() - отразить по вертикали. KARTINKA1.FLIPV(). тоже часто не использовать FLIPH() - отразить по горизонтали. KARTINKA1.FLIPH(). тоже часто не использовать SAVEBMP(картинка,имя файла) RIMAGE name ( "filename" ) - другой тип картинки. объявлением похож на IMAGE. но после объявления можно сделать просчет поворотов с некоторой точностью. перед просчетом рекомендуется увеличить картинку вдвое чтобы пиксели не "поехали". PRECACHE(n) - просчет поворотов. $ RIMAGE tank ( "tank.png" ) $ tank.PRECACHE ( 10 ) $ - будет создано 36 поворотов (360/10). Чем меньше число точности, тем больше памяти и времени займет просчет поворотов. Рисование RIMAGE также отличается от IMAGE. SETALPHA для RIMAGE не работает. Вот как рисуется RIMAGE: tank.DRAW(x,y,angle) или tank.DRAW(x,y,angle,alpha). Angle это угол в градусах. Будет выбрано изображение с ближайшим доступным просчитанным углом. Файлы ------ FILEWRITER name ( "filename" ) - СОЗДАЁТ ФАЙЛОВОГО ПИСАТЕЛЯ. FILEWRITER FP1 ( "TEST.TXT" ) FILEREADER name ( "filename" ) - СОЗДАЁТ ФАЙЛОВОГО ЧИТАТЕЛЯ. FILEREADER FCHI1 ( "TEST.TXT" ) OPEN("filename") - ЕСЛИ ФАЙЛОВЫЙ НЕ ИНИЦИАЛИЗИРОВАН, МОЖНО ОТКРЫТЬ ПОЗЖЕ. FP1.OPEN ( "TEST.TXT" ) CLOSE() - ЗАКРЫТИЕ ФАЙЛОВОГО. FP1.CLOSE() WRITE(file,data) - ПИСАТЬ В ФАЙЛ. WRITE(FP1,"TEST") READ(file,var) - ЧИТАТЬ ИЗ ФАЙЛА В ПЕРЕМЕННУЮ. $ STRING S $ READ(FCHI1, S) ПРИМЕЧАНИЕ: при записи в файл добавляйте '\n' между переменными, чтобы потом можно было прочитать их по очереди Разное ------ CONVERT(A,B) - ПЕРЕВОДИТ ВЕЛИЧИНЫ ИЗ ПЕРВОЙ ВО ВТОРУЮ. $ STRING S $ INT X = 5 $ CONVERT(X,S). В S БУДЕТ "5" RANDOMIZE() - МЕШАТЬ СЛУЧАЙНЫЕ ЦИФРЫ СЛУЧАЙНЫМ ОБРАЗОМ, ЧТОБЫ БЫЛО СЛУЧАЙНЕЙ. НО МОЖНО И ПЕРЕДАТЬ ЗЕРНО RANDOMIZE(4) RANDOM - ВЫДАТЬ СЛУЧАЙНОЕ ЧИСЛО. INT R = RANDOM(10) В ЧИСЛЕ R БУДЕТ ЧИСЛО ОТ 0 ДО 9 Есть еще математические функции, они будут рассмотрены ниже. SYSTEM ("..команда..") - выполнить системную команду. calc, например, запустит калькулятор VAL(S) - ВОЗВРАЩАЕТ ЧИСЛОВОЕ ЗНАЧЕНИЕ СТРОКИ DVAL(S) - ВОЗВРАЩАЕТ ЧИСЛОВОЕ ЗНАЧЕНИЕ СТРОКИ (ЧИСЛО С ПЛАВАЮЩЕЙ ТОЧКОЙ) TXT(V) - ВОЗВРАЩАЕТ СТРОКОВОЕ ЗНАЧЕНИЕ ИЗ ЧИСЛА PUSH, POP, а также эти команды с приставками I, UI, L, UL, F, D см ниже в приложении "СТЕК" MOD - возвращает число без знака SETCURSORPOS(х,у) - устанавливает позицию курсора HIDECURSOR - прячет курсор SHOWCURSOR - показывает курсор Шрифты ------ FONT name ( "filename", size) - ЗАГРУЖАЕТ ШРИФТ. FONT shrift1 ( "TEST.TTF", 16 ). 16 - РАЗМЕР В ПИКСЕЛЯХ. ПРИНИМАЮТСЯ ТОЛЬКО TTF. РИСУЕТСЯ ШРИФТ ТАК: shrift1.DRAW ( x,y,message,color) Шрифты можно взять в папке WINDOWS. Для удобства существуют также команды PRINT и LOCATE PRINT(текст) печатает текст шрифтом default.ttf из папки дата и переводит строку команда IPRINT(число) эквивалентна PRINT(TXT(число)) перед #include <DUMMY> надо указать #define FONTSIZE N, где N - желаемый размер шрифта цвет текста же можно менять в любом месте программы: TEXTCOLOR = RED LOCATE(X,Y) - устанавливает точку, с которой будет печататься следующий текст по команде PRINT Графика ------- LINE(...) - РИСОВАТЬ ЛИНИЮ. LINE (X1,Y1,X2,Y2,ЦВЕТ). ЦВЕТА СМ. НИЖЕ CIRCLE(...) - РИСОВАТЬ КРУГ. CIRCLE (X,Y,РАДИУС,ЦВЕТ) RECT(...) - РИСОВАТЬ ПРЯМОУГОЛЬНИК. RECT (X,Y,ШИРИНА,ВЫСОТА,ТОЛЩИНА,ЦВЕТ) FCIRCLE(...) - ЗАКРАШЕННЫЙ КРУГ. FRECT(...) - ЗАКРАШЕННЫЙ ПРЯМОУГОЛЬНИК. !В ОТЛИЧИЕ ОТ ПРОСТОГО, ТОЛЩИНА ЛИНИИ ЗДЕСЬ НЕ ПЕРЕДАЕТСЯ! GETPIXEL(X,Y) - получает цвет пикселя из окна SETPIXEL(X,Y,C) - устанавливает цвет пикселя в окне. Внимание! При попытке сделать SET/GET PIXEL с неверными координатами (меньше нуля или больше размеров окна) программа вылетит. Делайте проверку сами, если надо. Встроенной проверки нет во имя производительности. Тайминг ------- WAIT(N) - ЖДАТЬ N МИЛЛИСЕКУНД. WAIT(500) - ПОДОЖДЕТ ПОЛСЕКУНДЫ. ИСПОЛЬЗУЙТЕ НЕБОЛЬШИЕ ЗНАЧЕНИЯ В ЦИКЛАХ, ЧТОБЫ РАЗГРУЗИТЬ CPU DELAY(N) - ЖДАТЬ N МИЛЛИСЕКУНД. ПРИ ЭТОМ DELTA не будет расти, в отличие от WAIT. Точность до 10 мс. DELTA - встроенная переменная, хранящая время в миллисекундах прошедшее с прошлого вызова команды GETDELTA GETDELTA - получает новую дельту. делает возможным использование функции CAPFPS(n). использовать в начале цикла. CAPFPS(fps) - использовать в конце цикла, чтобы подождать ровно столько, чтобы FPS был равен определенному числу. $ CAPFPS(60) Ввод ---- INPUT - ПРИНЯТЬ ВВОД - УЗНАТЬ КАКАЯ КЛАВИША НАЖАТА ИТП KEY(..) - ЕСЛИ ВЫЗЫВАЛСЯ ВВОД, МОЖНО УЗНАТЬ НАЖАТА ЛИ КЛАВИША. KEY(ENTER) БУДЕТ РАВНЯТЬСЯ 1/TRUE ЕСЛИ НАЖАТ ENTER. Для проверки можно использовать и KEY[..]. Можно обнулить флаг нажатой клавиши: KEY[ENTER]=false BUTTON(..) - ПОХОЖИМ ОБРАЗОМ ПОСЛЕ ПОЛУЧЕНИЯ ВВОДА МОЖНО УЗНАТЬ О СОСТОЯНИИ КНОПОК МЫШИ. НАЗВАНИЯ ВСЕХ КНОПОК СМ. НИЖЕ MOUSEX - А ТАКЖЕ КООРДИНАТЫ МЫШИ ПО ОСИ АБСЦИССЫ MOUSEY - И ОРДИНАТЫ Звуки ----- SOUND name ( "filename" ) - ЗАГРУЖАЕТ ЗВУК. SOUND ZVUK1 ( "TEST.WAV" ) PLAY() - ИГРАТЬ ЗВУК. ZVUK1.PLAY(). ZVUK1.PLAY(leftvolume,rightvolume,channel) STOP() - ОСТАНОВИТЬ ЗВУК. ZVUK1.STOP(). Доступно только если указывалась громкость и канал. каналов всего 8 (0-7). -1 - любой доступный канал LOOP(leftvol,rightvol,channel) - ЗАЦИКЛИТЬ ЗВУК. STOPSOUNDS - глобально останавливает все звуки. Музыка: ------- MUSIC name = LOADMUSIC ( "filename" ) Поддерживаются форматы wav, ogg, mp3, трекерная музыка. формат вроде бы 44100 16 бит PLAYMUSIC(name) - начинает играть музыку STOPMUSIC - глобально останавливает музыку PAUSEMUSIC - глобально ПРИостанавливает музыку RESUMEMUSIC - продолжает приостановленную музыку ОПЕРАТОРЫ ВЕТВЛЕНИЯ ------------------- === IF: === Пример программы, использующей IF. Поиграйтесь со значениями A и B #include <DUMMY> $ FONT FONT1 ( "test.ttf", 16 ) $ INT A = 5, B = 7 $ IF (A > B) THEN $ FONT1.DRAW (0,0,"A bolshe B",RED) $ ELSEIF (A >= B ) THEN $ FONT1.DRAW (0,0,"A bolshe ili ravno B",RED) $ ELSE $ FONT1.DRAW (0,0,"A menshe B",RED) $ ENDIF $ UPDATE $ WAIT(1000) $ END Запомните, что == это оператор сравнения, а = - оператор присваивания. Другие операторы сравнений: != (не равно), >, >=, <, <=. Можно объединять несколько условий с помощью операторов AND, OR и NOT $ IF (A>B OR A==B) THEN $ FONT1.DRAW (0,0,"A bolshe B",RED) $ ENDIF Есть еще тернарный оператор условие ? действияесливыполняется : действияеслиНЕвыполняется $ (A>B OR A==B) ? FONT1.DRAW (0,0,"A bolshe B",RED) : 0 //0 - значит ничего не делать Мы избавились от назойливых функций, классов и прочей ереси из мира ООП. Но осталось одно зло - циклы. Будьте осторожны, старайтесь использовать GOTO(метка), GOSUB(метка) и RETURN там где можно. Там где не получается - используйте следующие конструкции: ==== FOR: ==== $ FOR (INT I=0;I<10;I++) $ .....действия..... $ NEXT Пример (с предположением, что макрос PRINT определен, про МАКРОСЫ см. ниже ) печатает числа от 0 до 9: $ FOR (INT I=0;I<10;I++) $ STRING S $ CONVERT ( I, S ) $ PRINT ( S ) $ NEXT ====== WHILE: ====== $ WHILE ( условие ) $ ....действия...... $ WEND Пример: $ INT I=0 $ WHILE ( I<10 ) $ STRING S $ CONVERT ( I, S ) $ PRINT ( S ) $ I++ $ WEND === DO: === $ DO $ .....действия...... $ REDO ( условие ) DO от WHILE отличается тем, что DO выполнится хотя бы один раз, а WHILE не выполнится ни разу если условие не соблюдено. Пример: $ DO $ STRING S $ CONVERT ( I, S ) $ PRINT ( S ) $ I++ $ REDO ( I<10 ) ====== SELECT ====== $ SELECT (переменная) $ CASE значение: $ ..действия.. $ BREAK $ CASE значение: $ ..действия.. $ BREAK $ DEFAULT: $ ..действия.. $ BREAK $ ENDSELECT Учтите, что SELECT нельзя использовать для строк. ПРИМЕР: $ INT I=1 $ SELECT (I) $ CASE 0: $ PRINT ( "zero" ) $ BREAK $ CASE 1: $ PRINT ( "one" ) $ BREAK $ DEFAULT: $ PRINT ( "unknown" ) $ BREAK $ ENDSELECT Полезные команды для циклов: ---------------------------- BREAK - выйти из цикла CONTINUE - перескочить на начало цикла ========================================== ТИПЫ ДАННЫХ ========================================== BOOL - булев тип. значение 1 (TRUE) или 0 (FALSE) INT - целое число от -30 до 30 тысяч CINT - такое же целое число, но его нельзя будет изменить. удобно для констант UINT - беззнаковое целое ( до 60 тысяч) LONG - Большое ЧИСЛО. миллионы ULONG - Большое Беззнаковое число. без знака минус то есть. STRING - строка CHAR - символ FLOAT - число с плавающей точкой пониженной точности. для экономии памяти DOUBLE - число с плавающей точкой повышенной точности Модификатор CONST сделает число неизменным. Объявлять нужно сразу. Пример $ CONST LONG L = 5 Объявления переменных: $ ТИП идентификатор_переменной или $ ТИП идентификатор_переменной = присваиваемое_значение ================= СТРОКОВЫЕ ФУНКЦИИ ================= Можно получать отдельные символы - STRING G="abcd" $ G[2] вернет 'c'. Строки можно складывать с помощью + Длина строки - G.LENGTH выдаст 4 Часть строки - G.MID(start,N) выдаст строку из N символов, начиная со start Есть функция для замены текста внутри строки: STRING text1 = "text to be replaced" STRING text2 = "to be" STRING text3 = REPLACE ( text1, text2, "was" ) В text3 будет "text was replaced" Есть функция разбиения строки на несколько: STRING gge = "testing split string" STRING strl[256] //массив, в котором будут храниться строки INT cncnt = SPLIT ( gge, ' ', strl ) //разделитель - пробел ' ' // cncnt содержит полученное количество элементов FOR (int ie = 0; ie < cncnt; ie++) //печатаем все элементы PRINT ( strl[ie] ) //функцию PRINT см. в макросах NEXT Получится: testing split string Для сравнения строк можно использовать такую функцию: STRING a = "test" STRING b = "test" IF (a.COMPARE(b)==0) THEN //сравниваем a с b //если они идентичны, этот код выполнится ENDIF ======== МАССИВЫ ======== Массивы обозначаются [] скобками. Двойные - двойными [][]: $ INT ARR[10] $ ARR[0]=5 $ ARR[1]=6 или $ INT ARR[]={1,2,7,4} ========================================== ВЕКТОРЫ ========================================== VECTOR vect1 (x,y) или VECTOR name() для вектора со значениями 0,0 vect1.x, vect1.y - доступ к значениям vect1.SET(2.3d,-2.5d) - установка значений. d значит double vect1.NORMALIZE() - нормализует вектор vect1.GETANGLE() - возвращает угол в ГРАДУСАХ* vect1.MOVE(ANGLE,STEP) - движет в сторону указанного угла на расстояние равное STEP Векторы можно также перемножать, складывать, сравнивать как и обычные типы не только с векторами но и с дробными числами. approxAngle(angle1, angle2, speed) - приближает angle1 к angle2 на величину speed. ========================================== *Чтобы сконвертировать градусы в радианы и наоборот (пример): ========================================== DOUBLE R = RADIANS(180) DOUBLE D = DEGREES(R) ========= ОПЕРАТОРЫ ========= Используются операторы как в языке Си: + - / * += -= *= /= ++ -- Умножение и деление имеют высший приоритет, так что пользуйтесь скобками в неоднозначных ситуациях. ============ МАКРОСЫ ============ ПРИМЕЧАНИЕ: макрокоманды PRINT, CLS и LOCATE УЖЕ ВКЛЮЧЕНЫ В DUMMY и реализованы немного по-другому. Следующие макросы показаны лишь в качестве примера. Макросы это мощные команды процессора. С их помощью можно создавать свои функции. Например, можно реализовать функцию PRINT, чтобы каждый раз не писать имя шрифта. Допустим мы загрузили шрифт в переменную FONT1. А в переменной COLOR у нас хранится цвет. $ FONT FONT1 ( "test.ttf", 16 ) $ ULONG COLOR = 0xFF0000 // можно написать RED В самом начале программы, без знака доллара пишем: #define PRINT(X,Y,M) FONT1.DRAW((X),(Y),(M),COLOR) Это и есть наша макрофункция. Теперь, в программе можно написать: $ PRINT ( 0, 0, "Hello!" ) // будет написано красным цветом $ COLOR = CYAN $ PRINT ( 0, 20, "Hello!" ) // будет написано голубым цветом Полный код этой программы: -------------------------- #include <DUMMY> #define PRINT(X,Y,M) FONT1.DRAW((X),(Y),(M),COLOR) $ FONT FONT1 ( "test.ttf", 16 ) $ ULONG COLOR = RED $ PRINT ( 0, 0, "Hello!" ) $ COLOR = CYAN $ PRINT ( 0, 20, "Hello!" ) $ UPDATE $ WAIT (1000) $ END Давайте немного модифицируем нашу программу, чтобы переход на новые строчки осуществлялся автоматически. Для этого создадим переменные TEXTX и TEXTY, а также TEXTHEIGHT. $ INT TEXTX = 0, TEXTY = 0, TEXTHEIGHT = 16, TEXTMARGIN = 4 В начале программы ( после #include <DUMMY> ) напишем обновленную макрофункцию: #define PRINT(M) FONT1.DRAW(TEXTX,TEXTY,(M),COLOR);TEXTY+=TEXTHEIGHT+TEXTMARGIN Добавим еще пару функций, которые были в старом добром BASIC: #define LOCATE(X,Y) TEXTX=(X);TEXTY=(Y); #define CLS(C) LOCATE(0,0);CLEAR((C)) ------------------------- Вот программа с примером: ------------------------- #include <DUMMY> #define PRINT(M) FONT1.DRAW(TEXTX,TEXTY,(M),COLOR);TEXTY+=TEXTHEIGHT+TEXTMARGIN #define LOCATE(X,Y) TEXTX=(X);TEXTY=(Y); #define CLS(C) LOCATE(0,0);CLEAR((C)) $ WINDOW $ INT TEXTX = 0, TEXTY = 0, TEXTHEIGHT = 16, TEXTMARGIN = 4 $ FONT FONT1 ( "test.ttf", TEXTHEIGHT ) $ ULONG COLOR = RED $ PRINT ( "Hello!" ) $ COLOR = CYAN $ PRINT ( "Hello!" ) $ UPDATE $ WAIT (1000) $ CLS (BLACK) $ PRINT ( "Cleared!" ) $ LOCATE ( 200, 200 ) $ PRINT ( "Moved!" ) $ UPDATE $ WAIT (1000) $ END Как видите, возможности макросов очень обширны. Это последнее слово в программировании. Используйте макросы, чтобы облегчить свои задачи. Еще раз напоминаю: PRINT, LOCATE и CLS уже реализованы в DUMMY. ================================================== ПРИЛОЖЕНИЕ: КНОПКИ, ЦВЕТА и МАТЕМАТИЧЕСКИЕ ФУНКЦИИ ================================================== Кнопки мыши: LB, MB, RB, WUP, WDOWN Названия клавиш =============== 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,n,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 Цвета и их значения в HTML формате. Можно создавать свои цвета ---------------------------------- RED 0xFF0000 BLUE 0x0000FF GREEN 0x00FF00 YELLOW 0xFFFF00 MAGENTA 0xFF00FF CYAN 0x00FFFF BLACK 0 WHITE 0xFFFFFF GRAY 0x888888 DARKGRAY 0x444444 SILVER 0xAAAAAA BROWN 0x752500 ORANGE 0xFF5000 DARKRED 0x750000 DARKGREEN 0x007500 DARKBLUE 0x000075 ======== ЧИСЛО ПИ ======== PI - содержит число Пи. Математические функции ---------------------- ABS Возвращает абсолютную величину числа ACOS арккосинус ACOSH гиперболический арккосинус ASIN арксинус ASINH гиперболический арксинус ATAN арктангенс ATAN2 арктангенс с двумя параметрами ATANH гиперболический арктангенс CBRT кубический корень CEIL округление до ближайшего большего целого числа COPYSIGN(X,Y) возвращает величину, абсолютное значение которой равно x, но знак которой соответствует знаку y COS косинус COSH гиперболический косинус ERF функция ошибок ERFC Дополнительная функция ошибок EXP вычисление экспоненты EXP2(X) значение числа 2, возведённого в степень x, pow(2,x) EXPM1(X) значение функции pow(e,x)-1 FABS абсолютная величина (числа с плавающей точкой) FDIM(X,Y) вычисление положительной разницы между x и y, fmax(x-y, 0) FLOOR округление до ближайшего меньшего целого числа FMA(X,Y,Z) значение функции (x * y) + z FMAX(X,Y) наибольшее значение среди x и y FMIN(X,Y) наименьшее значение среди x и y FMOD вычисление остатка от деления нацело для чисел с плавающей точкой FREXP разбивает число с плавающей точкой на мантиссу и показатель степени. HYPOT(X,Y) гипотенуза, sqrt(x*x + y*y) ILOGB экспонента числа с плавающей точкой, конвертированная в int LDEXP умножение числа с плавающей точкой на целую степень двух LGAMMA натуральный логарифм абсолютного значения гамма-функции LLRINT округление до ближайшего целого (возвращает long long) LLROUND округление до ближайшего целого в направлении от нуля (возвращает long long) LOG натуральный логарифм LOG10 логарифм по основанию 10 LOG1P(X) натуральный логарифм 1 + x LOG2 логарифм по основанию 2 LOGB целочисленная часть логарифма x по основанию 2 LRINT округление до ближайшего целого (возвращает long) LROUND округление до ближайшего целого в направлении от нуля (возвращает long) NEXTAFTER(X,Y) следующий ближайшее представимое для x (по направлению к y) NEXTTOWARD(X,Y) то же, что и nextafter, но y имеет тип long double POW(X,Y) результат возведения x в степень y REMAINDER(X,Y) вычисляет остаток от деления согласно стандарту IEC 60559 RINT округление до целого (возвращает int) с вызовом ошибки inexact, если результат отличается от аргумента. ROUND округление до целого (возвращает double) SCALBLN(X,N) x * FLT_RADIX^n (n is long) SCALBN(X,N) x * FLT_RADIX^n (n is int) SIN синус SINH гиперболический синус SQRT квадратный корень TAN тангенс TANH гиперболический тангенс TGAMMA гамма-функция TRUNC округление до ближайшего целого числа в направлении к нулю ============== ПРИЛОЖЕНИЕ: СТЕК ============== СТЕК и EXT1 Здравствуй, дорогой русский разработчик игр. Ты наверняка уже написал много замечательных игр с помощью ДУММИ. Сегодня я хочу тебя познакомить со стеком. Что такое стек? Стек это замечательная вещь. Во многих учебниках о стеке говорят как о стопке тарелок. Ты кладешь тарелки в стопку и можешь снимать только сверху. Так и с переменными - кладешь несколько переменных, вызываешь подпрограмму, и достаешь в этой подпрограмме эти переменные (в обратном порядке). Есть две замечательные команды: POP и PUSH. PUSH помещает в стек, POP достаёт. Они работают с байтами (CHAR). Байты имеют значение от 0 до 255 либо символ ('a', ';' итп). Пример использования команд PUSH и POP: CHAR Z = 124 PUSH(10) PUSH('t') .... где-то в другом месте: POP(CHAR T) // во вновь созданной переменной T будет символ t POP(Z) - в Z будет 10 POP(CHAR N) // в N будет 124 Для целых чисел есть эквивалент - IPUSH, IPOP. Другие приставки: UI - беззнаковое целое, L - длинное целое, UL - беззнаковое длинное целое, F - плавающая точка, D - плавающая точка двойной точности. Эти приставки предваряют POP и PUSH: DPOP, UIPUSH. Следует помнить о глубине стека. В DUMMY она составляет 65535 единиц для каждого типа стека (чего должно хватить с головой). Итак, ты можешь использовать стек чтобы передавать подпрограммам значения: #include <DUMMY> $ GOTO(START) /* перескочим нашу подпрограмму */ $ SUB1: $ BEGIN /* создадим локальную область, чтобы не сорить переменными */ $ IPOP(INT Y) /* обрати внимание: мы сначала достаём ИГРЕК, так как он был положен последним */ $ IPOP(INT X) /* а теперь ИКС */ $ LOCATE(X,Y) $ PRINT("TEST!") $ UPDATE $ END /* конец локальной области */ $ RETURN $ START: $ IPUSH(160) /* кладем ИКС */ $ IPUSH(120) /* кладем ИГРЕК */ $ GOSUB(SUB1) $ WAIT(1000) $ END ================ ПРИЛОЖЕНИЕ: ОТЛАДКА ================ Отладка ДУММИ приложений ----------------------------------- Чтобы отлаживать свою игру на ДУММИ, тебе нужно убрать на время команду -mwindows из make.bat. Дальше ты в любом месте программы пишешь команду: $ print ( "текст\n" ) print пиши именно маленькими буквами. \n - значит, перенос строки. Есть еще printLine, который сам переводит строчку. В качестве аргумента ты можешь указать какую нибудь переменную. Суть отладки в том, что ты "ловишь" момент выполнения какого-либо участка кода и можешь точно узнать выполняется он или нет или какое значение у определенной переменной в этот момент и т.д. Это и называется отладка. Когда ты закончишь отладку, верни команду -mwindows на место. Свои отладочные сообщения можешь оставить - их никто не увидит. Другой вариант: Отладка с помощью PRINT прямо в игровом окне -------------------------------------------- Суть в отслеживании переменных с помощью вывода их на графическое окно командами LOCATE/PRINT. ==================================================== ТРОЛЛИНГ ЛИ ЭТО? РЕАЛЬНО ЛИ НАПИСАТЬ ИГРУ НА DUMMY? ==================================================== Если в двух словах: нет, не троллинг. Да, README написан с некоторой долей юмора. И да, игру написать реально и DUMMY не создаёт никаких препятствий. Многие считают непреодолимым препятствием: отстуствие классов, функций, поощрение использования GOTO, отсутствие IDE. Тем не менее, программисты на ассемблере на это не жалуются. Надо принять это как другой стиль программирования. Если вы сильно привыкли к ООП, то вам будет тяжело. Напомню, что многие игровые хиты написаны именно на ассемблере - более низкоуровневом языке нежели DUMMY. В те времена существовал и BASIC и игры на нём писали, но они были медленные. DUMMY же по скорости сравним с С++, а по простоте - с BASIC. ================= ЧТО ВНУТРИ DUMMY? ================= Урезанный для экономии веса GNU Compiler Collection, библиотеки SDL (и то и другое для Windows) и главное: собственная надстройка над SDL и языком С++, а также специальным образом приготовленные пакетные файлы для безболезненной компиляции и запуска. =================================== ЧТО НАСЧЕТ РАЗРАБОТКИ ИЗ ПОД LINUX? =================================== Если вы хорошо в этом разбираетесь, то заглянёте в make.bat и соберете собственный DUMMY для Linux - вам понадобится gcc и dev версии SDL, возможно придется подправить пути к заголовочным файлам в файле DUMMY. =============================================================== ЕСЛИ ВАМ ЧЕГО-ТО НЕ ХВАТАЕТ И ВЫ ХОТИТЕ ЧТО-ТО ИЗМЕНИТЬ В DUMMY =============================================================== Учитывайте, что это уже будет другой язык и его исходный код будет невыполним у других DUMMY-программистов. Поэтому либо не делайте этого, либо распространяйте вместе с изменненным исходником DUMMY.
Source: README.txt, updated 2012-08-19