Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2008, 23:04   #1
glasian
Пользователь
 
Регистрация: 15.06.2008
Сообщений: 32
По умолчанию помогите с графикой

помогите с прогой у меня должен реять флаг,а он ещё и мигает.как убрать мигание?
вот прога:Program V23_N12;
uses graph,crt;
var
grDriver,grMode,ErrCode: Integer;
i,x1,x2,Size,j : word;
P,P1 : Pointer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
randomize;
if ErrCode = grOk then
begin { Do graphics }
setcolor(1+random(15));
for j:=0 to 100 do begin
x1:=250;x2:=303;
for i:=0 to 1 do begin
Arc(x1, j+150, 45, 135, 40);
Arc(x2, j+90, 225, 315, 40);
x1:=x1+106;
x2:=x2+106;
end;
end;
line(438,119,438,218);
Size := ImageSize(221, 100, 439, 250);
GetMem(P, Size);{‚뤥«Ґ*ЁҐ ¬Ґбв Ї®¤ Є авЁ*Єг ў ¤Ё* ¬ЁзҐбЄ®© Ї ¬пв©}
GetImage(221, 100, 439, 250, P^);
ClearDevice;
for j:=0 to 100 do begin
x1:=250;x2:=303;
for i:=0 to 1 do begin
Arc(x2, j+150, 45, 135, 40);
Arc(x1, j+90, 224, 315, 40);
x1:=x1+106;
x2:=x2+106;
end;
end;
line(438,122,438,221);
Size := ImageSize(221, 100, 439, 250);
GetMem(P1, Size);
GetImage(221, 100, 439, 250, P1^);
ClearDevice;
line(220,115,220,479);
while not keypressed do begin
PutImage(221, 100, P^, XorPut);
delay(10000);
PutImage(221, 100, P^, XorPut);
PutImage(221, 100, P1^, XorPut);
delay(10000);
PutImage(221, 100, P1^, XorPut);
end;

CloseGraph;
end
else
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end.
glasian вне форума Ответить с цитированием
Старый 20.06.2008, 09:50   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

В дос Паскале от мерцания ты врядли избавишься.
У меня есть код для развевающегося флага для TurboC и для QBasic, правда отрисовка флага процедурная (не из картинки). Если подойдет переведешь на Паскаль, исходники и экзешник для демонстрации во вложении.
Вложения
Тип файла: rar flag.rar (29.5 Кб, 18 просмотров)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 20.06.2008, 14:19   #3
glasian
Пользователь
 
Регистрация: 15.06.2008
Сообщений: 32
По умолчанию

а мне как раз и надо самому флаг нарисовать,то что ты мне файлы дал они у меня не пашут.мож паскалевский файл скинуть а то я сам не смогу перевести.
glasian вне форума Ответить с цитированием
Старый 20.06.2008, 14:47   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Если ты свою программу V23_N12 сам писал, ты переведешь, твоя программа сложнее, переводи с С++, там структура программы более похожа, все таки TurboC, граф режим тот же, да и объявление переменных, заголовки.
Да и незнаю я досовский паскаль.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.06.2008, 09:14   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

перевёл программку Мутабора на Pascal:
Код:
Program graph_flag;
uses crt,dos,graph;
var
i:integer;
driver,mode,errcode:integer;
x,y,z,w : integer;
begin
 x:=100;
 y:=100;
 z:=99;
 driver:=vga;
 mode:=vgahi;
 initgraph(driver,mode,'');
 ErrCode:=graphResult;
 if ErrCode<>grok then
  begin
   writeln('Error');
   readln;
   halt(1);
  end;

repeat
 x:=100; z:=z+1; w:=z;
 for i:=0 to 150 do
 begin
  inc(x); inc(w);
  if (i>=0) and (i<=50) then setcolor(1);
  if (i>50) and (i<=100) then setcolor(4);
  if (i>100) then setcolor(7);
  y:=trunc( sin(w*0.04)*10+110);
  line(x,y,x,y+100);
  setcolor(0);
  line(x,100,x,y);
  line(x,220,x,y+100);
 end; 
until KeyPressed;
closegraph;
end.

mutabor, к слову просто, у меня тоже не получилось запустить откомпилированную программку - либо неправильно подсовывал для flag.exe BGI файлы, либо они несовместимы в DOS Pascal и turbo C
впрочем, это уже неважно ;-)) Кстати, если бы она у меня запустилась, вряд ли я стал бы её переписывать на Pascal... :-) а так захотелось посмотреть на флажок :-)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2008, 17:27   #6
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

glasian, в своей програмке попробуй заменить кусок:
while not keypressed do begin
PutImage(221, 100, P^, XorPut);
delay(10000);
PutImage(221, 100, P^, XorPut);
PutImage(221, 100, P1^, XorPut);
delay(10000);
PutImage(221, 100, P1^, XorPut);
end;

на следующий:
while not keypressed do begin
PutImage(221, 100, P^, NormalPut);
delay(20000);
PutImage(221, 100, P1^,NormalPut);
delay(20000);
end;

по-моему, результат улучшился
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 21.06.2008, 17:32   #7
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Так как большая часть изображения статична, а мерцание краев заметно меньше
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 21.06.2008, 17:36   #8
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

А вообще, причины мерцания как миниум две:
1) С помощью стандартных средств паскаля (к которым относится и PutImage) картинка рисуется слишком долго.
2) Нет синхронизации начала рисования картинки с начальным моментом прорисовки экрана и в результате ты в одном кадре можешь увидеть часть первой картинки и часть второй (ну или пустоту)
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 26.06.2008, 00:15   #9
glasian
Пользователь
 
Регистрация: 15.06.2008
Сообщений: 32
По умолчанию

спс большое
glasian вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОМОГИТЕ с графикой в ПАСКАЛЕ!! Marat.kmr Фриланс 4 05.06.2008 22:22
Помогите с графикой tagjik Помощь студентам 4 03.06.2008 08:05
помогите пожалуйста с графикой s014613 Помощь студентам 2 23.05.2007 15:00
Помогите с графикой (Простой вопрос) niva622 Помощь студентам 6 17.01.2007 15:59