Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Движение фигур  (Прочитано 21001 раз)
0 Пользователей и 1 Гость смотрят эту тему.
no4nik
Гость
« : 11-03-2007 15:41 » 

Подскажите пожалуйста как наиболее быстро стирать и рисовать н-р круг. Я использовал fillellipse, потом getimage/putimage  но при перерисовке все равно заметно мигание. (Пишу в Borland C++ v3.1)
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-03-2007 15:51 » 

Ну попробуй алгоритм Брезенхема Улыбаюсь.
Администрация/модераторы, тема не здесь должна быть. Правда еще не совсем понятно, нде именно Улыбаюсь. no4nik, поподробней, что делаешь, на чем делаешь, как делаешь, зачем это делаешь, чего хочешь достич. Код не помешает Ага.
« Последнее редактирование: 11-03-2007 15:54 от nikedeforest » Записан

ещё один вопрос ...
no4nik
Гость
« Ответ #2 : 11-03-2007 16:46 » 

в общем есть класс точка, базовый, и производный от него класс круг. Надо чтобы круг произвольно перемещался по экрану. Произвольную траекторию я вроде придумал, но вот с эффектом движения не знаю что делать. эффет движения у меня состоит в следующем:
1)стереть на стереть на старом месте
2)нарисовать на новом месте
3)задержка
все классы тут:
grobj2.cpp
Код:
#include <dos.h>
#include <time.h>
#include <math.h>
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
class TPoint
{
  public:

   TPoint(int ax,int ay,int c,int d):
    x(ax),y(ay),color(c),dl(d)
    {
       init();
       GetKoords();
     };

   TPoint()
     {
       randomize();
       x=random(xmax);
       y=random(ymax);
       color=random(getmaxcolor());
       dl=5;
       init();
       GetKoords();
     };

   int GetColor() const
     {
       return color;
     };

   void SetColor(int c)
     {
       color=c;
     };

   void GetPos(int &xp,int &yp) const
     {
       xp=x;
       yp=y;
     };

   void SetPos(int xp,int yp)
     {
       x=xp;
       y=yp;
     };

   void Fly3();

   virtual void Show() const
     {
       putpixel(x,y,color);
     };

   virtual void Hide()
     {
       putpixel(x,y,bgcolor);
     };

   int xmax,ymax,bgcolor;

   struct koords
   {
     int x2,y2,rp,r,w,h,sh,i;
   }k;

 protected:

   void init();
   int x,y,color,dl;
   void GetKoords();
   virtual void MoveTo(int nx,int ny);
   struct arccoordstype arcinfo;

 private:

};
/*------------------------------------------------------*/
void TPoint::init()
{
  int gdriver,gmode,errorcode;

  if (getgraphmode()!=2)
  {
    detectgraph(&gdriver,&gmode);
    initgraph(&gdriver,&gmode,"");
    errorcode=graphresult();
    if (errorcode!=grOk)
     {
       printf("Graph error:%s\n",grapherrormsg(errorcode));
       getch();
       exit(1);
     }
  }
  bgcolor=0;
  xmax=getmaxx();
  ymax=getmaxy();
  setcolor(bgcolor);
};

/*------------------------------------------------------*/

void TPoint::MoveTo(int nx,int ny)
{
  if (nx<0) nx=0;
    else if (nx>xmax) nx=xmax;
  if (ny<0) ny=0;
    else if (ny>ymax) ny=ymax;
//  putpixel(x,y,0);    /*   off for proc1 */
  x=nx;y=ny;
  putpixel(x,y,color);
  delay(dl);
};
/*------------------------------------------------------*/

void TPoint::Fly3()
{
 // struct arccoordstype arcinfo;
  int d;

  if (k.w)
    k.rp+=k.sh;
  else
    k.r+=k.sh;
  d=k.w*k.sh-(k.w-1);
  arc(k.x2, k.y2, k.rp, k.rp+d, k.r);
  getarccoords(&arcinfo);
  MoveTo(arcinfo.xend,arcinfo.yend);
  if (++k.i > k.h) GetKoords();
};
/*------------------------------------------------------*/

void TPoint::GetKoords()
{ //int re;
 // struct arccoordstype arcinfo;
//      k.r=(abs(xmax-x) < abs(ymax-y)) ? abs(xmax-x):abs(ymax-y);
 //     randomize();
      k.r=random(130)+10;
      k.rp=random(340)+20;
      setcolor(bgcolor);
      arc(x,y,0,k.rp,k.r);
      setcolor(color);
      getarccoords(&arcinfo);
      k.x2=arcinfo.xend;  //koordinaty for new arc
      k.y2=arcinfo.yend;
     // k.rp=re-180;
     k.rp-=180;
      if (x==k.x2)
if(y>k.y2) k.rp=-90;
else k.rp=90;
      if (y==k.y2)
if(x>k.x2) k.rp=0;
else k.rp=180;
      k.w=random(2);
      k.sh=pow(-1,random(2));
      if (k.w)
k.h=random(150)+20;  //to arc
      else
if (k.sh<0)       //k.sh=1 ->k.h<0 else k.h>0
  k.h=random(k.r);
else
  k.h=random(180)+20;        // to line
      k.i=0;
}
/*-----------------------------------------------*
*                                                 *
*                   Circle                        *
*                                                 *
 *------------------------------------------------*/

class TCircle : public TPoint
{
  public:
    TCircle(int ax,int ay,int c,int d,int r) :
      TPoint(ax,ay,c,d), rd(r)
      {
GetPic();
setcolor(color);
      };
    TCircle();
    ~TCircle()
      {
free(pic);
Hide();
      };
    int rd;
    void MoveTo(int nx,int ny);
    void Show() const;
    void Hide();
 protected:
    void GetPic();
 private:
    void *pic;
    unsigned int size;
};
/*------------------------------------------------------*/
TCircle::TCircle()
{
 rd=random(50)+10;
 dl=0;
 x=random(xmax-2*rd)+rd;
 y=random(ymax-2*rd)+rd;
 GetPic();
};
/*------------------------------------------------------*/
void TCircle::GetPic()
{
  Show();
  size = imagesize(x-rd,y-rd,x+rd,y+rd);
  pic = malloc(size);
  getimage(x-rd,y-rd,x+rd,y+rd,pic);
  Hide();
};

/*------------------------------------------------------*/
void TCircle::Show() const
{
  setfillstyle(1,color);
  fillellipse(x,y,rd,rd);
};
/*------------------------------------------------------*/
void TCircle::Hide()
{
  setfillstyle(1,bgcolor);
  fillellipse(x,y,rd,rd);
};

/*------------------------------------------------------*/

void TCircle::MoveTo(int nx,int ny)
{
  if (nx<rd) nx=rd;
    else if (nx>xmax-rd) nx=xmax-rd;
  if (ny<rd) ny=rd;
    else if (ny>ymax-rd) ny=ymax-rd;
//  setcolor(0);
  setfillstyle(1,0);
  fillellipse(x,y,rd,rd);
  x=nx;y=ny;
  setfillstyle(1,GetColor());
  fillellipse(x,y,rd,rd);
  delay(dl);
  setcolor(0);
/*  putimage(x-rd,y-rd,pic,XOR_PUT);
  //delay(dl);
  //putimage(x-rd,y-rd,pic,XOR_PUT);
  x=nx;
  y=ny;
  putimage(x-rd,y-rd,pic,XOR_PUT);
  delay(dl);*/
}
/*------------------------------------------------------*/
рабочая программа:
Код:
#include "grobj2.cpp"
void main()
{
  TCircle c(320,240,2,0,50);
  TPoint t(320,240,2,10);
//  directvideo=1;
  setcolor(0);
//    c.Show();
    while (!kbhit()) c.Fly3();
  getch();
  closegraph();
}
это кстати моя лабораторная по программированию.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 11-03-2007 18:51 » 

no4nik, от мигания можно избавится используя буфер: рисуешь в буфере, а потом его копируешь на экран. Во многих графических режимах поддерживаются несколько страниц - можно рисовать на невидимой, а потом переключать их.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
no4nik
Гость
« Ответ #4 : 12-03-2007 14:20 » 

Буфер это конечно интересно, но как реализовать это в С++?
Причем в данной программе у меня круг хранится в буфере и периодически рисуется на новоим месте.
Допустим буфер можно создать например так
unsigned int size;
void *buf;
size = imagesize(0,0,getmaxx(),getmaxy());
buf = malloc(size);
getimage(0,0,getmaxx(),getmaxy(),buf)
Но как в нем рисовать?
Записан
no4nik
Гость
« Ответ #5 : 12-03-2007 14:25 » 

я еще вот что подумал: может попробовать использовать какую-нибудь графическую библиотеку, например OpenGL или DirectX. Что думаете? Может кто-нибудь уже делал так, поделитесь опытом.
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 12-03-2007 15:04 » 

Не в delay ли причина? Зачем ты ее используешь?
Записан

ещё один вопрос ...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 12-03-2007 15:14 » 

no4nik, Тебе надо понять в конечном итоге, что же ты делаешь. Например, ты знаешь что такое Device Context? Видео память? Видео страница?
Твоё определение "быстро рисовать" - неуместно. Именно рисование окружности или любой другой фигуры никак с "морганием" не связано. Ты должен понимать, что ты не можешь в определённый момент времени нарисовать ТОЛЬКО круг или ТОЛЬКО линию. Тк мы имеем дело с растровым принципом построения изображения на экране монитора, то в этот момент происходит перерисовка некой прямоугольной области, в самом общем случае - всего экрана. Именно это и приводит к морганию.
Как это избежать? - Зависит в первую очередь от возможности системы, под которой ты программируешь. Например, можно обновлять не весь экран, а только необходимый прямоугольник.
Наилучший способ - синхронизация рисования с аппаратным выводом графической инфы на экран.
Таким образом обновлении видеостраницы будет происходить уже с новой инфой. Ведь смену кадров ты тоже не видишь. Ага
Под виндой такие операции лучше всего делать по приходу сообщения WM_PAINT. в этому случае, если тебе требуется отрисовать несколько фигур, текст, картиники и тд, используется графический буфер - то про что RXL сказал - это некий специальный объект, который обладает свойствами объекта с помощью которого ты рисуешь, с той лишь разницей, что он не выводит инфу на экран, а как бы накапливает её. Когда вся отрисовка закончена, содержимое этого буфера можно очень быстро скопировать в основной объект. Те перерисовка в основном объекте (читай - мониторе) произойдёт только один раз. Реализовать это позволяют специальные объекты и функции. Какие именно - зависит от системы.

А теперь подумай, не слишком ли это специальные знания в рамках твоего задания?
« Последнее редактирование: 12-03-2007 15:32 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 12-03-2007 16:22 » 

Скомпилить кусок кода не получилось у меня, ругается на модуль c0.ASM. Разбираться не стал пока. Я думал тут где-то неувязка во взаимопонимании. Раз запустить не получилось хотелось спросить. no4nik, как я понимаю, ты хочешь увидеть плавное перемещение? А получается, что он у тебя перемещается, но при этом мерцает. Так? Если да, то все же первым делом я бы поигрался с delay().
Джон, он программит под ДОС, не забывай. Он не перерисовывает все окно. Он рисует новый круг и закрашивает цветом фона пиксели, где был старный. Это тебе не Invalidate() Улыбаюсь. ВСе же надо посмотреть внимательнее, как он рисует/затирает, и еще бы ЕХЕшник (нет ВС++3.1).
Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 12-03-2007 16:46 » 

no4nik, ни OpenGL, ни DirectX в DOS нет. Ты ведь пользуешься штатной библиотекой BC++ (graphics.h) - посмотри, нет ли в ней фукнций управления страницами.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 12-03-2007 16:49 » 

nikedeforest, да нуууу? Ага Что под ДОСом монитор автоматически становится векторным? Улыбаюсь)

Принцип тот же самый - обновление матрицы происходит при каждом "рисовании". Отсюда моргание. Даже зарисовка цветом фона - это тоже рисование.

Да кстати, задержка про которую ты спрашивал, нужна, чтобы видна была анимация - рисование происходит настолько быстро, что без неё ты будешь видеть только результат в конце цикла.

Под ДОС-ом точно так же можно писать в видео память и подготавливать видео страницы. Я просто уже не помню как это делается - я такое делал лет двадцать назад и на паскале.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 12-03-2007 18:16 » 

Я понимаю, что задержка для того, что слишком быстро. Ну одно дело задержать когда нрисован, к примеру, весь круг, а другое, ставить задержки во время рисования каждого пикеля. Ему же хочется, чтобы плавно круг полз, а не плавно он рисовался.
Я помню когла писал свои putpixel&Со, то вывод на экран выходил в банальную запись в память по нужному адресу. Я к тому, что не пойму, куда быстрее.
Записан

ещё один вопрос ...
no4nik
Гость
« Ответ #12 : 15-03-2007 18:32 » 

Во-первых спасибо всем за активное участие в теме.
Во-вторых в хелпе я нашел функции для работы со страницами:
setactivepage(int)
setvisualpage(int)
и попытался их использовать, вот что получилось
Код:
#include <dos.h>
#include <time.h>
#include <math.h>
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
class TPoint
{
  public:

   TPoint(int ax,int ay,int c,int dd):
    x(ax),y(ay),color(c),dl(dd)
    {
       init();
       GetKoords();
       dx = 20;
       dy = 20;

     };

   TPoint()
     {
       randomize();
       x=random(xmax);
       y=random(ymax);
       color=random(getmaxcolor());
       dl=5;
       init();
       GetKoords();
       dx = 20;
       dy = 20;
     };

   int GetColor() const
     {
       return color;
     };

   void SetColor(int c)
     {
       color=c;
     };

   void GetPos(int &xp,int &yp) const
     {
       xp=x;
       yp=y;
     };

   void SetPos(int xp,int yp)
     {
       x=xp;
       y=yp;
     };

   void Fly3();
   void Fly1();

   virtual void Show() const
     {
       putpixel(x,y,color);
     };

   virtual void Hide()
     {
       putpixel(x,y,bgcolor);
     };

   int xmax,ymax,bgcolor;

   struct koords
   {
     int x2,y2,rp,r,w,h,sh,i;
   }k;

 protected:

   void init();
   int x,y,color,dl;
   int dx,dy;
   void GetKoords();
   virtual void MoveTo(int nx,int ny);
   struct arccoordstype arcinfo;

 private:

};
/*------------------------------------------------------*/
void TPoint::init()
{
  int gdriver=VGA,gmode=VGAMED,errorcode;

  if (getgraphmode()!=2)
  {
 //   detectgraph(&gdriver,&gmode);
    initgraph(&gdriver,&gmode,"");   //EGAVGA.BGI must be in same directory
    errorcode=graphresult();
    if (errorcode!=grOk)
     {
       printf("Graph error:%s\n",grapherrormsg(errorcode));
       getch();
       exit(1);
     }
  }
  bgcolor=0;
  xmax=getmaxx();
  ymax=getmaxy();
  setcolor(bgcolor);
};

/*------------------------------------------------------*/

void TPoint::MoveTo(int nx,int ny)
{
  if (nx<0) {nx=0; dx=-dx;}
    else if (nx>xmax) {nx=xmax; dx=-dx;}
  if (ny<0) {ny=0; dy = -dy;}
    else if (ny>ymax) {ny=ymax; dy = -dy;}
  putpixel(x,y,0);    /*   off for proc1 */
  x=nx;y=ny;
  putpixel(x,y,color);
  delay(dl);
};
/*------------------------------------------------------*/
void TPoint::Fly1()
{
  int nx,ny;
     dx = dx + random(3)-1;
     dy = dy + random(3)-1;
     nx = x+dx;
     ny = y+dy;
     MoveTo(nx,ny);
}
/*-----------------------------------------*/
void TPoint::Fly3()
{
  int d;
  if (k.w)
    k.rp+=k.sh;
  else
    k.r+=k.sh;
  d=k.w*k.sh-(k.w-1);
  setcolor(0);
  arc(k.x2, k.y2, k.rp, k.rp+d, k.r);
  getarccoords(&arcinfo);
  MoveTo(arcinfo.xend,arcinfo.yend);
   if (++k.i > k.h) GetKoords();
};
/*------------------------------------------------------*/

void TPoint::GetKoords()
{
      k.r=random(130)+10;
      k.rp=random(340)+20;
      setcolor(0);
      arc(x,y,0,k.rp,k.r);
      setcolor(0);
      getarccoords(&arcinfo);
      k.x2=arcinfo.xend;
      k.y2=arcinfo.yend;
      k.rp-=180;
      if (x==k.x2)
if(y>k.y2) k.rp=-90;
else k.rp=90;
      if (y==k.y2)
if(x>k.x2) k.rp=0;
else k.rp=180;
      k.w=random(2);
      k.sh=pow(-1,random(2));
      if (k.w)
k.h=random(150)+20;
      else
if (k.sh<0)
  k.h=random(k.r);
else
  k.h=random(180)+20;
      k.i=0;
}
/*-----------------------------------------------*
*                                                 *
*                   Circle                        *
*                                                 *
 *------------------------------------------------*/

class TCircle : public TPoint
{
  public:

    TCircle(int ax,int ay,int c,int d,int r) :
      TPoint(ax,ay,c,d), rd(r){};
    TCircle();
    ~TCircle()
      {
    // free(pic);
Hide();
      };

    void MoveTo(int nx,int ny);
    void Show() const;
    void Hide();
 protected:
    void GetPic();
    int rd;
 private:

    void *pic;
    unsigned int size;
};
/*------------------------------------------------------*/
TCircle::TCircle()
{
 rd=random(50)+10;
 dl=0;
 x=random(xmax-2*rd)+rd;
 y=random(ymax-2*rd)+rd;
// GetPic();
};
/*------------------------------------------------------*/
void TCircle::GetPic()
{
  Show();
  size = imagesize(x-rd,y-rd,x+rd,y+rd);
  pic = malloc(size);
  getimage(x-rd,y-rd,x+rd,y+rd,pic);
  Hide();
};

/*------------------------------------------------------*/
void TCircle::Show() const
{
  setfillstyle(1,color);
  fillellipse(x,y,rd,rd);
};
/*------------------------------------------------------*/
void TCircle::Hide()
{
  setfillstyle(1,0);
  fillellipse(x,y,rd,rd);
};

/*------------------------------------------------------*/

void TCircle::MoveTo(int nx,int ny)
{
   if (nx<rd) {nx=rd; dx=-dx;}
    else if (nx>xmax-rd) {nx=xmax-rd; dx=-dx;}
  if (ny<rd) {ny=rd; dy = -dy;}
    else if (ny>ymax-rd) {ny=ymax-rd; dy = -dy;}

/*  if (nx<rd) nx=rd;
    else if (nx>xmax-rd) nx=xmax-rd;
  if (ny<rd) ny=rd;
    else if (ny>ymax-rd) ny=ymax-rd;*/
  setcolor(0);
  Hide();
  SetPos(nx,ny);
  Show();
  delay(dl);
}
/*------------------------------------------------------*/
class TSqare : public TPoint
{
  public:

    TSqare(int ax,int ay,int c,int ld,int dd) :
      TPoint(ax,ay,c,ld) ,d(dd){};
    TSqare();
    void MoveTo(int nx,int ny);
    void Show() const;
    void Hide();
 private:
    int d;

};
/*------------------------------------------------------*/
TSqare::TSqare()
{
 d=random(50)+10;
 dl=0;
 x=random(xmax-2*d)+d;
 y=random(ymax-2*d)+d;
// GetPic();
};
/*------------------------------------------------------*/
void TSqare::Show() const
{
  setcolor(color);
  rectangle(x-d,y-d,x+d,y+d);
  setfillstyle(1,color);
  floodfill(x,y,color);
};
/*------------------------------------------------------*/
void TSqare::Hide()
{
  setcolor(0);
  setfillstyle(1,bgcolor);
  floodfill(x,y,bgcolor);
};
/*------------------------------------------------------*/
void TSqare::MoveTo(int nx,int ny)
{
    if (nx<d) {nx=d; dx=-dx;}
    else if (nx>xmax-d) {nx=xmax-d; dx=-dx;}
  if (ny<d) {ny=d; dy = -dy;}
    else if (ny>ymax-d) {ny=ymax-d; dy = -dy;}


/*  if (nx<d) nx=d;
    else if (nx>xmax-d) nx=xmax-d;
  if (ny<d) ny=d;
    else if (ny>ymax-d) ny=ymax-d;*/
  setcolor(0);
  Hide();
  SetPos(nx,ny);
  Show();
  delay(dl);
}
/*------------------------------------------------------*/
class TRing : public TCircle
{
  public:

    TRing(int ax,int ay,int c,int d,int r,int rmin) :
      TCircle(ax,ay,c,d,r), rm(rmin) { };
    TRing();
    void MoveTo(int nx,int ny);
    void Show() const;
    void Hide();
 private:
    int rm;

};
/*------------------------------------------------------*/
TRing::TRing()
{
 rd=random(50)+10;
 rm=random(50)+10;
 dl=0;
 x=random(xmax-2*rd)+rd;
 y=random(ymax-2*rd)+rd;
// GetPic();
};
/*------------------------------------------------------*/
void TRing::Show() const
{
  setfillstyle(1,color);
  fillellipse(x,y,rd,rd);
  setfillstyle(1,0);
  fillellipse(x,y,rm,rm);

};
/*------------------------------------------------------*/
void TRing::Hide()
{
  setfillstyle(1,0);
  fillellipse(x,y,rd,rd);

};
/*------------------------------------------------------*/
void TRing::MoveTo(int nx,int ny)
{
  if (nx<rd) {nx=rd; dx=-dx;}
    else if (nx>xmax-rd) {nx=xmax-rd; dx=-dx;}
  if (ny<rd) {ny=rd; dy = -dy;}
    else if (ny>ymax-rd) {ny=ymax-rd; dy = -dy;}


 /* if (nx<rd) nx=rd;
    else if (nx>xmax-rd) nx=xmax-rd;
  if (ny<rd) ny=rd;
    else if (ny>ymax-rd) ny=ymax-rd;*/
  setcolor(0);
  Hide();
  SetPos(nx,ny);
  Show();
  delay(dl);
}
/*------------------------------------------------------*/

Код:
#include "grobj2.cpp"

void main()
{  //        x    y    c  dl rd   rm
   TPoint  t(20 , 24 , 1, 0);
   TCircle c(320, 240, 2, 0, 20);
   TCircle d(30 , 220, 4, 0, 20);
   TSqare  q(120, 140, 7, 0, 20);
   TRing   r(220, 20 , 5, 0, 20, 10);
//  directvideo=1;
  setcolor(0);
  int p=0;
  randomize();
  for(int i=0;i<2000;i++)
   {
   setactivepage(!p);
   setvisualpage(p);
   p = !p;

   c.Fly3();
 //  delay(5);
 //  d.Fly3();
 //  t.Fly3();
 //  q.Fly3();
 //  r.Fly3();
    }
  getch();
  closegraph();
}
Но драйвера и режимы которые поддерживают многостраничность (точнее всего 2 страницы) имеют разрешение
экрана 640*350, видимо поэтому фигуры изменились (круг стал похож на эллипс) и почему-то перестали правильно стираться.
В основном же анимация стала более плавной (перерисовки менее заметны), правда иногда по фигуре проскакивают широкие черные полосы (горизонтальные).
Я не уверен правильнл ли я испольэую переключнеие страниц, может надо как-то подругому?
(EXEшник во вложенми)

* PAINT.rar (34.85 Кб - загружено 1067 раз.)
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 15-03-2007 19:30 » 

Чтобы избавиться от такого эффекта нужно переключать страницы по сигналу начала кадра от видеокарты.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #14 : 27-05-2007 23:45 » new

Я конечно не в тему, но наследовать круг от точки (в той ситуации, что ты описал) - мягко скажем дурной тон...
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines