Учебное пособие для "чайников" -=MobileBasic=- В этом учебнике я попробую обьяснить как работать с программой "MobileBasic 1.8" ( для мобильных телефонов). Здесь я изложу всю теорию и практические примеры.Начнем!!! §1. А начнем мы с изучения команд. Вот они Все!!! Основные команды DIR - выводит на экран все программы EDIT L% - редактирование строки L% LIST [L1%[,L2%]] - вывод на экран текста программы; если введен параметр L1%, то выводится только эта строка; если введены оба параметра, то выводится часть программы в интервале L1%-L2% NEW - удаляет программу из буфера RUN - запуск INPUT "...",( /%/$) - ввод переменой, где "..."-комментарий, ( /%/$)-любая переменная PRINT ( /%/$) - вывод любой переменой ( /%/$), постоянной GOTO L% - переход к строке L% IF <1> THEN <2> - условие, где <1> - условие, <2> - исполнимая часть, если условие верно. Например: IF A<5 THEN GOTO 50 FOR P%=1% TO 2% [STEP 3%] | NEXT P% - цикл. P% - переменная цикла, 1% - начало, 2% - конец, 3% - шаг (по умолчанию равен 1).FOR/TO/STEP - начинает цикл, NEXT - заканчивает DEG - перевод в градусы (некоторые функции с угловым аргументом) RAD - перевод в радианы SLEEP MS% - пауза в миллисекундах STOP - остановка программы END - конец программы BYE - выход из среды программировния REM - комментарий TRAP L% - при ошибке передает управление строке L% Работа с программами DELETE "..." - удаляет программу / подпрограмму LIST "..." - сохраняет подпрограмму как текст ENTER "..." - загружает подпрограмму (текст), не стирая остальные строки SAVE "..." - сохраняет программу в закодированом виде (занимает меньше места) LOAD "..." - загружает программу, как код, удаляя все остальные строки Данные, подпрограммы DATA ... - любые данные (текст, числа). Строка не должна иметь какие либо другие операторы. Например: 90 DATA 65,3.0,LOAD,2.2E+2 READ ... - чтение данных, записанных в DATA. Например: READ A%,F,K$,E RESTORE L% - использование данных из строки L% DIM ( /%/$)(N%) - создает любой массив с колличеством элементов N%. Например DIM A%(50) GOSUB L% - выполнить подпрограмму со строки L% RETURN - заканчивает подпрограмму и передает управление команде за GOSUB POP - игнорирует первый RETURN Графика CLS - очищает экран SETCOLOR R%,G%,B% - выбор цвета RGB (переменные в пределе 0 - 255) PLOT X%,Y% - рисует точку (x;y) BLIT X1%,Y1%,W%,H%,X2%,Y2% - копирует прямоугольник с верхним левым углом (x1;y1), шириной (w), высотой (h) в точку (x2;y2) (верхний левый угол) DRAWLINE X1%,Y1%,X2%,Y2% - рисует отрезок (x1;y1) - (x2;y2) DRAWRECT X%,Y%,W%,H% - рисует прямоугольник (рамку) с верхним левым углом (x;y) шириной (w) и высотой (h) DRAWARC X%,Y%,W%,H%,SA%,A% - рисует дугу (или окружность) с расстоянием до верхней границы экрана (y), левой границы (x), высотой (h), шириной (w), начальным углом дуги (sa), углом (a), в градусах или радианах, в зависимости от того, что выбрано DRAWROUNDRECT X%,Y%,W%,H%,A_W%,A_H% - аналогично DRAWRECT, только со скругленными углами, высотой(a_h) и шириной(a_w) DRAWSTRING STRING$,X%,Y% - рисует строку (string) с координатами начала (x;y) FILLRECT X%,Y%,W%,H% - аналогично DRAWRECT, только залит FILLARC X%,Y%,W%,H%,SA%,A% - аналогично DRAWARC, но залита (т.е. сектор или круг) FILLROUNDRECT X%,Y%,W%,H%,A_W%,A_H% - аналогично DRAWROUNDRECT, но залит Спрайты GELLOAD Gel$,Resourse$ - Загружает гель (графический элемент) из ресурса - графического файла в яре бейсика. Например: gelload "ball","ball.gif" GELGRAB Gel$,X%,Y%,W%,H% - "Вырезает" гель из прямоугольника (x,y,w,h) DRAWGEL Gel$,X%,Y% - Рисует гель на экране с координатой верхнего левого угла (x,y); если он уже был нарисован в другом месте, то старый стирается SPRITEGEL Sprite$,Gel$ - Сопоставляет спрайт с гелем SPRITEMOVE Sprite$,X%,Y% - Рисует спрайт аналогично drawgel Файлы OPEN #ch%,file$,mode$ - открывает рмс - файл(file) и сопоставляет ему канал(ch). Каналов может быть до 10: от 0 до 9. Они используются для удобного доступа к файлу. Тип(mode) может быть разным - запись("output") и чтение("input"). Если имя файла, проги начинается с точки, то файл скрыт и не просматривается через меню, dir, readdir CLOSE #ch% - закрывает канал GET #ch%,b% - считывает байт PUT #ch%,b% - пишет байт INPUT #ch%,( /%/$) - считывает переменную (, записанную с разделителями) PRINT #ch%,( /%/$) - записывает переменную NOTE #ch%,c% - считывает позицию чтения/записи POINT #ch%,c% - устанавливает позицию. Если число отрицательное, то позиция переходит в самый конец файла ФУНКЦИИ Математ. функции ABS(X) - |x| SQR(X) - x^0.5 RND(0) - случайное число (32b) LOG(X) - ln x EXP(X) - e^x MOD(A,B) - остаток a/b SIN(A) - sin a COS(A) - cos a TAN(A) - tg a ASIN(X) - arcsin x ACOS(X) - arccos x ATAN(X) - arctg x Строковые функции LEN(S$) - длина s MID$(S$,S%,L%) - отрезок из s, с началом s и длиной l LEFT$(S$,L%) - отрезок "слева", длиной l RIGHT$(S$,L%) - отрезок "справа", длиной l STR$(N) - превращает число n в строку VAL(S$) - превращает строку s в число CHR$(N%) - возвращает символ с номером n в кодировке Utf ASC(S$) - возвращает код первого символа из s Работа со встроенными часами и календарем DAYS(0) - возвращает определенное число, соответствующее времени снятия показаний, обозначим его D% MILLISECONDS(0) - то же, обозначим M% MILLISECOND(D%,M%) - возвращает миллисекунды в момент снятия показаний функциями Days(0) и Milliseconds(0) SECOND(D%,M%) - секунды MINUTE(D%,M%) - минуты HOUR(D%,M%) - часы DAY(D%,M%) - дни MONTH(D%,M%) - месяца YEAR(D%,M%) - годы Привязка к клавишам Функции возвращают не ноль, если нажата соответствующая клавиша LEFT(0) - [4], влево RIGHT(0) - [6], справо UP(0) - [2], вверх DOWN(0) - [8], вниз FIRE(0) - [5], джойстик, лев. софт. GAMEA(0) - [1] GAMEB(0) - [3] GAMEC(0) - [7] GAMED(0) - [9] Дополн. функции FRE(M%) - возвращает размер памяти: m%:0-своб. буфера 1-зан. буфера 2-весь буфер 3-своб. оп 4-вся. оп ERR(0) - в случае возникновения ошибки возвращает её код READDIR$(M$) - возвращает результат поиска файла по маске: если найдено, то имя файла, если нет, то "". Пример маски: "c*","*.txt","w*.dat" PROPERTY$(M$) - возвращает параметры телефона по таким аргументам(для семенов): microedition.model microedition.profile microedition.configuration microedition.locale microedition.encoding Графические функции SCREENWIDTH(0) - ширина экрана SCREENHEIGHT(0) - высота экрана STRINGWIDTH(S$) - ширина строки STRINGHEIGHT(S$) - высота строки GELWIDTH(G$) - ширина граф. эл. GELHEIGHT(G$) - высота граф. эл. (все в пикселях) NUMCOLORS(0) - количество цветов, которые может воспроизводить дисплей ISCOLOR(0) - если цвет, выбраный коммандой SETCOLOR R%,G%,B% дисплей может воспроизвести, то функцию возвращает 1, иначе - 0 SPRITEHIT(S1$,S2$) - если спрайты столкнулись - 1, иначе - 0 Функции пользовательского интерфейса Входящие параметры T$ - заголовок O$ - надпись на клавише "ок" C$ - надпись на клавише "отмена" L$ - подзаголовок MESSAGEFORM(T$,O$,C$,L$,M$): Выводит на экран текст. Возвращает 1 - если "ок", -1 если "отмена". M$ - сообщение. EDITFORM(T$,O$,C$,L$,V$,L%,M%) Редактирование текста. Возвращет: len(V$) - "ок", -1 - "отмена" V$ - переменная редактирования L% - максимальная длина M% - тип: 0 - текст 1 - пароль 2 - число 3 - e-mail 4 - номер телефона 5 - url CHOICEFORM(T$,O$,C$,L$,A$,M%) Выбор. Возвращает: N - "ок", -1 - "отмена" A$ - массив выбора M% - тип: 0 - переключатели 1 - флажки GAUGEFORM(T$,O$,C$,L$,M%,S%,M%) Настройка уровня. Возвращает: N - "ок", -1 - "отмена" M% - размер S% - стартов. значение M% - тип: 0 - нерегулируемый 1 - регулируемый DATEFORM(T$,O$,C$,L$,A%,M%) Настройка даты Возвращает: 1 - "ок", -1 - "отмена" A% - массив M% - тип: 0 - время и дата 1 - дата 2 - время A%(0)=MS% A%(1)=D% Ну вот, это все команды.Идем дальше и начнем с простеньких программ. §2. "Программы и примеры" Первая программа которую мы рассмотрим это просто вывод данных на экран. Программы пишутся отдельными строками, каждая строка номеруется в возрастающем порядке. Запускаем программу командой "run" Пример: 10 cls 20 print "ОК" run От себя добавлю что лучше строки номеровать десятками.(10,20,30...) Это на всякий случай, вдруг чтото забудете. Пример 1. 10 cls 20 print "Привет" 30 end run Если ещё не понятно объясняю: 10 cls -очистка экрана 20 print "Привет"-выводит на экран слово "Привет" 30 end- конец проги ( для тех кто в танке обьясняю, эта прога выводит на экран слово "Привет") Также командой print можно выводить и значение переменных. Переменные обозначаются любой буквой (или словом) латинского алфавита и бывают трех типов. Первые это числовые переменные, они обозначаются знаком "%". Пример: a%,x%,raketa%,а1% вообщем любая буква(слово) Такие переменные могут хранить в себе ТОЛЬКО ЧИСЛА! Вторые-это строковые переменные, они обозначаются символом "$" Пример: а$,word$,а1$ Эти переменные хранят только слова. Третий тип переменных никак не обозначается Пример: x,y,fack Они могут хранить в себе дроби (1.95 или 0.5) Как задать переменной значение? Это очень просто. Допустим мы хотим переменой х% присвоить значение "5". Пишем так : х%=5 если у нас переменная х$ и мы хотим присвоить ей значение "Старт", пишем так: х$="Старт" ну и также у нас переменная х, и мы хотим присвоить ей значение "3.14" х=3.14 Я думаю это понятно Пример 2. 10 cls 20 s$="Привет" 30 print s$ 40 end Обьясняю 10 cls -очистка экрана 20 s$="Привет"-присваеваем переменнoй s$ значение "Привет" 30 print s$-Выводим значение переменой на экран 40 end-конец (Для тех кто ещё не догадался, на экране появится слово "привет") Точно так и с другими: 10 cls 20 h%=1985 30 print h% Так. Вроде с переменными разобрались.Дальше будем учить 2+2 Как сложить 2+2? Вот так: 10 cls 20 а%=2 30 b%=2 40 с%=а%+b% 50 print с% 60 end Ну тут всё понятно.Да? Не хотим постоянн писать а%=2, а хотим поле ввода? Пожалуйста! Для этого пишем команду: input "название",а% Пример: 10 cls 20 input "введи число",g% 30 print g% 40 end Обьясняю 10 cls-ну уже можно было запомнить, очистка экрана 20 input "введи число",g%-вводим значение переменой g% 30 print g% -выводим на экран 40 конец В принципе команду end можно вообще не писать (как только строки закончатся прога сама остановиться) Ещё очень полезная штука это генератор случайных чисел. Очень поможет в создании экономических стратегий.(Например случайное количество урожая) Итак хотим случайное число в диапазоне от 0 до 100 Пишем: а%=50+mod(rnd(0),50) Поясню: а%-переменная (результат) 50 -число mоd-остаток rnd(0)-случайный генератор Почему 50? Ну вы же хотели генератор от 0 до 100. 50+50=100 50-50=0 также любое другое число Допустим от 0 до 150 с%=75+mod(rnd(0),75) Не стоит сильно вдумываться в эту сложную формулу, используйте просто как шаблон и всё! А вот чуть не забыл: не имеет значения какой буквой обозначать переменную, большой или маленькой (fire%,Fire%,FIRE% или FiRe%-это одно и тоже) Ну вроде в этом разделе Всё!!! Идем ДАЛЬШЕ! §3. "Условия и циклы" Что такое "УСЛОВИЕ"? Условие это так сказать логическая операция, которая присутствует во всех языках программирования if "условие" then "выполняемая часть" Перевожу : если "условие" тогда "выполняемая часть" Так и в жизни: если "пойду в бар" то "напьюсь" Пишется так: if а%=5 then с%=0 или так: if х%>0 then print "Ха-ха-ха!!!" Еще есть оператор "and" с его помощью можно задать несколько условий Пример: if а%>5 and а%<10 then print "Ок" Объясню: если а% больше 5 и при этом а% меньше 10 тогда вывести на экран слово ОК Тоесть слово ОК будет выводится только если а% будет равен 6,7,8,9 в других случаях(а%=1,2,или 20,100) будет просто пропускаться Давайте попробуем установить пароль на вашу игру или прогу. Пример: 10 cls 20 pas%=1742 30 input "Введите пароль для доступа",p% 40 if p%=pas% then print "пароль принят" Если ещё не понятно объясню: 10 cls-понятно?Ура 20 pas%=1742-Задаем переменной pas% значение 1742(или любое другое) 30 input "Введите пароль для доступа",p%-задаем p% 40 if p%=pas% then print "пароль принят" если p%(число которое ты ввел)=pas%(1742) тогда вывести на экран "пароль принят" Не понятно? Вводи "1742" -это пароль который можеш изменить в строке 20 Дальше рассмотрим циклы. Что такое цикл? Вообщем иногда (почти всегда) нужно вернуться в определенную часть программы или прокрутить прогу несколько раз.Вообщем не буду сильно рассусолевать.Ближе к делу. Какие бывают циклы? Есть бесконечные циклы, и ограниченные. Бесконечный цикл: оператор goto Пример : 10 cls 20 х%=0 30 х%=х%+1 40 print х% 50 goto 30 Объясню: 10 cls 20 х%=0-переменная х% равна 0 30 х%=х%+1 прибавляем к х% 1 40 print х% выводим результат 50 goto 30 возвращяемся на строку 30 и продолжаем читать программу Также goto очень нужен для условий Пример : 10 cls 20 input "Введи число",с% 30 if с%=3 then goto 60 40 print "Число не то" 50 goto 10 60 print "Ты угадал!!!" Объясню: 10 cls 20 input "Введи число",с%-Вводим число в переменную с% 30 if с%=3 then goto 60 если ты ввел число 3 то перейти на строку 60 40 print "Число не то" 50 goto 10 вернуться в начало (строка 10) 60 print "Ты угадал!!!" Короче будете вводить числа бесконечно пока не введеш "3" Я думаю что с goto мы разобрались. Ограниченные циклы это циклы которые имеют начало и конец Выглядит это так: for i%=0 to а% next i% Поясню: For i%=0-Начало цикла to а%-Конец цикла (сколько раз вернутся) а% может быть и обычным числом for i%=0 to 20 Как ими пользоваться? Вот так 10 cls 15 а%=0 20 for i%=0 to 5 30 а%=а%+1 40 print а% 50 next i% Поясню: 10 cls 15 а%=0 20 for i%=0 to 5 -Начинаем цикл (Прокрутить 5 раз) 30 а%=а%+1 40 print а% 50 next i% -вернуться на строку 30 Подведем Итог: Научились мы не многому, но именно эти приметивные функции составляют большой процесс. Чтобы закрепить знания и включить соображалку попробуем написать маленькую игрУ. Итак суть игры: программой будет загадано число и нам нужно его отгадать. Опишем схему: 1 включаем генератор случайных кисел от 0 до 10 2 вводим свое число 3 обрабатываем данные 4 вывод результата Пошла прога: 10 cls 20 nomer%=5+mod(rnd(0),5) 30 input "Введи число",you% 40 if you%=nomer% then print "Ты угадал":goto 10 50 print "Нет не то" 60 goto 20 Вот вам и прога в 6 строк. Ах да совсем забыл, также можно писать много команд в одной строке. Разделяют их знаком ":" Выглядит так: По строкам 10 cls 20 а%=2 30 b%=2 40 с%=а%+b% 50 print с% 60 end Всё в одну 10 cls:а%=2:b%=2:с%=а%+b%:print с%:end Ну в этой главе вроде всё. §4. "Клавиатура" Значит в любой проге или игре необходима какая-то навигация. Для управления используется клавиатура. fire(0)-соответствует кнопке "5"( или топим джойстик) up(0) -это "2" (джойстик вверх) down(0)-это "8" ( вниз) right(0)-это "4"( влево) left(0) -"6" (вправо) Это основные клавиши есть еще дополнительные кнопки "1","3","7","9" их описание есть в самом начале в списке команд Почему я о них не хочу рассказывать? Потому что на разных телефонах кнопки 1, 3, 7, 9 обозначаются по разному. Итак начнем Сдесь опять используются условия if fire(0) then ..... если нажать кнопку 5 тогда выполнить какоето действие. Пример: if fire(0) then goto 50 или if fire(0) then print а% Ну понятно.Да? Точно также и остальные if left(0) then goto 150 §5. "Графика" Графическое функции -это самое нужное и интересное, они помогут украсить интерфейс вашей программы. Начнем как всегда с самого простого. А что может быть проще точки. Значит выводим точку на экран. Это делается с помощью команы plot х%,у% plot-это наша точка х%-это координаты по горизонтали у%-по вертикали Я думаю вы уже догадались что вместо х% и у% можно написать любую другую переменную Мы хотим вывести точку по координатам 20,50 ( 20 пикселей от левой части экрана, и 50 от верха ) Пишем так 10 cls 20 х%=20 30 у%=50 40 plot х%,у% Или можно заставить точку двигаться при этом если экран не будет постоянно обновлятся будет нарисована линия. 10 cls 20 х%=50 30 у%=0 40 у%=у%+1 50 plot х%,у% 60 goto 40 Поясню: 10 cls 20 х%=50 (ставим координаты точки 50 пикселей от левого края экрана) 30 у%=0 (ставим координаты точки 0 от верха экрана, т.е. в самом верху) 40 у%=у%+1 (смесщяем нашу точку на один пиксель в низ) 50 plot х%,у% (Выводим точку на экран) 60 goto 40 (возвращяемся на строку 40, и опять сместим точку на один пиксель вниз и так бесконечно) Можно также менять цвет. Для этого используем команду: setcolor r%,g%,b% setcolor-смена цвета r%-количество красного цвета g%-зеленого b%-синего Эти переменные могут обозначаться и другими буквами и принимать значение от 0 до 255 Например чтобы получить белый цвет нужно писать так setcolor 255,255,255 если черный: setcolor 0,0,0 синий setcolor 0,0,255 зеленый setcolor 0,255,0 красный setcolor 255,0,0 желтый setcolor 255,255,0 Если разберетесь с цветами то получите очень много оттенков. Рисуем точку красного цвета по координатам 50,50) 10 cls 20 а%=50 30 с%=50 40 setcolor 255,0,0 50 plot а%,с% Также можно автоматически менять цвета 10 cls 20 r%=0 30 х%=50 40 у%=50 50 r%=r%+1 60 setcolor r%,0,0 70 plot х%,у% 80 if r%>255 then r%=0 90 goto 50 Поясню 10 cls 20 r%=0 красный цвет равен 0 30 х%=50 40 у%=50 50 r%=r%+1 добавим 1 к красному цвету 60 setcolor r%,0,0 поменяем цвет 70 plot х%,у% 80 if r%>255 then r%=0 если красный цвет примет значение больше 255 то обнолим его 90 goto 50 вернемся к строке 50 едем дальше! с точкой думаю всё понятно. Следующяя графическая команда которую мы рассмотрим это drawline вывод линии на экран drawline х%,у%,х1%,у1% здесь х% и у% устанавливают начальную точку линии, а х1% и у1% конечная Пример 10 cls 20 х%=0 30 у%=50 40 х1%=100 50 у1%=50 60 drawline х%,у%,х1%,у1% Также есть ещё квадрат(рамка) drawrect х%,у%,w%,h% Здесь х% и у% это координаты верхнего левого угла, w%-это ширина квадрата а h%-высота 10 cls 20 х%=10:у%=10:w%=100:h%=50 30 drawrect х%,у%,w%,h% Квадрат может быть закрашен каким либо цветом fillrect х%,у%,w%,h% С этим мы вроде разобрались. Попробуем написать программу которая будет выводить квадраты в случайных местах экрана, случайной шириной и высотой, и конечно случайного цвета. Для этого нам понадобиться лишь: 1. Семь генераторов случайных чисел 2. Команда setcolor 3. Вывод квадрата fillrect 4. бесконечный цикл goto А вот и прога: 10 cls 20 x%=64+mod(rnd(0),64) 30 y%=80+mod(rnd(0),80) 40 w%=50+mod(rnd(0),50) 50 h%=50+mod(rnd(0),50) 60 r%=125+mod(rnd(0),125) 70 g%=125+mod(rnd(0),125) 80 b%=125+mod(rnd(0),125) 85 setcolor r%,g%,b% 90 fillrect x%,y%,w%,h% 100 goto 20 Идем дальше: Команда drawstring Я думаю что команда print вас уже достала. В принципе print в прогах и играх неиспользуется вообще, ну что это за вывод данных постоянно в верхнем углу экрана, может мы хотим по центру. К команде drawstring можно также применять цвета. drawstring s$,х%,у% s$ - слово х% и у% координаты 10 cls 20 input "введите слово",с$ 24 х%=10:у%=60 30 drawstring с$,х%,у% или так 10 cls 20 drawstring "Привет",30,90 Или изменим цвет 10 cls 20 setcolor 255,0,0 30 drawstring "Старт",30,20 А теперь попробуем написать новую игру "Угадай число" но немного её усложним. Добавим сюда азарта, то есть деньги. Выигрываем или проигрываем. Вот собственно прога: 1 dol%=500 2 setcolor 0,0,0 5 fillrect 0,0,200,200 10 setcolor 255,255,0 20 drawstring "Бабки "+str$(dol%),30,40 25 drawstring "Сделайте ставку",10,60 30 input "",stavka% 32 setcolor 0,0,0 33 fillrect 0,0,200,200 35 setcolor 150,150,150 36 drawstring "Угадай число 0-10",0,50 40 input "",a% 50 d%=5+mod(rnd(0),5) 60 if a%=d% then goto 100 70 setcolor 0,0,0 71 fillrect 0,0,200,200 72 setcolor 255,0,0 73 drawstring "Число неверное",10,90 75 sleep 1000 80 dol%=dol%-stavka% 85 if dol%<0 then goto 200 90 goto 2 100 setcolor 255,255,255 101 drawstring "Победа",20,90 110 sleep 1000 115 o%=stavka%*2 120 dol%=dol%+o% 130 goto 2 200 setcolor 0,0,0 210 fillrect 0,0,200,200 220 drawstring "GAME OVER",30,90 230 if fire(0) then goto 1 240 goto 230 Ну вроде справились! В этой игре добавились парачка новых команд о которых я вам не говорил. Это sleep и str$ Sleep -это пауза, измеряется в миллисекундах. sleep 1000-пауза 1 секунда sleep 500 Эти паузы нужны для того чтоб в нужное время остановить прогу. Например в этой игре я применял sleep для того, чтобы можно было прочитать текст, прежде чем он закроется черным фоном. str$- Превращяет число в строку. Я понимаю что это трудно понять, но попробую обьяснить. Помните я говорил что есть строковые переменные-х$ и числовые-х%, так вот drawstring-это строка, и в него нужно вставлять только строковые переменные drawstring х$,0,0 если вы захотите вывести число с помощью этой команды drawstring х%,0,0 то кроме ошибки ниче не получится. Поэтому и надо использовать str$ Нужно писать так drawstring str$(х%),0,0 Ну теперь всё понятно? Пойдем дальше. В играх используются "гели" (графические элементы) и спрайты. Что это такое? Это картинки! Вся графика вашей игры должна находится в самом jar Бейсика но об этом позже. Итак GeL: Для того чтобы начать лепить картинку на экран, её нужно сначала загрузить. Это делается так. gelload "имя1","имя2" имя1-любое имя которое вы хотите. Под этим именем будет находится ваша картинка имя2-реальное имя картинки. Допустим у вас есть картинка и она называется strela.gif, и вы хотите чтоб в дальнейшем она называлась "а" Пишем так: gelload "а","strelа.gif" Так вроде картинку загрузили. А как вывести её на экран? drawgel "имя",х%,у% х% и у%-это координаты картинки. Вот так выглядит загрузка и вывод. 10 gelload "а","strelа.gif" 20 drawgel "а",х%,у% Тут всё понятно. А чем отличается спрайт от геля? Ведь и то и другое просто рисунки. Объясняю: 1. В отличии от геля на спрайт не действует cls. 2. Если гель двигать по экрану (ну типа курсор) гель будет тупо копироваться по экрану. А спрайт можно двигать 3 Спрайт всегда сверху геля.(Гель идет как фон) Значит рассмотрим sprite Сначала загружается гель, а потом он превращяется в спрайт. spritegel "имя1","имя2" имя1- желаемое имя спрайта. имя2- имя геля А выводится на экран он так spritemove "имя",х%,у% х% и у%- координаты имя- имя спрайта Вот полный пример: 10 gelload "а","imаge.gif" 20 spritegel "у","а" 30 spritemove "у",50,50 или имя спрайта можно не изменять 10 gelload "а","imаge.gif" 20 spritegel "а","а" 30 spritemove "а",50,50 Также есть очень полезная команда spritehit. Это проверка столкновения спрайтов. Например у вас игра про самолеты. Ваш самолет называется "х", а вражеский самолет "у". Если они столкнутся то должен произойти взрыв. Пишется так: if spritehit("х","у") then трам-пам-пам-бабах Подробней 10 gelload "x","f16.gif" 20 gelload "y","enemy.gif" 30 spritegel "x","x" 40 spritegel "y","y" 50 spritemove "x",x%,x1% 60 spritemove "y",y%,y1% 70 if spritehit("х","у") then goto 1000 Ну гдето так. Ах да совсем забыл! имена также можно заменить переменными. Пример: 10 cls 20 а$="rаketа" 30 b$="rаketа.gif" 40 gelload а$,b$ Понятно да? Ну вроде и с графикой разобрались, осталось только научиться её двигать. Делается это путем смещения координат Пример: 10 cls 20 gelload "f1","f1.jpg" 30 x%=64: y%=100 40 spritegel "f1","f1" 50 spritemove "f1" 60 if left(0) then x%=x%-1 70 if right(0) then x%=x%+1 80 if up(0) then y%=y%-1 90 if down(0) then y%=y%+1 100 goto 50 §6. "Чтение информации" Для удобства пользования программы данные можно хранить в отдельной строке (в самой последней), для этого используется команда dаtа Данные в dаtа записываются через запятую "," dаtа 1,10,500,7,и т.д. Считывается эти данные командой reаd и записываются в переменную которая стоит после команды read Например: read а$ или а% Вот самый простой пример: 10 cls 20 read а$ 30 print а$ 5000 datа привет Объясню: 10 cls 20 read а$-считывает данные 30 print а$ вывод данных 5000 datа привет-данные Для полных чайников объясняю, на экране появится слово "привет" Для чисел: 10 cls 20 read а% 30 print а% 5000 datа 50 Data можно использовать для присвоения значении массивов (о массивах чуть позже). Вообще Data можно использовать везде, но мы не будем сильно углублятся а рассмотрим самое необходимое. Вот представьте что вы решили написать грандиозную игру, графики куча, вы будете писать так? 1 gelload "1","1.gif" 2 gelload "2","2.gif" 3 gelload "а1","а1.gif" Да? А если у тебя 50 графических элементов? Напишете 50 загрузок и 50 spritegel и 50 spritemove (почему spritemove-потому что при сопоставлении спрайта с гелем спрайт автоматически выводится на экран, по этому его нужно сразу убирать за пределы экрана) Вобщем чтоб не писать килограммы текста нужно думать головой. Я представляю вам свое изобретение я назвал его "Сканер" Для его конструкции нам понадобится пара циклов и data "СКАНЕР" 1 CLS 2 INPUT "",G% 3 FOR I%=0 TO G%-1 4 READ A$ 5 READ B$ 6 GELLOAD A$,B$ 7 SPRITEGEL A$,A$ 8 SPRITEMOVE A$,-200,0 9 NEXT I% 1000 DATA x1,x1.gif,x2,x2.gif Объясню: 1 CLS 2 INPUT "Ввод",G%-вводим количество картинок 3 FOR I%=0 TO G%-1-Начинаем цикл 4 READ A$ -читаем первую запись 5 READ B$-читаем вторую запись 6 GELLOAD A$,B$-загружаем гель 7 SPRITEGEL A$,A$-сопоставляем спрайт с гелем 8 SPRITEMOVE A$,-200,0 -выводим спрайт с гелем 9 NEXT I% -цикл заново 1000 DATA x1,x1.gif,x2,x2.gif-данные. Я думаю что такой способ намного лучше. Данные желательно записывать не в одной строке а несколькими. Это делается для того чтобы не перегружать строку Ато получите кучу ошибок! Пример: 1000 DATA x1,x1.gif,x2,x2.gif,x3,x3.gif,n1,n1.gif,n2,n2.gif,n3,n3.gif,n4,n4.gif,n5,n5.gif,r1,r1.gif,r2,r2.gif,r3,r3.gif,r4,r4.gif,rs1,rs1.gif,rs2,rs2.gif 1001 DATA d,d.gif,n,n.gif,a1,a1.gif,a2,a2.gif,a3,a3.gif,br1,br1.gif,br2,br2.gif,b1,b1.gif,b2,b2.gif,b3,b3.gif §7. "МассивЫ" Что же такое массивы. Массивы это переменная которая хранит в себе много значении. Круто да? А что вы думали это игрушки? Нет тут всё серьезно. Так вот, делается это командой dim. dim а%(5) а%-переменная (5)-пять значении Вот вам пример: 10 cls 20 dim х%(3) 30 х%(0)=50 40 х%(1)=100 50 х%(2)=6 Объясню: 10 cls 20 dim х%(3)-создаем массив х% с тремя значениями Номеруется они с ноля 30 х%(0)=50 -первое значение 40 х%(1)=100-второе 50 х%(2)=6-третье Зачем они вообще нужны? А затем чтобы не писать тонны текста, а делать все грамотно и просто. Вот вы хотите вывести 10 точек на экран, что будете писать так: 1 plot х%,у% 2 plot а%,b% 3 plot c%,у% 4 plot х%,n% 5 .... 6 .... 7 и т.д. Конечно это издевательство над программистами. А если 20 Делаем так: 1 cls 2 dim x%(20) 3 for i%=0 to 19 4 read a% 5 x%(i%)=a% 6 next i% 7 for i%=0 to 19 8 plot x%(i%),50 9 next i% 100 data 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,35,40,42,60,100 Объясню: 1 cls 2 dim x%(20) создаем массив х% 3 for i%=0 to 19-создаем цикл 4 read a%-читаем данные 5 x%(i%)=a% присваиваем х% значение которое считали в строке 4. Почему х%(i%), потому что (i%) в ходе программы i% принимает значения от 0 до 19. Это равносильно х%(0),х%(1) и так до 19 6 next i% прокручиваем цикл заново 7 for i%=0 to 19 начинаем новый цикл 8 plot x%(i%),50 выводим точку по координатам х%(i%),50 9 next i% 100 data 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,35,40,42,60,100-данные которые по очереди будут присвоены переменной а% Для тех кто ещё не догадался на экране появится сразу 20 точек Массивы вообще очень нужная штука. С помощью массивов можно получить карту для игры, или создать интересную заставку, чем сейчас мы и займемся! Создаем заставку: "МАТРИЦА" 10 cls 20 dim x%(10) 30 dim y%(10) 40 r%=0:g%=0:b%=0 50 setcolor r%,g%,b% 60 fillrect 0,0,200,200 70 for i%=0 to 9 80 x%(i%)=64+mod(rnd(0),64) 90 y%(i%)=20+mod(rnd(0),20) 100 next i% 110 for i%=0 to 9 120 y%(i%)=y%(i%)+1 135 if g%>255 then g%=0 140 setcolor 0,g%,0 150 plot x%(i%),y%(i%) 160 if y%(i%)>176 then goto 70 170 next i% 175 g%=g%+1 180 goto 110 §8. "Часы" Что может быть полезней. Вот представь играеш в игру. И вдруг баццц! Нужно срочно узнать время. Что делать? Выходить из игры, смотреть время. Нет нам такое не подходит. Мы люди умные и поэтому всем советую лепить в игру или прогу часы. Не обязательно ставить их на главный экран, а хотяб сделать функцию, ну типа нажал кнопку и попал на заставку с часами. Пока до такого додумался только Рысь. Для тех кто не знает Рысь это программист который написал Пэйнт Кад за что ему огромное спасибо от всей России у Украины. MobileBasic без Пэйнт Када бесполезен. (Ну какие игры без графики). Так как же нам вывести часы на экран? Сначала нам их нужно отсканировать. Делается это так: 10 d%=days(0) 20 m%=milliseconds(0) Вот так мы отсканировали наше время. Теперь осталось только присвоить значения времени переменным. h%=hour(d%,m%) mi%=minute(d%,m%) s%=second(d%,m%) И вывести на экран: drawstring str$(h%)+":"+str$(mi%)+":"+str$(s%),30,50 Вот полный пример: 1 cls 2 d%=days(0) 3 m%=milliseconds(0) 4 h%=hour(d%,m%) 5 mi%=minute(d%,m%) 6 s%=second(d%,m%) 7 cls:drawstring str$(h%)+":"+str$(mi%)+":"+str$(s%),30,50 8 sleep 50 9 goto 2 §9. "Пользовательские функции" В этом разделе мы рассмотрим пользовательские функции. Первое будет функция messageform. messageform предназначен для вывода данных. Выглядит всё это так, как будто вы читаете SMS. Пример: X%=massageform(t$,o$,c$,l$,m$) t$-Заголовок o$-Надпись кнопки "ок" c$-Надпись кнопки "отмена" l$-подзаголовок m$-текст сообщения. Для полного понимания всего этого вот полный пример: 10 cls 20 input "слово",а$ 30 х%=messageform("Заголовок","Ок","Отмена","подзаголовок",а$) Забыл сказать что в этих функциях русский язык не поддерживается,так что придется писать английским. Конечно можно влепить русским но об этом позже. Следующяя функция это editform. editform предназначен для ввода данных. Выглядит это так как будто вы пишете SMS. х%=editform(t$,o$,c$,l$,а$,у%,с%) t$-Заголовок o$-Надпись кнопки "ок" c$-Надпись кнопки "отмена" l$-подзаголовок а$-переменная в которую будут записанны данные после ввода у%-максимальное количество символов ввода с%-тип ввода 0 - текст 1 - пароль 2 - число 3 - e-mail 4 - номер телефона 5 - url Вот пример: 10 cls 20 w%=editform("Заголовок","Ок","Отмена","подзаголовок",v$,200,0) а потом результат можно вывести через messageform Вот пример: 10 cls 20 w%=editform("Заголовок","Ок","Отмена","подзаголовок",v$,200,0) 30 х%=messageform("Заголовок","Ок","Отмена","подзаголовок",v$) Следующяя функция choiceform(T$,O$,C$,L$,A$,M%) t$-Заголовок o$-Надпись кнопки "ок" c$-Надпись кнопки "отмена" l$-подзаголовок а$-Массив выбора M%-Тип: 0 - переключатели 1 - флажки Значит тут уже немного посложней. Пример: 10 cls 20 dim a$(3) 30 a$(0)="Start" 40 a$(1)="Options" 50 a$(2)="Exit" 60 x%=choiceform("Game","Ok","Cancel","menu",A$,0) Вот такая вот менюшка получилась. А как нам присвоить какието действия к нашему выбору? Вот так! 10 cls 20 dim a$(3) 30 a$(0)="Start" 40 a$(1)="Options" 50 a$(2)="Exit" 60 x%=choiceform("Game","Ok","Cancel","menu",A$,0) 70 if x%=0 then print "Start" 80 if x%=1 then print "options" 90 if x%=2 then print "exit" А если нажата кнопка отмены, тогда x%=-1 10 cls 20 dim a$(3) 30 a$(0)="Start" 40 a$(1)="Options" 50 a$(2)="Exit" 60 x%=choiceform("Game","Ok","Cancel","menu",A$,0) 70 if x%=0 then print "Start" 80 if x%=1 then print "options" 90 if x%=2 then print "exit" 100 if х%=-1 then goto 60 $9 "Размеры " Размеры экрана, строк, гелеи тоже очень нужные команды. Вот допустим вы хотите сделать игру которая будет подходить под все размеры экрана. В этом вам поможет функция screenwidth(0) и screenheight(0) которые сканируют размеры экрана. w%=screenwidth(0)-ширина экрана h%=screenheight(0)-высота Вот пример: Рисуем черный квадрат во весь экран. 10 cls 20 setcolor 0,0,0 30 w%=screenwidth(0) 40 h%=screenheight(0) 50 fillrect 0,0,w%,h% 60 goto 60 В таком случае координаты сток и графики лучше выводить относительно размера экрана Например ставим точку по центру экрана. 10 cls 20 setcolor 0,0,0 30 w%=screenwidth(0) 40 h%=screenheight(0) 50 fillrect 0,0,w%,h% 60 setcolor 255,255,255 70 plot w%/2,h%/2 80 goto 80 /-это знак деления. Если таким образом ставить координаты всех элементов игры то на всех экранах она будет выглядеть одинаково. Размер строки это не размер шрифта (как вы наверно уже подумали). Просто сканирует ширину и высоту. Делается это так X%=stringwidth(s$)-ширина строки Y%=stringheight(s$)-высота строки (s$)-строка Так и размеры геля x%=gelwidth(g$) y%=gelheight(g$) g$-имя геля §10. "Файловая система" для открытия файловой системы применяется команда Open #сh,name$,mode$ #ch- это канал. Их может быть 10.(от 0 до 9) name$-имя файла mode$-это тип открытия, он может быть input (чтение) или output (запись) Пример: Open #1,"proga","input" Close #1-закрывает канал Рассмотрим примеры Открыть файл Example.dat на диске (т.е. в RMS MobileBASIC ) ДЛЯ ЗАПИСИ и записать в него значения переменных A%, VALUE, Z$ 10 A%=26:VALUE=-2.076:Z$="MobileBASIC" 20 OPEN #1,"Example.dat","OUTPUT" 30 PRINT #1,A% 40 PRINT #1,VALUE 50 PRINT #1,Z$ 60 CLOSE #1 70 CLS:PRINT "Saved File:" 80 PRINT "Example.dat" 90 END Имя файла Example.dat может быть любым, расширение dat не обязательно, годится любое или совсем без расширения. Строка 20: открыть файл Example.dat ДЛЯ ДЛЯ ЗАПИСИ ("OUTPUT") В ЭТОТ ФАЙЛ и связать его с каналом 1: #1. (Номер канала 0,1,..,9) В дальнейшем обращаемся к файлу, не используя имя, а номер канала (пока не закроем). Если файл с таким именем уже существует, его содержимое будет утрачено. Строки 30-50: запись в файл значений переменных. Строка 60: закрыть файл. Строки 70-90: отчет о проделанной работе и завершение (строка 90 не обязательна) Пример 2. Открыть тот же файл для чтения, прочитать значения переменных (обязательно того же типа и в том же порядке), вывести на дисплей. 10 NAME$="Example.dat" 20 OPEN #8,NAME$,"INPUT" 30 INPUT #8,INTEGER% 40 INPUT #8,FLOAT 50 INPUT #8,STRING$ 60 CLOSE #8 70 CLS:PRINT "Integral Value:":PRINT INTEGER% 80 PRINT "Floating Value:":PRINT FLOAT 90 PRINT "String Value:":PRINT STRING$ 100 PRINT " ":PRINT "Done" Строка 20: файл открывается для чтения и связывается с каналом 8 Строки 30-50: чтение значений из файла Строка 60: закрыть файл Строки 70-90: вывод результатов Строка 100: завершение Пример 3. Загрузить из Интернета звуковой файл и сохранить на диске (в дальнейшем извлечь с помощью приложения RMS, которое написал Dzaniss- актуально только для Сименсов) 10 CLS:PRINT "Wait..":NAME$="tchaikovsky.mid":MKB23$="http://mkb23.mag.su/" 20 TRAP 60:V$="":N$=CHR$(10) 30 OPEN #0,MKB23$+NAME$,"INPUT" 40 GET #0,B% 50 V$=V$+CHR$(B%):GOTO 40 60 CLOSE #0 70 OPEN #0,NAME$,"OUTPUT" 80 FOR I%=1 TO LEN(V$) 90 B$=MID$(V$,I%,1) 100 PUT #0,ASC(B$) 110 NEXT I% 120 CLOSE #0 130 CLS:PRINT "Loaded File:":+N$+MKB23$+NAME$ 140 PRINT "Saved As:":+N$+NAME$ Строка 30 открываем, как и прежде, файл для чтения, в качестве имени указываем адрес в Интернете (здесь для примера файл mid- Марш из балета "Щелкунчик" П.И.Чайковского, чуть больше 5 kB). Строка 40: оператор GET загружает 1 байт из файла и записывает его значение в переменную B%. Строка 50: значение байта конвертируется в символ и приписывается к V$ Строка 60: строки 40-50 образуют бесконечный цикл. Как происходит выход? Дело в том, что файл однажды "закочится" и очередной оператор GET вызовет ошибку чтения. Это могло бы привести к остановке программы с сообщением об ошибке, но в строке 20 зарегистрирован переход на строку 60: TRAP 60 поэтому при возникновении ошибки управление будет передано на эту строку. Здесь закрывается файл и обрывается связь с Интернет. Загрузка закончена. Строки 70-120: открывается файл для записи на диск. В цикле извлекаем символы строки V$ по одному, конвертируем их в байты (т.е. числовые значения) и записываем в файл. Это делает оператор PUT. Вопрос: почему бы не записать значение V$ сразу все, целиком, как в примере 1? PRINT #0,V$ и готово! Если так сделать, то это сработает, но нам ведь нужно, чтобы файл на диске был в точности как тот, что загружен. А записывая V$ как строковую переменную, Бэйсик добавляет кое-что от себя. Такой файл не будет работать в плеере. Побайтная запись обеспечивает соответствие файлов 1:1. Это учебный пример. Использование строковой переменной в качестве промежуточного носителя в данном примере излишне. Можно было сразу открыть файл для записи (т.е. оба файла одновременно) и прочитав байт из Интернета тут же записывать его на диск. Здесь это сделано так для того, чтобы продемонстрировать такой способ записи. Пример 4. Записать побайтно содержимое любого файла с диска в переменную V$ и вывести на экран. 10 LINES%=20:V$="":CLS 20 INPUT "FILE NAME? > ",NAME$ 30 IF NAME$="" THEN CLS:END 40 NAME$=READDIR$(NAME$):IF NAME$="" THEN PRINT "NOT FOUND":GOTO 20 50 CLS:PRINT NAME$:PRINT "Wait..." 60 FOR I%=1 TO LINES%:V$=V$+">"+CHR$(10):NEXT I% 70 OPEN #1,NAME$,"INPUT" 80 POINT #1,-1 90 NOTE #1,SIZE% 100 FOR I%=0 TO SIZE%-1 110 POINT #1,I% 120 GET #1,B% 130 V$=V$+CHR$(B%) 140 NEXT I% 150 CLOSE #1 160 CLS:PRINT V$:END В строке 40 проверяется наличие файла на диске. Если файл по имени NAME$ не существует, функция READDIR$(NAME$), вернет пустую строку. В строке 70 открывается файл для чтения. Оператор POINT устанавливает позицию чтения в файле. Байты в файле нумеруются с нуля, как элементы в массиве. Если Если указать позицию в виде отрицательного числа или числа, большего, чем размер файла, позиция чтения установится за последним байтом файла, т.е. на несуществующем байте. Читать с такой позиции нельзя, но ее номер точно равен размеру файла. Таким образом, строки 80 POINT #1,-1 90 NOTE #1,SIZE% используются исключительно для определения размера файла (оператора специально для этой цели нет). В строках 100-150 происходит чтение из файла байтов, одного за другим, конвертирование в символы и добавление их к строке V$. Заметим, что всякий раз перед чтением оператор POINT устанавливает новую позицию. При загрузке из Интернета это не делалось, тогда это было недопустимо, а здесь, наоборот, обязательно. Такой программой есть смысл открывать только файлы, являющиеся текстовыми, например, txt,wml,htm,html,jad,imy,url,vcs или программы для MobileBASIC ,сохраненные оператором LIST. §11. "Команды" Ну а теперь пора загружать и сохранять свои проги с файловой системы. Значит создали вы програмку в Тext ediтoре и сохранили её на диске 0:/. Чтоб её загрузить в Бейсик и запустить пишем так. enter "file:///0:/имя проги" и запускаем прогу командой run Сохранить прогу можно командой save "имя проги" или list "имя проги" Ну думаю тут все предельно ясно. $12. "Загрузка графики" Для того чтоб засунуть свою графику в бейсик нужно проделать следующюю операцию 1. Расспаковываем бейсик любым Zip-архиватором. 2. Вставляем свою графику в бейсик. 3. запокобываем. лучше всего пользоваться прогой Sie FM. ------------------ Ну вот и всё! Конец первой книги. Если возникнут вопросы заходи на Gameplay.Wen.ru и в чате получиш ответы на все вопросы. Во второй книге я планирую написать примеры своих прог и как правильно и оптимально пишутся программы. Автор: Dou Hammett