Как создать несколько экземпляров одного класса?
| |
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.
|
|
| |
|