Пятница, 27 Декабря 2024, 02:45

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[ООП] Создание и логика врагов
SaiteiДата: Пятница, 10 Января 2014, 05:00 | Сообщение # 1
старожил
Сейчас нет на сайте
Вот я знаю как описать монстров, какую логику им приставить...... Но я не понимаю как одновременно создать 20 объектов и при этом чтобы все они "действовали", не тормозя программу. Вот есть у меня класс Game. В нем есть такая ф-ция, где, по сути, всё и происходит:
void Game::GameProcess()
{
while(!finished)
{
if(kbhit())
{
CheckKey();
}
RenderMap();
Sleep(33);
}
}
Объясните дурню как правильно подключить в игру ботов. Их поведение запрограммировано. Я просто ну совсем не понимаю как их "включить" в игровой процесс... Вот допустим в конструкторе идет рандомный выбор стартовых координат. Там же они появляются на карте. А ещё у каждого объекта будет ф-ция LOGIC(). Как, не завися от имен объектов, создать 20 экземпляров? При этом же каждый шажок цикла логика у каждого вновь вызываться должна...

...как-то я всё по-китайски написал, но иначе выразиться не могу.. Надеюсь на вашу помощь!
rozen777Дата: Пятница, 10 Января 2014, 05:44 | Сообщение # 2
был не раз
Сейчас нет на сайте
Достаточно наследоваться от одного абстрактного класса, где вызывать обработчик действий, вот небольшой пример.
-l33t-h4xx-Дата: Пятница, 10 Января 2014, 06:19 | Сообщение # 3
участник
Сейчас нет на сайте
Если тебя пугает необходимость обновлять состояние каждого из игровых объектов, то не пугайся: в подавляющем большинстве случаев процессорного времени с лихвой хватает, чтобы обновить хоть сотню объектов между двумя перерисовками экрана.
Чтобы не обращаться к каждому отдельному объекту по имени, проще всего, как показал rozen777, занести их в контейнер.


Как правильно задавать вопросы
SaiteiДата: Пятница, 10 Января 2014, 15:00 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата rozen777 ()
auto &i:entity_mgr

вот здесь подробней можно?

+можно ли обойтись как-нибудь без вектора?
Цитата rozen777 ()
A *a = new A();
B *b = new B();

rozen777, -l33t-h4xx-, а как создать сразу по 20 штук? Я в справочнике находил конструкцию Class A { }[...]; Интуитивно предполагаю что в [...] содержится количество возможных объектов... А вот как их создать? Вручную создавать не особо приятно.. Кроме того у меня есть объект "бонус", которых в конструкторе рандомно выбирает свое местоположение. Их должно быть 4 шт + при подборе бонуса создается новый экземпляр и удаляется старый

Добавлено (10.01.2014, 15:00)
---------------------------------------------

Цитата rozen777 ()
// Чистый виртуальный метод.
virtual void Update() = 0;

+ я немного не понимаю что такое виртуальный метод.. Извините за мою неопытность...
-l33t-h4xx-Дата: Пятница, 10 Января 2014, 17:00 | Сообщение # 5
участник
Сейчас нет на сайте
Цитата Saitei ()
Вручную создавать не особо приятно..

А как они должны создаться? По божественному наитию? То, что ты интуитивно предполагаешь, неверно: вместо квадратных скобок прописываются имена объектов, которые создаются сразу после объявления класса. Вручную, именно так, как тебе не хочется (почему-то).
Цитата Saitei ()
виртуальный метод..

Виртуальный метод - это метод, реализация которого возлагается на унаследованный класс. То есть пустышка, которую унаследованный класс обязан заполнить чем-то своим.


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Пятница, 10 Января 2014, 17:01
goldsphereДата: Пятница, 10 Января 2014, 19:40 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Saitei, я помню запускал один тест в которой было 30000 объектов, и все они двигались в сторону игрока, поворачивались на него и просчитывали столкновение с ним. Было жутко, но весело).Но несколько тысяч тянуло нормально. А 20 даже на самом слабом компе будет тянуть с лихвой. Поэтому просто делай вектор или массив своих объектов и в цикле вызывай у них функцию LOGIC. Создавать их тоже просто. В цикле
Код
Object yourobject[20];
for(int i=0;i<20;++i)
{
yourobject[i] = Object(..);
}
for(int i=0;i<20;++i)
{
yourobject[i].LOGIC();
}

или так
Код

vector<Object> yourobject;
for(int i=0;i<20;++i)
{
yourobject.push_back(Object(...));
}
for(int i=0;i<20;++i)
{
yourobject[i].LOGIC();
}


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Пятница, 10 Января 2014, 19:45
rozen777Дата: Суббота, 11 Января 2014, 09:42 | Сообщение # 7
был не раз
Сейчас нет на сайте
Saitei,
Цитата Saitei ()
auto &i:entity_mgr
вот здесь подробней можно?

Перебор контейнера из C++11, аналогичен foreach.

Цитата Saitei ()
можно ли обойтись как-нибудь без вектора?

Можно, если количество объектов известно на момент компиляции и неизменно или выделять память про запас, но это налагает некоторые ограничения. В случае если количество объектов будет изменятся в ходе выполнения, то самая простая и лучшая реализация будет с использованием контейнеров таких как std::vector<>.

Цитата Saitei ()
как создать сразу по 20 штук?

Очень просто, посмотри на примеры выше. Создание и удаление объектов реализуешь ты сам, но в ходе программы это можно автоматизировать в ответ на какое-то действие. Если все же что-то не понимаешь, советую почитать книги, только там можно найти ответы и понять самому как все работает, а потом уже практика.
SaiteiДата: Пятница, 17 Января 2014, 12:33 | Сообщение # 8
старожил
Сейчас нет на сайте
Код
Bonus u[bonus_col];   
for(int i = 0; i < bonus_col; i++)
{
  u[i] = Bonus();
  map[u[i].x][u[i].y].c = u[i].c;
  map[u[i].x][u[i].y].color = u[i].color;
}

что-то конструктор у всех не вызывается никак..

Добавлено (16.01.2014, 15:54)
---------------------------------------------

Код
#include "Bonus.h"
#include <time.h>
#include "vars.h"
#include <iostream>

Bonus::Bonus(void)
{
  srand(time(false));
  x = rand()%(cx-10);  
  y = rand()%(cy-10);  
  c = '@';
  color = 1;
}

Bonus::~Bonus(void)
{
}

void Bonus::Recoord(void)
{
  x = rand()%(cx-10);  
  y = rand()%(cy-10);  
}

Добавлено (17.01.2014, 12:33)
---------------------------------------------
Сам разобрался со всем уже) Спасибо всем)

  • Страница 1 из 1
  • 1
Поиск:

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