Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Pascal. Перемещение изображений. Без эфекта "мерцания"

15K
22 мая 2007 года
Салага
26 / / 19.12.2006
Задание:
Гонки шаров. Нарисовать 4 шара. Перемещать их практически до конца экрана. Скорость перемещения - случайное число.

Проблема:
Изображение на 2-3 шаге начинает криво вырезаться вставка тоже прохродит криво.

Код:

Код:
uses crt,graph;

Type arr=array [0..4] of integer;

{ А эта процедура рисует 1(один) шарик }
procedure ball(x0,y0,r,color:integer;s:string);
 begin
 setcolor(1); {  Установка цвета }
  setfillstyle(1,color);  
  circle(x0,y0,r);  {  рисуем кружок }
  floodfill(x0,y0,1);  {  а теперь закрашиваем его }
  setcolor(15);
  outtextxy(x0-r div 2,y0-5,s);  {   печатаем символ ~ в центре}
  end;

Procedure ZabivKoord(r:integer; Var massX:arr; var massY:arr);
Var
    i:integer;
begin
massY[0]:=0;
    for i:=1 to 4 do
        begin
            massX:=20;
            massY:=massY[i-1]+{*}r*5; { Координаты по У, здесь (*)делаем шаг, }
            {что бы шары не наезжали друг на друга }
        end;
end;

{ В  этой процедуре мы будем вырезать, а потом -вставлять вырезанное изображение}
procedure sdvig(x,y,r,d:integer);
Var   size:longint;
      p:pointer;
      i:integer;

begin
Size := ImageSize(x-r-5, y-r-2, x+r+200, y+r+2);

GetMem(P, Size);
GetImage(x-r-2, y-r-2, x+r+200, y+r+2, P^);  {  копируем изображение}

begin
PutImage(x-13,y-13, P^,NormalPut);  { вставляем изображение}
end;

end;

var
  grDriver: Integer;
  grMode: Integer;
  x,y,r,fon,i,j:integer;
  XO:arr;  {в этом массиве хранятся координаты по х }
  YO:arr;   { соответсвенно в этом - по У}
  s:string;

begin {MAIN}

grDriver := VGA;
grMode:=VGAHi;
InitGraph(grDriver, grMode,'d:\prog\tp7\bgi');

fon:=3;
 r:=12;
setbkcolor(fon);  {Цвет фона}

{ В массив  ХО пишем координаты по Х, а в массив УО координаты по У }
ZabivKoord(r,XO,YO);

 { Рисуем 4 круга }
for i:=1 to 4 do
    begin
     str(i,s);
     ball(XO,YO,r,i+i,s);
    end;
readln;

    for j:=1 to 256 do
        begin
        for i:=1 to 4 do
        begin
         sdvig(XO+j,YO,r,j);
         readln; {Задержка до нажатия, причина - контроль на каждом шаге }
        { delay(5000);}
         end;
        end;
cleardevice;
readln;
End.
9.0K
23 мая 2007 года
ikro
31 / / 12.03.2007
Мерцания вполне естественны. Предлагаю тебе переписать процедуры работы с графикой самому на асме и использовать двойную буферизацию (в данном случае переключение страниц видеопамяти). Тогда мерцаний не будет...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог