Полезности с брошенного сайта (часть 1)
Данный материал был опубликован на другом сайте, но сайт долгое время не развивался и в конце-концов был брошен и закрыт. Выборочно информацию из той которая на данный момент еще доступна в архиве, я решил выложить здесь, польза я думаю будет. Я умышленно старался не менять пояснения операторов, оставляя авторскую мысль. Хотя были те, которые попали под редактирование по разным причинам.
Простой BAT файл для компиляции:
set app=1.bas
"%ProgramFiles%\FreeBasic\fbc.exe" -s gui %app% if errorlevel 1 pause
Пример инверсии рисунка (не забудьте для этого примера какой нибудь рисунок с именем 1.bmp):
Screen 19,32 Dim x As Integer ' для цикла координаты x Dim y As Integer ' для цикла координаты y Dim p As Integer ' цвет точки Dim garray(921604) As Byte Bload "1.bmp", @garray(0) Put (0,0),garray(0) 'вывод основной картинки '''''''''''''''''''''''''''''''''''''''''''''''''' For y=0 To 314 For x=0 To 380 p=point (x,y) Pset(x+420,y),Not(p) 'инверсия Next x Next y '''''''''''''''''''''''''''''''''''''''''''''''''''' Sleep
Генерация звука:
Sub Sound(Byval freq As Uinteger, dur As Uinteger) Dim t As Double,f1 As Unsigned Short f1 = 1193181 \ freq Out &h61,Inp(&h61) Or 3 Out &h43,&hb6 Out &h42,Lobyte(f1) Out &h42,Hibyte(f1) t=Timer While ((Timer - t) * 1000) < dur Sleep 0,1 Wend Out &h61,Inp(&h61) And &hfc End Sub Sound(523, 60) 'C5 Sound(587, 60) 'D5 Sound(659, 60) 'E5 Sound(698, 60) 'F5 Sound(784, 60) 'G5 Sound(880, 60) 'A5 Sound(988, 60) 'B5 Sound(1046, 60) 'C6
Далее идут команды, небольшие пояснения к ним и примеры:
Например, в Freebasic, Вы хотите вывести в окне надпись 'Неllo World!', Вы должны написать следующее:
Screen 2 Print "Hello World!" Sleep
где,
Screen 2 - это режим экрана 640x200, 16 цветов,
Print
"Hello World!" - непосредственно вывод сообщения,
Sleep - пауза,
ожидание нажатия любой клавиши.
Так же этим оператором можно записывать данные в файл:
Open "test.txt" For Output As #1 Print #1,"abcdef" Close #1
Создаётся файл test.txt и в него с помощью оператора PRINT # записывается
текст "abcdef".
Так же для вывода текста , цифр в freebasic можно
использовать оператор WRITE
LOCATE
Для вывода текста в нужное место на экране используется оператор LOCATE x,y
Где x,y - это столбцы и строки куда мы хотим вывести сообщение.
Оператор
LOCATE обязательно пишется перед оператором PRINT.
Выведем нашу надпись
"Hello World!" в координату 10,10
Screen 13 Locate 10,10 Print "Hello World!"; Sleep
Можете поэксперементировать, посмотреть команду Locate в цикле FOR...NEXT
:
Dim i As Integer Screen 13 For i=1 To 15 Locate i,i Print "Hello World!"; Next i Sleep
Конечно, для нормальной работы цикла, необходимо объявить о создании
переменой i. Что мы и делаем, написав DIM i AS INTEGER
Для определения
положения курсора используем функции CsrLin и POS
INPUT
Для ввода данных пользователем можно использовать команду INPUT. Можно вводить как строковые данные, так и числовые. Для этого, вначале, вводимую переменную нужно объявить. Мы это делаем с помощью DIM i AS INTEGER.
Dim i As Integer Screen 13 Input "ENTER NUMBER";i Print "NUMBER=";i Sleep
Пользователю предлагается ввести число "ENTER NUMBER", при этом знак вопроса "?" добавляется автоматически. Так же с помощью команды INPUT # можно выводить данные из файла. Например, у нас есть файл test.txt, и в нём хранится число 12345. Следующая программка считывает переменную 'a' на экран из файла test.txt с помощью оператора INPUT #
Dim a As Integer Open "test.txt" For Input As #1 Input #1,a Close #1 Screen 13 Print "a=";a Sleep
GOTO
Для применения безусловного перехода в Freebasic применяется оператор Goto. Для того, чтобы переход состоялся, необходимо что бы у метки, куда будет выполнен переход, стоял знак ":" . В нашем примере две метки: "odin:" и "dva:". В операторе Goto знак ":" не пишется.
Screen 13 Goto dva odin: Sleep End dva: Print "Welcome!" Goto odin
Вначале, с помощью Screen 13 - мы включили режим экрана 320x200, далее
перешли по метке "dva" с помощью Goto dva. Вывели сообщение "Welcome!" с помощью
Print "Welcome!". Далее перешли с помощью Goto odin на метку "odin", где начали
ожидать любое нажатие клавиши с помощью Sleep. И когда нажали клавишу, программа
остановилась с помощью оператора End.
FOR , NEXT
Это, пожалуй самый любимый мой оператор. Почему? Да потому что с помощью него можно сделать из ничего о-очень много! Вот посмотрите пример программки, и что она делает:
Dim i As Integer Screen 13 For i=1 To 200 Step 10 Line (0,i)-(200,i) Line (i,0)-(i,200) Next i Sleep
Объявили о переменной "i" типа INTEGER с помощью Dim, переключили экран -
Screen 13. Далее начали цикл с оператора For, указав что переменная i ,будет
изменятся от 1 до 200 (1 to 200), с шагом 10 (STEP 10). Нарисовали две линии с
помощью LINE (0,i)-(200,i) и LINE (i,0)-(i,200), и начали всё это повторять,
увеличивая значение переменной i с помощью оператора NEXT. Когда нарисовали -
ждём, с помощью SLEEP.
DIM
Для того, что бы в языке Freebasic использовать переменные, вначале программы
нужно объявить о переменных, которые будут использоваться. Так же нужно указать
тип переменных. Если Вы не объявите переменную и её тип, то при компиляции
программы, возникнет ошибка, и программа не скомпилируется.
Всё это легко
решается с помощью оператора Dim, в котором указываем имя переменной и её тип. А
типов в Freebasic зарезервировано очень много. Обычно используется намного
меньше. Вот программка из справочника:
Dim a As Byte Dim b As Short Dim c As Integer Dim d As Longint Dim au As Ubyte Dim bu As Ushort Dim cu As Uinteger Dim du As Ulongint Dim e As Single Dim f As Double Dim g As Integer Ptr Dim h As Byte Ptr Dim s1 As String * 10 'fixed string Dim s2 As String 'variable length string Dim s3 As Zstring Ptr 'zstring s1 = "Hello World!" s2 = "Hello World from FreeBasic!" s3 = Allocate( Len( s2 ) + 1 ) *s3 = s2 Screen 13 Print "Byte: ";len(a) Print "Short: ";len(b) Print "Integer: ";len(c) Print "Longint: ";len(d) Print "UByte: ";len(au) Print "UShort: ";len(bu) Print "UInteger: ";len(cu) Print "ULongint: ";len(du) Print "Single: ";len(e) Print "Double: ";len(f) Print "Integer Pointer: ";len(g) Print "Byte Pointer: ";len(h) Print "Fixed String: ";len(s1) Print "Variable String: ";len(s2) Print "ZString: ";len(*s3) Deallocate(s3) Sleep
Типы переменных freebasic:
BYTE, UBYTE, SHORT, USHORT, INTEGER, UINTEGER, LONGINT и ULONGINT (64-разряда) - подмножество целочисленных типов.
SINGLE и DOUBLE - два вещественных типа
STRING * - cтроковые типы фиксированной длины
STRING - cтроковые типы переменной длины
ZSTRING - строки с завершающим нулевым байтом
IF , THEN
Для того, что бы что-то сравнить в Freebasic, как и в обычно бейсике применяется оператор IF и THEN. А так же ELSE, который переводится как "Иначе", т.е. если условие IF THEN не выполнится, то выполнится то, что после ELSE. Вот наш пример:
Dim a As Integer Screen 13 vvod: Input "VVEDITE CHISLO OT 1 DO 5";a If a<1 Or a>5 Then Goto vvod Else Print "VASHE CHISLO OT 1 DO 5" Sleep
Предлагаем пользователю ввести число от 1 до 5. Пользователь вводит. И
если число меньше 1 или больше 5, то мы предлагаем ввести число заново. Все
сравнения мы производим с помощью IF, Then, Else.
INKEY
Возвращает строковое представление нажатой пользователем клавиши. Как говорится, лучше один раз увидеть... Вот программа, использующая оператор INKEY
Dim As Integer i Dim key As String, driver As String Dim As Integer x,y Screen 14,0 x=0 y=0 For i=1 To 150 key = Inkey While key = "": key = Inkey: Wend If key=Chr(255)+"H" Then y=y-2 '' verh If key=Chr(255)+"P" Then y=y+2 '' vniz If key=Chr(255)+"M" Then x=x+2 '' pravo If key=Chr(255)+"K" Then x=x-2 '' vlevo Cls If key = Chr(255) + "k" Then End Circle(100+x,100+y),5, 50 Next i
В данной програме показано как можно, используя оператор INKEY,
осуществить эффект движения маленькой окружности вверх-вниз от курсорных
клавиш.
Как работает эта программа? Да очень просто, мы объявляем о
переменной "key" строкой "Dim key AS STRING, driver AS STRING", и запускаем
оператор INKEY в цикле "WHILE key = "": key = INKEY: WEND ". Пока не нажата ни
одна клавиша, ничего не происходит, а INKEY, сканирует клавиатуру. Как только мы
нажали клавишу, мы определяем с помощью строки "if key=chr(255)+"H" then y=y-2
'' verh ", нажат ли курсор вверх, если да, то уменьшаем координату "y" на 2
позиции. Очищаем экран с помощью CLS, и рисуем окружность на новой координате с
помощью "circle(100+x,100+y),5, 50". Ну и так далее, пока не будет нажата кнопка
"ESC", что мы вылавливаем спомощью "IF key = CHR(255) + "k" THEN END". Всё,
программа остановилась.
CLS
Очистку экрана в freebasic можно сделать с помощью оператора CLS. Вот небольшая программа показывает как работает оператор CLS:
Dim i As Integer For i=1 To 100 x=int(Rnd(1)*400) y=int(Rnd(1)*400) c=int(Rnd(1)*100) s=int(Rnd(1)*100) Circle (x,y),c,s Next i Sleep Cls Sleep
В общем, тут и рассказывать нечего. Оператор CLS действует в freebasic,
так же как и в консоли. Очищает экран, и всё тут.
COLOR
Freebasic предоставляет множество цветовых гамм, ну давайте посмотрим хотя бы
200 оттенков цветов при рисовании линии. Цвет мы указываем так:
line
(x1,y1)-(x2,y2), цвет линии.
Screen 13 Dim i As Integer For i=1 To 200 Line (0,i)-(400,i),i Next i Sleep
А теперь выведем надпись 'Hello World!' в красках. Это можно сделать, указав предварительно в операторе Color цвет фона , цвет текста .
Screen 13 Cls Color 0,1 Print "Hello World! - SINIJ" Color 0,2 Print "Hello World! - ZELENYJ" Color 0,3 Print "Hello World! - GOLUBOJ" Color 0,4 Print "Hello World! - KRASNYJ" Color 0,5 Print "Hello World! - ROZOVYJ" Color 0,6 Print "Hello World! - KORICHNEVYJ" Color 0,7 Print "Hello World! - BELYJ" Color 0,8 Print "Hello World! - SERYJ" Sleep
PSET
Рисование точки в freebasic не представляет никакой трудности. Для этого применяется оператор PSET(x,y),c - где x,y - координаты точки, с - цвет точки.
Screen 13 Dim i As Integer Dim x As Integer Dim y As Integer For i=1 To 3000 x=cos(i)*(Int(Rnd(1)*75)) y=cos(i)*(Int(Rnd(1)*75)) Pset (x+150,y+100),6 Next i Sleep
LINE
Оператор для рисования линии. Что бы нам было интересно, давайте сделаем с помощью оператора LINE эффект ёлочной снежинки
Screen 13 Dim i As Integer Dim x As Integer Dim y As Integer Dim g As String, driver As String g=inkey While g = "" g = Inkey For i=1 To 50000 x=cos(i)*(Int(Rnd(1)*190)) y=sin(i)*(Int(Rnd(1)*190)) Line (140,140)-(x*2.5,y*2.5),x Next i Wend
CIRCLE
С помощью оператора Circle, можно рисовать не только окружности. Спомощью него можно нарисовать также часть окружности, эллипс указав, после цвета параметры:
Circle(координата X, координата Y),радиус,цвет,начало,конец,коэффициент сжатия.
Чем больше параметр коэффициента сжатия, тем уже будет ваша окружность. Идеальный круг имеет коэффициент сжатия равным 1. Если Вы будете уменьшать коэффициент сжатия от 1 до 0, то Ваша окружность начнёт толстеть, превращаясь в эллипс.
Screen 13 Circle (100,90),50,3,0.01,0.5 Circle (100,100),50,3,0.01,1 Circle (100,110),50,3,0.01,1.5 Circle (100,120),50,3,0.01,2 Circle (100,130),50,3,0.01,2.5 Circle (100,140),50,3,0.01,3 Circle (200,100),50,3,0.1,3 Circle (200,110),50,3,0.3,3 Circle (200,120),50,3,0.05,3 Circle (200,130),50,3,0.05,3.5 Circle (140,60),10,7 Circle (135,55),10,7 Circle (135,60),10,7 Circle (140,55),10,7 Paint (138,57),7,7 Sleep
SCREEN
Обычно, режим экрана переключают с помощью оператора SCREEN n, где n-режим.
Более расширенный вариант:
SCREEN режим экрана,глубина цвета в
битах,активная страница,видимая страница.
Глубина цвета в битах за пиксель может иметь значение 8,15,16,24,32 бита. Это значение отражает качество картинки.
В таблице приведены старые, которые применялись в qbasic'e (1 до13) и новые режимы FB SVGA (с 14 по 21), которые все применяются сейчас в freebasic :
Режим | Разрешение | Экран | Текст | Символ | Цвета |
---|---|---|---|---|---|
1 | 320x200 | CGA | 80x25 | 8x8 | 16 фоновых цветов |
2 | 640x200 | CGA | 40x25 | 8x8 | 16 цветов |
7 | 320x200 | EGA | 40x25 | 8x8 | 16 цветов |
8 | 320x200 | EGA | 40x25 | 8x8 | 16 цветов |
9 | 640x350 | EGA | 80x25 или 80x43 | 8x14 или 8x8 | 16 цветов |
11 | 640x480 | VGA | 80x30 или 80x60 | 8x16 или 8x8 | 256К цветов 2 атрибутам |
12 | 320x200 | MCGA | 40x25 | 8x8 или 8x8 | 256К цветов 16 атрибутам |
13 | 320x200 | MCGA | 40x25 | 8x8 или 8x8 | 256K цветов 256 атрибутам |
14 | 320x240 | - | 40x30 | 8x8 | 256K цветов 256 атрибутам |
15 | 400x300 | - | 50x37 | 8x8 | 256K цветов 256 атрибутам |
16 | 512x384 | - | 64x24 или 64x48 | 8x16 или 8x8 | 256K цветов 256 атрибутам |
17 | 640x400 | - | 80x25 или 80x50 | 8x16 или 8x8 | 256K цветов 256 атрибутам |
18 | 640x480 | - | 80x30 или 80x60 | 8x16 или 8x8 | 256K цветов 256 атрибутам |
19 | 800x600 | - | 100x37 или 100x75 | 8x16 или 8x8 | 256K цветов 256 атрибутам |
20 | 1024x768 | - | 128x48 или 128x96 | 8x16 или 8x8 | 256K цветов 256 атрибутам |
21 | 1280x1024 | - | 160x64 или 160x128 | 8x16 или 8x8 | 256K цветов 256 атрибутам |
Пример использования оператора SCREEN:
Screen 13 Sleep
PAINT
Оператор - заливка цветом. Формат оператора PAINT, следующий. Указывается координата точки заливки x,y: Paint (x,y),цвет заливки, цвет границы.
Dim i As Integer,j As Integer ' объявляем о переменных i,j Screen 13 ' режим экрана 320x200 For i=1 To 320 Step 20 'цикл для х-координаты For j=1 To 200 Step 20 'цикл для y-координаты Line (i,j)-(i+10,j+10),2,b ' рисуем квадрат Paint (i+5,j+5),i,2 ' закрашиваем квадрат цветом i, граница 2 Next j,i ' цикл j,i Sleep ' пауза