Суббота, 23 Ноября 2024, 02:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как создать несколько экземпляров одного класса?
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. Я так понимаю, она самописная? Далее - можете рассказать более подробно о связном списке, думаю вся соль будет в нем. Про направление я знаю, но если постараться, можно даже и создать движение тоько зная координаты курсора и старта пули biggrin

Движочек я использую от 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.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг