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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2009, 11:32   #1
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
Восклицание С++. движение! как его сделать?

Хоть кто-нибудь хоть что-нибудь подскажите, что эти объекты= фигуры были компактыми наборами и двигались произвольно, меняя цвет и размеры квадратов!!!

Код:
#include<conio.h>
#include<iostream.h>
#include<dos.h>
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
 
  class FiGura
{
protected:
  int x,y,w,h,color;
public:
  FiGura();
 ~FiGura();
  void SetCoord(int x,int y){this->x=x; this->y=y;};
  void SetRazmer(int x,int y){this->w=x; this->h=y;};
  void SetCvet(int color){this->color=color;};
  virtual void ViVod()=0;
};
 
  FiGura::FiGura()
{
  cout<<"figyra sozdana"<<endl;
}
 
  FiGura::~FiGura()
{
  closegraph();
  cout<<"figyra udalena"<<endl;
}
 
  void inic()
{
  int grdriver,gmode,errorcode;
  detectgraph(&grdriver,&gmode);
  initgraph(&grdriver,&gmode,"D:\\BC\\BGI ");
  errorcode=graphresult();
  if (errorcode!=grOk)
    {cout<<"osibka"<<endl;
    exit(1);}
};
 
  class KvaDrat:public FiGura
{
public:
  virtual void ViVod() 
{setcolor(color);
  rectangle(x,y,x+w,y+w);}
};
 
  class TreuGol:public FiGura
{
public:
  virtual void ViVod() 
{setcolor(color);
  line(x,y+w,(x+w/2),y);
  line((x+w/2),y,x+w,y+w);
  line(x+w,y+w,x,y+w);}
};
 
void main()
{int i,j,k;
FiGura*f[10];
TreuGol tr[5];  KvaDrat kv[5];
inic();
// что здесь необходимо написать?
}
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 16.06.2009, 11:48   #2
Alco
Новичок
Джуниор
 
Регистрация: 16.06.2009
Сообщений: 14
По умолчанию

Как минимум нужно написать нормальные функции рисования и стирания фигур (стирание - рисование цветом фона). И по таймеру менять значения x,y,w,h,color, только не резко, а в пределах приращения-вычитания 3-4 точек.
Alco вне форума Ответить с цитированием
Старый 16.06.2009, 12:07   #3
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
По умолчанию

Код:
#include<conio.h>
#include<iostream.h>
#include<dos.h>
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>

  class FiGura
{
protected:
  int x,y,w,h,color;
public:
  FiGura();
 ~FiGura();
  void SetCoord(int x,int y){this->x=x; this->y=y;};
  void SetRazmer(int x,int y){this->w=x; this->h=y;};
  void SetCvet(int color){this->color=color;};
  virtual void ViVod()=0;
};

  FiGura::FiGura()
{
  cout<<"figyra sozdana"<<endl;
}

  FiGura::~FiGura()
{
  closegraph();
  cout<<"figyra udalena"<<endl;
}

  void inic()
{
  int grdriver,gmode,errorcode;
  detectgraph(&grdriver,&gmode);
  initgraph(&grdriver,&gmode,"D:\\BC\\BGI ");
  errorcode=graphresult();
  if (errorcode!=grOk)
    {cout<<"osibka"<<endl;
    exit(1);}
};

  class KvaDrat:public FiGura
{
public:
  virtual void ViVod()
{setcolor(color);
setfillstyle(1,color);
  rectangle(x,y,x+w,y+w);
floodfill(x+3,y+1,color);
floodfill(x+3,y+5,color);
}
};

  class TreuGol:public FiGura
{
public:
  virtual void ViVod()
{setcolor(color);
setfillstyle(1,color);
  line(x,y+w,(x+w/2),y);
  line((x+w/2),y,x+w,y+w);
  line(x+w,y+w,x,y+w);

floodfill(x+w/2,y+1,color);   //Postavit' y2+2 ,esli zalivat' treugolniki.
floodfill(x+2,y+w-1,color);
floodfill(x+w-2,y+w-1,color);

}
};

void main()
{int i,j,k;
FiGura*f[10];
TreuGol tr[5];  KvaDrat kv[5];
inic();

for (i=0;i<5;i++){
tr[i].SetCoord(random(300),random(300));
tr[i].SetRazmer(random(100),random(100));
tr[i].SetCvet(random(15)+1);
tr[i].ViVod();
f[i]=&tr[i];
}
for (i=0;i<5;i++){
kv[i].SetCoord(random(300),random(300));
kv[i].SetRazmer(random(100),random(100));
kv[i].SetCvet(random(15)+1);
kv[i].ViVod();
f[i+5]=&kv[i];
}
while(!kbhit())
{
for (i=0;i<3;i++){
 for (j=0;j<10;j++){
   f[j]->SetCvet(random(15)+1);
   f[j]->ViVod();
  }
sleep(1);
 }
 for (k=0;k<10;k++){
 f[k]->SetCvet(BLACK);
 f[k]->ViVod();
 f[k]->SetCoord(random(500),random(500));
 }
 }
getch();
}
фигуры закрашены, но размещены не компактно (- как их так разместить?) и меняют размеры и треугольники и квадраты (-как сделать, что меняли размеры только квадраты, но треугольники были маленькие и находились рядом с квадратами?) -- как это все поменять в программе??
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 16.06.2009, 12:23   #4
Alco
Новичок
Джуниор
 
Регистрация: 16.06.2009
Сообщений: 14
По умолчанию

По твоему коду, фигуры вообще размер не меняют, специально скомпилил и проверил. Просто некоторые улетают за экран.

Цитата:
фигуры закрашены, но размещены не компактно (- как их так разместить?)
Как вариант, выводить треугольники не рандомно, а в зависимости от координат квадрата и его ширины-длины, чтобы не пересекались.
Alco вне форума Ответить с цитированием
Старый 16.06.2009, 12:28   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но размещены не компактно
Всмысле?
Может тебе просто их вдоль одной координаты разместить накштал
Код:
for (i=0;i<5;i++){
tr[i].SetCoord(i*150,random(300));
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2009, 12:28   #6
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
По умолчанию

треугольник не меняет, он просто получается большим, аж на экране не помещается, но как его размер поменять, чтоб они маленькими были??
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 16.06.2009, 12:30   #7
Alco
Новичок
Джуниор
 
Регистрация: 16.06.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от HoOpe Посмотреть сообщение
треугольник не меняет, он просто получается большим, аж на экране не помещается, но как его размер поменять, чтоб они маленькими были??
У тебя же функция есть, SetRazmer зовется.
Alco вне форума Ответить с цитированием
Старый 16.06.2009, 12:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дык tr[i].SetRazmer(random(10),random(10));
Как же еще?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2009, 17:26   #9
HoOpe
Пользователь
 
Аватар для HoOpe
 
Регистрация: 09.03.2009
Сообщений: 52
По умолчанию

я убрала несколько циклов и сделала, чтоб треугольники не меняли размер:
Код:
#include<conio.h>
#include<iostream.h>
#include<dos.h>
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>

  class FiGura
{
protected:
  int x,y,w,h,color;
public:
  FiGura();
 ~FiGura();
  void SetCoord(int x,int y){this->x=x; this->y=y;};
  void SetRazmer(int x,int y){this->w=x; this->h=y;};
  void SetCvet(int color){this->color=color;};
  virtual void ViVod()=0;
};

  FiGura::FiGura()
{
  cout<<"figyra sozdana"<<endl;
}

  FiGura::~FiGura()
{
  closegraph();
  cout<<"figyra udalena"<<endl;
}

  void inic()
{
  int grdriver,gmode,errorcode;
  detectgraph(&grdriver,&gmode);
  initgraph(&grdriver,&gmode,"D:\\BC\\BGI ");
  errorcode=graphresult();
  if (errorcode!=grOk)
    {cout<<"osibka"<<endl;
    exit(1);}
};

  class KvaDrat:public FiGura
{
public:
  virtual void ViVod()
{setcolor(color);
  rectangle(x,y,x+w,y+w);}
};

  class TreuGol:public FiGura
{
public:
  virtual void ViVod()
{setcolor(color);
  line(x,y+w,(x+w/2),y);
  line((x+w/2),y,x+w,y+w);
  line(x+w,y+w,x,y+w);}
};

void main()
{int i,j,k;
FiGura*f[10];
TreuGol tr[5];
KvaDrat kv[5];
inic();


for (i=0;i<5;i++){
tr[i].SetCoord(random(100),random(100));
tr[i].SetRazmer(50,50);
tr[i].SetCvet(random(15)+1);
tr[i].ViVod();
f[i]=&tr[i];
kv[i].SetCoord(random(300),random(300));
kv[i].SetRazmer(random(100),random(100));
kv[i].SetCvet(random(15)+1);
kv[i].ViVod();
f[i+5]=&kv[i];
}
while(!kbhit())
{

 for (j=0;j<10;j++){
   f[j]->SetCvet(random(15)+1);
   f[j]->ViVod();
  }
sleep(1);

 for (k=0;k<10;k++){
 f[k]->SetCvet(BLACK);
 f[k]->ViVod();
 f[k]->SetCoord(random(500),random(500));
 }
 }
 getch();
}
но как выводить
Цитата:
треугольники не рандомно, а в зависимости от координат квадрата и его ширины-длины
так и не придумала(( напишите, плиз, как...
да еще! как сделать, чтоб фигуры двигались, а не мигали? т.е. попиклельно рисовать, потом стирать и заново рисовать, чтоб можно было видеть движение
когда всё становится на свои места, выясняется, что это кладбище...
HoOpe вне форума Ответить с цитированием
Старый 16.06.2009, 19:18   #10
Alco
Новичок
Джуниор
 
Регистрация: 16.06.2009
Сообщений: 14
По умолчанию

Цитата:
так и не придумала(( напишите, плиз, как...
Для каждого квадрата есть координаты его вершин. Задавай координаты для треугольников слева или справа от квадрата, добавляя/вычитая из вершин квадрата некоторое число. При этом проверку делай, чтобы ни одна из вершин треугольника внутри квадрата не лежала. Я бы примерно так сделал.
Цитата:
да еще! как сделать, чтоб фигуры двигались, а не мигали? т.е. попиклельно рисовать, потом стирать и заново рисовать, чтоб можно было видеть движение
1. Рисуешь фигуру.
2. Задержка пара сотен миллисекунд.
3. Стираешь ее.
4. Смещаешь немного в случайную сторону. (для квадрата достаточно координаты левой верхней вершины, для треугольника тоже как-нибудь)
5. Рисуешь заново.
6. К пункту 1.
Alco вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
неубиваемый вирус! все антивирусы не находят его! кто знает как его убрать? Yury111 Безопасность, Шифрование 12 05.06.2009 11:19
как сделать на своем сайте возможность устанавливать его, как стартовую страницу при загрузке броузера Chaynik Помощь студентам 2 02.03.2009 23:10
Как сделать макрос в WORD и описать его алгоритм ещё prikolist Microsoft Office Word 2 21.11.2008 13:19
Как сделать так,чтобы при выборе варианта,его текст оказывался в компоненте Edit1.tex InseR Компоненты Delphi 8 03.07.2007 11:52
Как при скрытом чужом окне сделать его дочерние окна(сообщения) видимыми ? Starwarrior Win Api 1 20.03.2007 09:51