Четверг, 28 Марта 2024, 22:54

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » опять ООП
опять ООП
Raf_TankДата: Суббота, 04 Февраля 2017, 16:21 | Сообщение # 1
был не раз
Сейчас нет на сайте
А вот и я. Новый день - новая проблема. Думал что уже почти доделал свой проект, но не тут то было. В общем есть класс врага, на основе которого создаются, собственно, сами враги. И логика их движения такова, что каждые 2 секунды меняется их направление, от 1 до 4 включительно. А проблема такая: есть несколько объектов e1 e2 e3 класса Enemy , и когда проходит 2 секунды (p.s. время отсчитываю через sfml таймер) то переменной, которая отвечает за направление задаётся значение которое одинаково для всех объектов данного класса, из-за чего мои мобы ходят так синхронно, как-будто занимались строевой подготовкой 20+ лет. Как сделать чтобы для каждого объекта класса рандомилось своё значение, а не общее для всех. Обрезанный кусочек кода:
Код

class Enemy{
private:
    
    
public:
    bool cdir = 0;
    Clock dir_clock;
    float change_time;
    int dir;
    int *ptrdir = &dir;
Enemy(...... int dir){....}
void move(float game_time){
  change_time = dir_clock.getElapsedTime().asMilliseconds();
  if (change_time >= 2000) cdir = 1;
  srand(time(NULL));
  while (cdir == 1){
   dir = 1 + rand() % 4;
   dir_clock.restart();
   cdir = 0;
  }
  
  if (dir == 1){}
  if (dir == 2){}
  if (dir == 3){}
  if (dir == 4){}
  
    }
int main() {
Enemy e1(....,   2); // как видно я им даже изначально задаю разные направления, с которыми они появятся
Enemy e2(......, 1);
Enemy e3(......, 4);
e1.move(game_time);
e2.move(game_time);
e3.move(game_time);

return 0;
}


Как-то так, надеюсь всё понятно
p.s. все нужные библиотеки подключены
Код
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <ctime>


Сообщение отредактировал Raf_Tank - Суббота, 04 Февраля 2017, 16:22
GudleifrДата: Суббота, 04 Февраля 2017, 16:36 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
C++ тут не при чем. Попробуйте перечислить то, что делает move, обычными человеческими словами.

Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Raf_TankДата: Суббота, 04 Февраля 2017, 16:39 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата Gudleifr ()
Попробуйте перечислить то, что делает move, обычными человеческими словами.

Что-то я вообще ни одного слова не понял...
GudleifrДата: Суббота, 04 Февраля 2017, 16:43 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата Raf_Tank ()
Что-то я вообще ни одного слова не понял...
В этом и проблема. Давайте по порядку:
1. move получает на вход ...
2. Считает ...., обращаясь к методу ..., который делает ...
3. Если ...
и. т.д.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Raf_TankДата: Суббота, 04 Февраля 2017, 17:02 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата Gudleifr ()
В этом и проблема. Давайте по порядку:
1. move получает на вход ...
2. Считает ...., обращаясь к методу ..., который делает ...
3. Если ...
и. т.д.

АА, понял, вот:
move на вход получает время, которое постоянно сбрасывается
дальше инициализирую переменную, которая будет хранить в себе время таймера dir_clock в миллисекундах, т.е. если прошло 2 секунды то change_time eltn hfdyj 2000 миллисекунд.
Дальше проверяется прошли ли эти самые 2 секунды , и если да то переменная cdir (change dir скор.) становится true.
Далее идёт генерация случ. числа, я не понимаю как он работает, просто скопипастил его, и после того как мы перерандомим dir мы перезапускаем таймер, т.е. те самые 2 секунды сбрасываются и переменная cdir снова становится false чтобы дальше не поменять dir раньше времени.
P.S. почему-то этот генератор у меня работает только в цикле while при условии не катит, а выбрал его потому, что в интернете читал что обычная команда rand зависит от чего-то на компьютере, поэтому она будет одну и ту же цифру выдавать, а этот генератор зависит от этого неизвестного time(NULL) и поэтому каждый раз разные значения.
GudleifrДата: Суббота, 04 Февраля 2017, 17:25 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата Raf_Tank ()
move на вход получает время, которое постоянно сбрасывается
Зачем, если в функции оно не используется?
Цитата Raf_Tank ()
инициализирую переменную, которая будет хранить
Это хорошо, а кто будет инициализировать другие переменные?
Цитата Raf_Tank ()
Далее идёт генерация случ. числа, я не понимаю как он работает
Попробуйте разобраться, иначе результат так и будет обратный требуемому. (Подсказка: srand обычно бывает один на программу).
Цитата Raf_Tank ()
почему-то этот генератор у меня работает только в цикле while
Придется Вам разобраться, впрочем, когда уберете srand, станет полегче.
Цитата Raf_Tank ()
от этого неизвестного time
А не настораживает, что в этой ф-ии целых три независимых переменных для "текущего времени"?


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Суббота, 04 Февраля 2017, 17:28
Форум игроделов » Программирование » C/C++ » опять ООП
  • Страница 1 из 1
  • 1
Поиск:

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