опять ООП
| |
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 |
|
| |
|