| 
				
				Как создать несколько экземпляров одного класса?
				 |   |  
| SanAV | Дата: Четверг, 18 Ноября 2010, 16:10 | Сообщение # 1 |  
 
Alex Versus 
Сейчас нет на сайте 
 
 | Здравствуйте. Меня уже давно волнует один вопрос, из-за которого мне трудно доступно дальше изучать этот язык. Данный вопрос Вы можете видеть в названии темы - как создать несколько экземпляров одного класса?   Попрошу объяснить на простейшем примере, в котором будет присутствовать примитивный класс экземпляров и функция создания экземпляров класса. Я очень прошу откликнуться на эту тему. Пример хотя бы простой, примитивный. Наподобие того же солдата и пули - где солдат передает новоиспеченному образцу пули свои координаты, т.е. откуда она стартует, а также ее будующее направление. Пуля же имеет свои собственные координаты, а переданные координаты от игрока - всего лишь координаты. где будет создаваться пуля.   Опережая Ваши вопросы и упреки - да, я искал информацию поэтому вопросу. Но я ничего подобного найти не смог - либо я не правильно составляю поисковой запрос, либо одно из двух.   Заранее благодарен. 
  My Games:   · [2D, TDS] Death Embrace.
 |  
| 
 | 
 |    |  
| ezhickovich | Дата: Четверг, 18 Ноября 2010, 16:37 | Сообщение # 2 |  
 
[Великий и могучий хозяинъ] 
Сейчас нет на сайте 
 
 | Quote (SanAV) класс экземпляров и функция     Quote (SanAV) солдата и пули - где солдат передает новоиспеченному образцу пули свои координаты, т.е. откуда она стартует, а также ее будующее направление. Пуля же имеет свои собственные координаты, а переданные координаты от игрока - всего лишь координаты. где будет создаваться пуля.     Code #include <cstdio>   // Класс пули   class Bullet   {   private:        int x, y;   public:       Bullet (int _x, int _y) : x(_x), y(_y)       {           // Выводим сообщение с координатами пули           printf ("Bullet: %d %d;\n", x, y);       }   };   int main ()   {        Bullet *b;        // В каждой итерации цикла создаётся новый екземпляр объекта Bullet,        // а потом удаляется.        for (int i = 0; i < 10; i++)        {            b = new Bullet (0, i); // Создаём новый экземпляр пули (в куче)            delete b; // Удаляем        }   }  
 
     Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
 
 Сообщение отредактировал ezhickovich - Четверг, 18 Ноября 2010, 16:42  |  
| 
 | 
 |    |  
| SanAV | Дата: Четверг, 18 Ноября 2010, 16:51 | Сообщение # 3 |  
 
Alex Versus 
Сейчас нет на сайте 
 
 | ezhickovich, благодарю.   Но возникла некоторая проблема. С ней я уже сталкивался, но решить так и не смог.  Класс пули:    Code class Bullet    {    private:     int x, y;    public:     Bullet (int _x, int _y):x(_x),y(_y)     {      DrawSprite(L"swattds.png",x-32,y-32,1,0);    }    };     Функция создания экземпляра пули:    Code if(MouseLBPress())   {    b=new Bullet(x,y);    }     Функция создания находится в функции Draw, класса Player.  Сама проблема заключается в том, что пуля существует только пока нажата LMB, а также ее координаты постоянно равны координатам игрока.   Прошу помощи исправить эту проблему - чтобы пуля исчезала только при выполнении некоторых условий (например при i>60), а также не зависела от координат игрока, т.е. координаты от игрока пули передавались только один раз - при ее создании. 
  My Games:   · [2D, TDS] Death Embrace.
 |  
| 
 | 
 |    |  
| MrSmith | Дата: Четверг, 18 Ноября 2010, 18:10 | Сообщение # 4 |  
 
EG Development 
Сейчас нет на сайте 
 
 | По идее у тебя должен быть главный цикл выполнения программы в котором ты вызываешь каждую итерацию апдейт методы всех классов.   Значит делаем в каждом классе метод Update()... Теперь про пули.   При создании пули тебе нужно передавать в конструктор не только начальные координаты, но и направление (в радианах).   Далее в апдейте тебе нужно передвинуть пулю на Н пикселей в направлении полета.   Все пули (и другие подобные объекты) можно и нужно хранить в связанном списке в котором будет метод апдейт, в котором будет вызываться апдейт всех пуль.   Думаю в методе Draw лучше только выводить графику и все, а все остальное в апдейте делать.   Также нужен метод удаления объекта в связанном списке.   Я честно говоря сам пуль еще не делал, но представляю как это должно быть.   Думаю разберешься. =)  П.С. что за движек? 
 
 Учу С++, рисую пиксельарты, использую D, Lua с LOVE   Skype: mrsmith333
 
 Сообщение отредактировал MrSmith - Четверг, 18 Ноября 2010, 18:16  |  
| 
 | 
 |    |  
| SanAV | Дата: Четверг, 18 Ноября 2010, 18:33 | Сообщение # 5 |  
 
Alex Versus 
Сейчас нет на сайте 
 
 | По порядку. MrSmith, я благодарен за ответ, но, прошу прощения, я слабо понял, зачем нужна функция Update. Я так понимаю, она самописная? Далее - можете рассказать более подробно о связном списке, думаю вся соль будет в нем. Про направление я знаю, но если постараться, можно даже и создать движение тоько зная координаты курсора и старта пули    Движочек я использую от nilrem, называется он WindMill 2D Game Engine. 
  My Games:   · [2D, TDS] Death Embrace.
 |  
| 
 | 
 |    |  
| ezhickovich | Дата: Четверг, 18 Ноября 2010, 19:14 | Сообщение # 6 |  
 
[Великий и могучий хозяинъ] 
Сейчас нет на сайте 
 
 | Quote (SanAV) зачем нужна функция Update     Она будет обновлять состояние всех пуль и т.д.   Quote (SanAV) Я так понимаю, она самописная?     А кто её напишет за тебя?   Quote (SanAV) Далее - можете рассказать более подробно о связном списке     Гугли...   Quote (SanAV) Про направление я знаю, но если постараться, можно даже и создать движение тоько зная координаты курсора и старта пули     Ты можешь выстрелить и сдвинуть мышку, но пуля всёравно должна лететь в заданную сторону... => не катит...
 
     Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
 |  
| 
 | 
 |    |  
| MrSmith | Дата: Четверг, 18 Ноября 2010, 19:23 | Сообщение # 7 |  
 
EG Development 
Сейчас нет на сайте 
 
 | В каждом объекте делаем функцию апдейт и там пишем код который будет выполнятся каждую итерацию цикла (игрового). Затем в главной функции апдейт вызываем все функции апдейт. Т.е. эта функция является аналогом события степ в ГМ.   Теперь про связанные списки.   Делаем шаблон самого списка и делаем шаблон елемента списка.   Внутри списка будет примерно так   {   int count;//кол-во елементов   CElement* First;   CElement* Last;   Update();   Render();   Create();   //Delete(int);  }   Только я не знаю как быть с функцией Delete. Думаю нужно определить в самом елементе функцию делит которая будет удалять себя и менять указатели соседних объектов.   А так будет выглядеть изнутри шаблон елемента   class Bullet   {   ...   Update();   Render(){draw_sprite...};   Delete(){};   CBullet* Previous;   CBullet* Next;   }   можно еще задать переменные типа "это последний елемент?" или первый. Ну и в функции делит елемента нужно предидущему объекту в указатель на следующий записать указатель на следующий текущего и наоборот и потом удалить объект delete *this;//вроде так   посмотри в гугле Связанный список примеров полно.   Только делай шаблонами   Кстати передавая направление пуле ты можешь передавать на один параметр меньше, поворачивать на него спрайт пули, и считать следующую координату пули. 
 
 Учу С++, рисую пиксельарты, использую D, Lua с LOVE   Skype: mrsmith333
 
 Сообщение отредактировал MrSmith - Четверг, 18 Ноября 2010, 19:26  |  
| 
 | 
 |    |  
| SanAV | Дата: Четверг, 18 Ноября 2010, 19:29 | Сообщение # 8 |  
 
Alex Versus 
Сейчас нет на сайте 
 
 | Quote (ezhickovich) А кто её напишет за тебя?     Просто подумал, что она стандартная >_>   Quote (ezhickovich) Ты можешь выстрелить и сдвинуть мышку, но пуля всёравно должна лететь в заданную сторону... => не катит...      Я уже говорил, что хочу сделать так, чтобы экземпляру пули передавались переменные только один раз, при ее создании. Правда пока не знаю как - поэтому я и создал данную тему.   MrSmith, благодарю, попробую сейчас разобраться, о результатах сообщу.
  My Games:   · [2D, TDS] Death Embrace.
 |  
| 
 | 
 |    |     
		
		 
 |