Помощь - Поиск - Пользователи - Календарь
Полная версия: Рэндомное движение объекта
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Muniz
Помогите пожалуйста решить проблему с мерцанием объекта. При каждой итерации цикла объект перемещается и при этом мерцает. Как это устранить?
код:

program a1111;
uses crt,graph;
var
 gd,gm:integer;
 i,j:integer;c:char;
 xw1,yw1,
    a:integer;
    k:char;
    size:integer;
    p:pointer;
begin;   randomize;

gd:=ega;
 gm:=egahi;
  initgraph(gd,gm,'D:\Program files\Turbo Pascal\BGI\');

xw1:=15;   yw1:=15;

{monstr1}
  setfillstyle(solidfill,cyan);
   setcolor(cyan);
    ellipse(xw1,yw1+6,0,180,7,14);
  line(xw1-7,yw1+6,xw1+7,yw1+6);
   setfillstyle(solidfill,cyan);
    floodfill(xw1,yw1+5,cyan);
 {rot}
  setcolor(black);
   line(xw1-4,yw1+3,xw1+4,yw1+3);
 {rot}
 {nogi}
  setcolor(cyan);
   line(xw1-7,yw1+6,xw1-6,yw1+8);
    line(xw1-5,yw1+6,xw1-6,yw1+8);
     floodfill(xw1-6,yw1+7,cyan);
   line(xw1-4,yw1+6,xw1-3,yw1+8);
    line(xw1-4,yw1+6,xw1-3,yw1+8);
     floodfill(xw1-3,yw1+7,cyan);
   line(xw1+2,yw1+6,xw1+3,yw1+8);
    line(xw1+4,yw1+6,xw1+3,yw1+8);
     floodfill(xw1+3,yw1+7,cyan);
   line(xw1+5,yw1+6,xw1+6,yw1+8);
    line(xw1+7,yw1+6,xw1+6,yw1+8);
     floodfill(xw1+6,yw1+7,cyan);
 {nogi}
 {glasa}
  setcolor(white);
   circle(xw1-3,yw1-3,2);
    circle(xw1+3,yw1-3,2);
  setfillstyle(solidfill,white);
   floodfill(xw1-3,yw1-2,white);
    floodfill(xw1+3,yw1-2,white);
  setcolor(black);
   circle(xw1-3,yw1-3,1);
    circle(xw1+3,yw1-3,1);
  setfillstyle(solidfill,black);
   floodfill(xw1-3,yw1-3,black);
    floodfill(xw1+3,yw1-3,black);
 {glasa}
{monstr1}
  size:=imagesize(xw1-10,yw1-10,xw1+10,yw1+10);
   getmem(p,size);
    getimage(xw1+10,yw1+10,xw1-10,yw1-10,p^);

   setcolor(white);
    line(0,0,100,0);
     line(100,0,100,100);
      line(100,100,0,100);
       line(0,100,0,0);


    repeat
    putimage(xw1+10,yw1+10,p^,xorput);
    delay(12);
    putimage(xw1+10,yw1+10,p^,xorput);

    a:=random(10)+1;

    if (a=1)and(xw1>20) then begin xw1:=xw1-5; end;
    if (a=2)and(xw1<70) then begin xw1:=xw1+5; end;
    if (a=3)and(yw1>60) then begin yw1:=yw1-5; end;
    if (a=4)and(yw1<70) then begin yw1:=yw1+5; end;
{monstr1}
  setfillstyle(solidfill,cyan);
   setcolor(cyan);
    ellipse(xw1,yw1+6,0,180,7,14);
  line(xw1-7,yw1+6,xw1+7,yw1+6);
   setfillstyle(solidfill,cyan);
    floodfill(xw1,yw1+5,cyan);
 {rot}
  setcolor(black);
   line(xw1-4,yw1+3,xw1+4,yw1+3);
 {rot}
 {nogi}
  setcolor(cyan);
   line(xw1-7,yw1+6,xw1-6,yw1+8);
    line(xw1-5,yw1+6,xw1-6,yw1+8);
     floodfill(xw1-6,yw1+7,cyan);
   line(xw1-4,yw1+6,xw1-3,yw1+8);
    line(xw1-4,yw1+6,xw1-3,yw1+8);
     floodfill(xw1-3,yw1+7,cyan);
   line(xw1+2,yw1+6,xw1+3,yw1+8);
    line(xw1+4,yw1+6,xw1+3,yw1+8);
     floodfill(xw1+3,yw1+7,cyan);
   line(xw1+5,yw1+6,xw1+6,yw1+8);
    line(xw1+7,yw1+6,xw1+6,yw1+8);
     floodfill(xw1+6,yw1+7,cyan);
 {nogi}
 {glasa}
  setcolor(white);
   circle(xw1-3,yw1-3,2);
    circle(xw1+3,yw1-3,2);
  setfillstyle(solidfill,white);
   floodfill(xw1-3,yw1-2,white);
    floodfill(xw1+3,yw1-2,white);
  setcolor(black);
   circle(xw1-3,yw1-3,1);
    circle(xw1+3,yw1-3,1);
  setfillstyle(solidfill,black);
   floodfill(xw1-3,yw1-3,black);
    floodfill(xw1+3,yw1-3,black);
 {glasa}
{monstr1}

   setfillstyle(solidfill,black);
    floodfill(xw1,yw1,black);



until keypressed;
freemem(p,size);
closegraph;
readkey
end.

Lapp
Цитата(Muniz @ 18.05.2009 0:42) *
При каждой итерации цикла объект перемещается и при этом мерцает. Как это устранить?
Устранить мерцание можно, например, переключением страниц (SetActivePage, SetVisualPage). Иногда можно просто более аккуратным программированием. Но в твоей программе, извини, черт ногу сломит. Так писать такие вещи нельзя. У тебя, например, FloodFill иногда просачивается, и тогда заполняется весь экран. Вообще FloodFill лучше не использовать для движущихся объектов. Зачем ты все вырисовываешь? Сделай все только через PutImage. Если нужно - сделай несколько картинок (кадров) и плюй последовательно. И детали тоже - глаза, ноги..

А вообще, схема такая:

1. Нарисовать
2. Произвести необходимые вычисления (новые координаты и т.п.)
3. Если нужно - подождать.
4. Стереть
5. Перейти к 1.

И между Стиранием и Рисованием не должно быть абсолютно ничего.

Я уж молчу про форматирование кода.. Бррр...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.