Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Графическая задача на Паскале (http://www.tehnari.ru/f41/t73622/)

Altana 21.05.2012 15:23

Графическая задача на Паскале
 
Через процедуру сделать мигающий квадрат.. Т.е в центре экрана появляется квадрат, затем исчезает, затем появляется другой, но уже другого цвета и другого размера, затем исчезает, затем другой и т.д. Это продолжается, пока пользователь не нажмет Esc.
:tehnari_ru_837:

Vladimir_S 21.05.2012 15:28

Какой Паскаль - ABC? Free? Turbo? Когда речь о графике, это принципиальнейший момент! Пока подскажу простейший алгоритм. В цикле:
1. Задаем цвет.
2. Рисуем квадрат.
3. Меняем цвет на фоновый.
4. Рисуем тот же квадрат.
5. Переходим к п.1.

Altana 21.05.2012 17:10

Turbo Pascal.
п.3 - нельзя ли просто сделать отчистку экрана с помощью ClrScr?

Vladimir_S 21.05.2012 17:23

Цитата:

Сообщение от Altana (Сообщение 735660)
п.3 - нельзя ли просто сделать отчистку экрана с помощью ClrScr?

Можно и так. Просто дольше.
Фу, прошу прощения - поторопился. Не ClrScr (это текстовая CRT-шная команда), а ее графическим аналогом ClearDevice.

Vladimir_S 21.05.2012 19:36

Даже нарисовал программку - самому интересно стало:
Код:

Uses CRT, Graph;
Var
 A:Word;
 C:Char;
Begin
 InitGraph(..); {ТУТ САМОСТОЯТЕЛЬНО}
 Randomize;
 SetLineStyle(SolidLn,0,ThickWidth);
 Repeat
  A:=(Round(GetMaxY*0.1)+Random(Round(GetMaxY*0.9))) div 2;
  SetColor(1+Random(15));
  Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A);
  Delay(100);
  SetColor(GetBkColor);
  Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A);
  If KeyPressed then C:=ReadKey;
 Until C=#27;
 CloseGraph;
End.


Altana 22.05.2012 13:13

чорд.. мне тут вообще ничего не понятно, неизвестные команды(

Vladimir_S 22.05.2012 13:18

Цитата:

Сообщение от Altana (Сообщение 736024)
чорд.. мне тут вообще ничего не понятно, неизвестные команды(

Конкретнее? А вообще-то это самые обычные команды Borland-графики (модуль Graph). Установить толщину линии, выбрать цвет, нарисовать квадрат... да и всё вроде.

Altana 22.05.2012 13:26

честно эти команды впервые вижу, мне бы уровень 10 класса) ну там циклы, условия и т.п)
иии..что такое "GetMахХ"? И для чего вводится переменная "А"?

Vladimir_S 22.05.2012 14:29

Цитата:

Сообщение от Altana (Сообщение 736036)
что такое "GetMахХ"? И для чего вводится переменная "А"?

GetMaxX - это функция, возвращающая максимальное значение (в пикселах) горизонтальной координаты графического экрана. Поскольку я работаю в DOS VGA моде, то у меня это 640. Соответственно GetMaxY - то же для вертикальной координаты (у меня - 480). При этом не забываем, что отсчет вертикалей ведется сверху вниз, т.е. точка с координатами 0,0 - это левый верхний угол экрана.
A - это половина стороны квадрата. В программе сделано так: если H - полная высота экрана, то полная длина стороны квадрата выбирается случайным образом из диапазона (0.1*Н)..(0.9*Н).

Vladimir_S 22.05.2012 14:54

Вложений: 1
А впрочем, ладно - попробую объяснить смысл каждой из команд.

Код:

Uses CRT, Graph; {Подключаем дополнительные модули}
Var {Объявляем переменные}
 A:Word;
 C:Char;
Begin
 InitGraph(..); {ТУТ САМОСТОЯТЕЛЬНО} {Конфигурируем процедуру запуска графического режима и запускаем его}
 Randomize; {Включаем генератор случайных чисел}
 SetLineStyle(SolidLn,0,ThickWidth); {Устанавливаем стиль рисования линий - сплошная, жирная}
 
Repeat {Открываем цикл рисования квадратов}
  A:=(Round(GetMaxY*0.1)+Random(Round(GetMaxY*0.9))) div 2; {Случайным образом выбираем значение половины стороны квадрата от 0.05*Н до 0.45*Н, где Н - полная высота экрана в пикселах}
  SetColor(1+Random(15)); {Случайным образом выбираем цвет квадрата; нумерация цветов на картинке внизу}
  Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A); {Рисуем квадрат, указывая координаты левого нижнего и правого верхнего углов}
  Delay(100); {Даем задержку в 0.1 секунды, иначе никаких квадратов разглядеть будет просто невозможно}
 
SetColor(GetBkColor); {Устанавливаем цвет, равный цвету фона}
 
Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A); {Снова рисуем тот же квадрат, но уже фоновым цветом, в результате чего нарисованный квадрат исчезает}
  If KeyPressed then C:=ReadKey; {Проверяем, не нажата ли какая-нибудь клавиша, а если нажата, то ее мнемокод передаем переменной С}
 Until C=#27; {Если нажатая клавиша - это клавиша Esc, то завершаем цикл}
 CloseGraph; {Отменяем графический режим. Команда необязательная, но желательная}
End.



Часовой пояс GMT +4, время: 17:58.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.