Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 3
1

Создание и отрисовка объекта класса

09.05.2013, 20:27. Показов 3552. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Возникла проблема при объявлении класса в С++ Builder. Помогите, если можете.
Вкратце история такая:
Прочитал статьи на сайте C++ Builder :: Игрописательство :: Как написать игру за 21 день.
По примеру создаю карту 30*30 клеток - я создал текстовый файл и забил в него карту. Потом я из этого файла загружаю карту в массив и прорисовываю ее.
Теперь объявляю класс "героев" - например хочу, чтобы их было три.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class HERO
{
  private:
    int x,y;   //координаты
 
  public:
 
  HERO()                          //конструктор
  {
  srand(time(NULL));           
  x=int(random(900)%30)*30;   //установка случайных координат
  y=int(random(900)%30)*30;
 
 heroDrawing();
  }
 
  void heroMove(int Key)  // метод движения
 
  {
 
   switch (Key)
   {
   case VK_RIGHT: x+=30; break;
   case VK_UP:    y+=30; break;
   case VK_LEFT:  x-=30; break;
   case VK_DOWN:  y-=30; break;
    }
   heroDrawing();
   }
 
void heroDrawing(void)     // метод отрисовки
  {  
 
   Form1->Canvas->Brush->Color=clYellow;
   Form1->Canvas->Ellipse(x,y,x+30,y+30);
  }
 
};
Потом, когда я их объявляю в начале тела программы как глобальные переменные:
C++
1
HERO hero1, hero2, hero3; или HERO heroes[3];
вылетает ошибка - типа память еще не выделена и рисовать некуда - массив еще не заполнен и все такое.
Я понимаю, что вопрос, наверное дилетантский, но подскажите как быть, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2013, 20:27
Ответы с готовыми решениями:

Создание объекта класса в другом классе!!!
//----------------------------------Address.h----------------------------------------------------...

Создание объекта класса внутри DLL
Извините, если такая тема уже была - не нашел поиском. Проблема в следующем: нужно...

TIdNotify, создание и удаление объекта этого класса
Как правильно использовать компонент TIdNotify, а точнее как правильно создавать/удалять объект...

Отрисовка объекта из класса
В C# задан класс Tool, унаследованный от Control В нем есть функция public void DrawRectangle()...

5
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.05.2013, 03:02 2
Убери heroDrawing(); из конструктора...

И вообще что за ? ... клепать глобальные переменные, а потом удивляться чЁ оно не пашет ?
0
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 3
10.05.2013, 10:57  [ТС] 3
Ну так,а где их объявить? если я их объявляю после прорисовки карты, то в других блоках программы не видно методов класса, если мне, например, необходимо вызвать метод move в обработчике OnKeyDown он не видит этого метода.
0
LK
Заблокирован
10.05.2013, 13:17 4
nokfyt,
Цитата Сообщение от nokfyt Посмотреть сообщение
вызвать метод move в обработчике OnKeyDown
или
Цитата Сообщение от nokfyt Посмотреть сообщение
в обработчике OnKeyDown он не видит этого метода
?
классика - отсуствие знака пунктуации не позволяет понять мысль...
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.05.2013, 20:35 5
Цитата Сообщение от LK Посмотреть сообщение
классика
Вообще - да, но тут пунктуационные перестановки смысла выражения не меняют...
nokfyt, начни с другой книжки, что-нибудь по С++ или билдеру, проблема твоя в незнании языка. Коротко по теме: объекты класса HERO создавай как данные другого класса - например, класса формы или что-то из иерархии твоих игрушечных классов, а в конструкторе что-то рисовать вообще смысла нет, рисуй в обработчиках событий. Кстати, если "необходимо вызвать метод move в обработчике", а некий "он" метода не видит, значит ты не понимаешь, что делаешь - отсюда и результат.
1
0 / 0 / 0
Регистрация: 09.05.2013
Сообщений: 3
14.05.2013, 10:18  [ТС] 6
Спасибо за ответы!!
Помогите еще, пожалуйста.
Вопросов несколько:
1. Я объявляю три класса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class PIG
{               
  private:
    int x,y;   //координаты
 
  public:
      PIG()                          //конструктор
       {
         srand(time(NULL));           // сброс точки отсчета
         x=int(rand()%30)*30;      //установка случайных координат
         y=int(rand()%30)*30;
        }
 
   bool selected;
 
  void pigMove(char(*array)[30], int Key);  // метод движения
  void pigDrawing(void);     // метод отрисовки
  int  ret_x();
  int ret_y();
}; //конец класса PIG

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class WOLF
{
 private:
    int x,y;   //координаты
 
  public:
 
      WOLF()                          //конструктор
       {
         srand(time(NULL));           // сброс точки отсчета
         x=int(rand()%10)*30;   //установка случайных координат
         y=int(rand()%10)*30;
        }
 
    bool selected;
 
  void wolfMove(char(*array)[30], int Key);  // метод движения
  void wolfDrawing(void);     // метод отрисовки
 
  int  ret_x();
  int ret_y();
 
};//конец класса WOLF
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class BUILDING
{
 private:
  int x,y; //координаты
 
 public:
    BUILDING()                          //конструктор
       {
         //srand(time(NULL));           // сброс точки отсчета
         x=int(rand()%20)*30;        //установка случайных координат
         y=int(rand()%20)*30;
        }
     void buildingDrawing(void);
 
 }; //конец класса BUILDING
Объявил три PIG, WOLF и четыре BUILDINGS вот здесь в разделе public:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormPaint(TObject *Sender);
        void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift);
        void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
private:    // User declarations
public:     PIG pig[2]; // User declarations
                BUILDING House[3];
                WOLF Wolf;
        __fastcall TForm1(TComponent* Owner);
};
В обработчике события FormPaint для отрисовки карты у меня такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
for(int i=0;i<30;i++)
  {
    for(int j=0;j<30;j++)
     {
      switch(map[i][j])
      {
        case 0 : Form1->Canvas->Brush->Color=clGreen; break;
        case 1 : Form1->Canvas->Brush->Color=clBlue; break;
      }  //конец оператара switch
      Form1->Canvas->Rectangle(i*30,j*30,i*30+30,j*30+30);  // 30 = размер клетки в пикселях
     }//конец первого for
   } //конец второго fo
Теперь для прорисовки объектов класса PIG в этом же обработчике пишу:

C++
1
2
for(int i=0;i<3;i++)
  pig[i].pigDrawing();
Вроде все прорисовывает нормально, но как только тут же добавляю прорисовку объекта объекта WOLF:

C++
1
Wolf.wolfDrawing();
и прорисовку объектов BUILDINGS:

C++
1
2
for(int i=0;i<5;i++)
 House[i].buildingDrawing();
Начинаются проблемы:
1. Либо все объекты прорисовываются в одном месте: все PIG в одном месте, все BUILDINGS в одном месте и WOLF вместе с ними, либо, вообще, все в одном месте.
2. Объекты начинают двигаться вместе: например волк привязывается к одному зданию и они двигаются как один объект.
3. Объекты начинают двигаться хаотично: например начинаю двигаться свинкой - здание сдвигается, причем сдвигается не по клеточкам, а может на середину клеточки. Я приложил два рисунка, там на втором видно как одно здание сдвинулось, а на первом - как волк привязался к зданию.
4. Прорисовываются не все объекты: например в цикле прорисовываю три объекта, а реально рисуется один.

Предполагаю, что где-то постоянно срабатывает random, либо я пишу прорисовку не в том обработчике.
Вот коды методов классов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
      /*Методы класса PIG*/
 
void PIG:: pigMove(char(*array)[30], int Key)  // метод движения
  {
 
  switch(Key)
  {
   case 37 : if(array[x/30-1][y/30]!=1) { x-=30; } break;
   case 38 : if(array[x/30][y/30-1]!=1) { y-=30; } break;
   case 39 : if(array[x/30+1][y/30]!=1) { x+=30; } break;
   case 40 : if(array[x/30][y/30+1]!=1) { y+=30; } break;
  }
}
 
   void PIG:: pigDrawing(void)     // метод отрисовки
  {
   Form1->Canvas->Brush->Color=clYellow;
   Form1->Canvas->Ellipse(x,y,x+30,y+30);
   }
 
 
 
int PIG:: ret_x(){return x;}
 
int PIG:: ret_y(){return y;}
 
 
                           /*Методы класса WOLF*/
 
void WOLF:: wolfDrawing(void)     // метод отрисовки
  {
   Form1->Canvas->Brush->Color=clRed;
   Form1->Canvas->Ellipse(x,y,x+30,y+30);
   }
 
 
int WOLF:: ret_x(){return x;}
 
int WOLF:: ret_y(){return y;}
 
void WOLF:: wolfMove(char(*array)[30],int Key)  // метод движения
  {
 
  switch(Key)
  {
   case 37 : if(array[x/30-1][y/30]!=1) { x-=30; } break;
   case 38 : if(array[x/30][y/30-1]!=1) { y-=30; } break;
   case 39 : if(array[x/30+1][y/30]!=1) { x+=30; } break;
   case 40 : if(array[x/30][y/30+1]!=1) { y+=30; } break;
  }
}
 
                          /*Методы класса BUILDING*/   
 
void BUILDING:: buildingDrawing(void)
{
   Form1->Canvas->Brush->Color=clLime;
   Form1->Canvas->Rectangle(x,y,x+60,y+60);
 
}
Вот код для загрузки карты из файла:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::FormCreate(TObject *Sender)
{
FILE*f;
f=fopen((ExtractFilePath(Application->ExeName) + "map.txt").c_str(),"r");
  if(f) //если открытие файла призошло без ошибок, то...
         {
          for(int i=0;i<30;i++)
             {
               for(int j=0;j<31;j++) // один символ конца строки
                 {
                   char t=fgetc(f);   //получаем символ из файла
 
                     switch(t)          //проверка символа и запись его в массив
                       {
                         case '0' : map[i][j]=0; break;
                         case '1' : map[i][j]=1; break;
                        }// конец оператара switch
                    } //конец первого for
               } //конец второго for
          }// конец оператара if
    fclose(f);
  } // конец FormCreate
Вот как я описываю прорисовку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  for(int i=0;i<30;i++)
  {
    for(int j=0;j<30;j++)
     {
      switch(map[i][j])
      {
        case 0 : Form1->Canvas->Brush->Color=clGreen; break;
        case 1 : Form1->Canvas->Brush->Color=clBlue; break;
      }  //конец оператара switch
      Form1->Canvas->Rectangle(i*30,j*30,i*30+30,j*30+30);  // 30 = размер клетки в пикселях
     }//конец первого for
   } //конец второго for
 
 
 for(int i=0;i<3;i++)
  pig[i].pigDrawing();
 
  for(int i=0;i<5;i++)
 House[i].buildingDrawing();
 
  Wolf.wolfDrawing();
 
 
} //конец FormPaint
Вот так я выбираю мышкой объект для движения:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
   int xx,yy;
 
  if(Button==mbLeft)
    {
 
     xx=int(X/30)*30;
     yy=int(Y/30)*30;
 
     if (xx==pig[0].ret_x() && yy==pig[0].ret_y())
        pig[0].selected=true;
      else
       pig[0].selected=false;
 
     if (xx==pig[1].ret_x() && yy==pig[1].ret_y())
        pig[1].selected=true;
      else
       pig[1].selected=false;
 
       if (xx==pig[2].ret_x() && yy==pig[2].ret_y())
        pig[2].selected=true;
      else
       pig[2].selected=false;
 
       if (xx==pig[3].ret_x() && yy==pig[3].ret_y())
        pig[3].selected=true;
      else
       pig[3].selected=false;
 
    if (xx==Wolf.ret_x() && yy==Wolf.ret_y())
        Wolf.selected=true;
      else
       Wolf.selected=false;
 
   }// конец самого первого оператора if
И вот так двигаюсь:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
     if(pig[0].selected==true)
        pig[0].pigMove(map,Key);
 
     if(pig[1].selected==true)
        pig[1].pigMove(map,Key);
 
     if(pig[2].selected==true)
        pig[2].pigMove(map,Key);
 
     if(pig[3].selected==true)
        pig[3].pigMove(map,Key);
 
 
     if(Wolf.selected==true)
        Wolf.wolfMove(map,Key);
 
    FormPaint(Sender);
}
Подскажите, что я делаю не так. Спасибо за ответы!
Миниатюры
Создание и отрисовка объекта класса   Создание и отрисовка объекта класса  
0
14.05.2013, 10:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2013, 10:18
Помогаю со студенческими работами здесь

Отрисовка объекта в функции класса
допустим создали класс объекта со всеми параметрами, можно ли организовать процедуру его отрисовки...

Возможно ли создание объекта шаблонного класса в функции этого класса?
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон...

Создание объекта класса с полем являющимся объектом другого класса
Bill a; cin&gt;&gt;a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у...

Создание объекта класса, который будет содержать указанное количество объектов другого класса
Здравствуйте. Я сейчас только учусь, помогите, пожалуйста. Задача такая: необходимо создать класс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru