КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Вывод текста в графическом режиме
End. Begin End. Begin Копирование и движение областей экрана До сих пор мы заставляли двигаться лишь простые объекты: окружности, квадраты, линии. Если же мы хотим заставить двигаться что-нибудь посложнее, например, снеговика из 9.3, то нам придется изрядно потрудиться. Чтобы не рисовать и не стирать по-очереди все элементы, из которых состоит снеговик, мы можем использовать процедуры GetImage и PutImage, которые позволяют копировать любую прямоугольную область экрана целиком в другое место экрана.
Пример 1. Нарисуем в левом верхнем углу экрана четыре окружности, а затем скопируем получившиеся «очки» в правый нижний угол. USES Graph; VAR Gd, Gm: Integer; P: pointer; Size: Word; Gd:= 0; InitGraph(Gd, Gm, 'с:\tp\bgi'); SetLineStyle(0,0,Thickwidth); {Рисуем очки:} Circle(50,100,20); Circle(50,100,15); Circle(90,100,20); Circle(90,100,15); {В целях наглядности нарисуем также диагональ экрана:} Line(0,0,640,480);
Size:= ImageSize(10,60,120,140); GetMem(P, Size); GetImage(10,60,120,140,P^); ReadLn; PutImage(500,400, P^,0); ReadLn; CloseGraph Пояснения: Чтобы скопировать область экрана, Паскаль должен сначала ее запомнить в оперативной памияти. Выберем мысленно прямоугольник, охватывающий объект, предназначенный для копирования. В нашем случае подойдет прямоугольник между точками (10,60) и (120,140). Чтобы знать, сколько памяти отвести под запоминание области, компьютер должен знать размер изображения в байтах. Этот размер сообщает функция ImageSize. Поскольку размер этот может оказаться большим, то запоминать изображение лучше всего в куче. Отводит место в куче процедура GetMem. Вот ее вызов - GetMem(P, Size). P – так называемый указатель на место в памяти, предназначенное для запоминания. Указатели – это новый для нас тип данных. Останавливаться на них я не буду, скажу только, что они очень похожи на ссылки. Запоминает область процедура GetImage, параметр которой P^ имеет значением изображение этой области. Процедура PutImage помещает это изображение в точно такой же прямоугольник экрана с верхним левым углом в точке (500,400). Если вы уже запустили эту программу, то могли видеть, что GetImage прихватил в выделенном прямоугольнике и кусок диагонали, а PutImage добросовестно поместил на экран все, что прихватил GetImage, начисто стерев все, что там было раньше. Ответственность за это несет последний параметр PutImage, равный у нас нулю. Для того, чтобы новое изображение не затирало старое, нужно использовать вместо нуля двойку. Задание 130: Нарисуйте шеренгу из десятка снеговиков.
Пример 2. Попробуем двигать наши очки слева направо. USES Graph,crt; VAR x,Gd, Gm: Integer; P: pointer; Size: Word; Gd:= 0; InitGraph(Gd, Gm, 'с:\tp\bgi'); SetLineStyle(0,0,Thickwidth); {Рисуем очки:} Circle(50,100,20); Circle(50,100,15); Circle(90,100,20); Circle(90,100,15); {Рисуем диагональ:} Line(0,0,640,480); Size:= ImageSize(10,60,120,140); GetMem(P, Size); GetImage(10,60,120,140,P^); {Начинаем движение:} x:=20; while x<300 do begin PutImage(x, 150, P^,1); Delay(40); PutImage(x, 150, P^,1); x:=x+1; end {while}; CloseGraph Пояснение: Чтобы нарисовать очки в каком-то месте, а потом их стереть, достаточно два раза подряд употребить оператор PutImage(x, 150, P^,1). Обратите внимание, что изображение прямой, по которому прошлись очки, не затерлось. Все это - результат удивительного действия константы 1. Но чтобы понять механизм ее действия, нужно знать азы алгебры логики, которые, к сожалению, у меня нет времени излагать. Задание 131: Пусть два снеговика идут друг другу навстречу.
Процедура WriteLn печатает маленькие буквы скучного начертания. В модуле Graph имеются процедуры SetTextStyleи OutTextXY, которые общими усилиями печатают буквы разного размера (в том числе и очень крупного) нескольких изящных очертаний, причем процедура SetTextStyle задает стиль и размер букв, а процедура OutTextXY печатает строку букв заданного стиля и размера в заданном месте экрана. Например, в результате выполнения фрагмента SetTextStyle (4,0,8); OutTextXY(200,300,’Hello!’) на экране появится строка Hello!, выполненная шрифтом4 (готический) размера 8. Левый верхний угол строки будет находиться в точке (200,300). Число 0 означает обычное горизонтальное направление текста, 1 – вертикальное, 2 - горизонтальное с лежащими буквами. Цвет текста, как и цвет фигур, определяется процедурой SetColor. Всего в Паскале есть 5 стандартных шрифтов: 0 - обычный растровый (остальные - векторные) 1 - полужирный 2 - тонкий 3 - газетный 4 – готический Размер букв зависит от шрифта. Можно независимо менять высоту и ширину букв. Для этого существует процедура SetUserCharSize. Например, SetUserCharSize(7,3, 9,4) устанавливает ширину букв в 7/3 раза больше нормальной, а высоту - в 9/4. К сожалению, стандартный набор векторных шрифтов Паскаля не поддерживает русские буквы. Если вы хотите красиво писать по-русски, вам придется где-нибудь найти подходящие файлы русских шрифтов.
Недостаток OutTextXY - она выводит только строковые выражения. Покажу, как обмануть ее и напечатать значение числового выражения. Пусть переменная aописана, как Integer, и равна 937. Оператор OutTextXY(200,200, a) не захочет ее печатать. Тогда придумаем переменную as и опишем ее, как String. Следующий фрагмент делает дело: a:=937; Str(a,as); OutTextXY(200,200, as) Процедура Strпреобразует число a=937 в строку из трех символов as=’937’. Для симметрии покажу и обратную процедуру Val: VAR a,err:Integer; as:String;
Дата добавления: 2014-12-27; Просмотров: 463; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |