SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Рандомное изменение направления движения врага
В этой теме 4 ответа, 3 участника, последнее обновление FerrariHD 8 года/лет, 4 мес. назад.
-
АвторСообщения
-
Кто-нибудь писал рандомное изменение направления движения врага? Пытался сделать по таймеру перед/после/в методе update(), но боты тогда начинают телепортироваться через стены и в конце концов крашит. Случаются моменты, когда враг начинает загадочным образом двигаться по диагонали
Код типа:C++12345678910111213141516moveTimer += time;if(moveTimer > 7500){moveTimer = 0;dx = 0;dy = 0;randAxis = rand() % 4;if(randAxis == 0)dx = 0.01;if(randAxis == 1)dx = -0.01;if(randAxis == 2)dy = 0.01;if(randAxis == 3)dy = -0.01;}И в случае столкновения со стенкой тоже сбрасывал таймер.
И в случае столкновения со стенкой тоже сбрасывал таймер.
Просто сбрасываешь таймер не изменяя направление?
Скорее всего в этот момент происходит зацикливание.Лишнее.
C++12dx = 0;dy = 0;этот кусок попробуй чуть допилить вот так
C++12345678if(randAxis == 0)dx = 0.01; dy=0;if(randAxis == 1)dx = -0.01; dy=0;if(randAxis == 2)dy = 0.01; dx=0;if(randAxis == 3)dy = -0.01; dx=0;Тогда по диагонали не должно быть
Ничего не помогает…
Вот код:C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677void update(float time){moveTimer += time;rect.left += dx*time*speed;Collision(0);Physics();rect.top += dy*time*speed;Collision(1);Physics();sprite.setPosition(rect.left, rect.top);if (moveTimer > 15000){moveTimer = 0;randAxis = rand() % 4;if (randAxis == 0){dx = 0.01; dy = 0;}if (randAxis == 1){dx = -0.01; dy = 0;}if (randAxis == 2){dy = 0.01; dx = 0;}if (randAxis == 3){dy = -0.01; dx = 0;}}}void Collision(int axis){for (int i = rect.top / 30; i < (rect.top + rect.height) / 30; i++)for (int j = rect.left / 30; j < (rect.left + rect.width) / 30; j++){if ((TileMap[i][j] == 'B') || (TileMap[i][j] == '0')){if (axis == 0){if (dx > 0) rect.left = j * 30 - rect.width;if (dx < 0) rect.left = j * 30 + 30;dx = 0;int randomAxis;randomAxis = rand() % 4;if (randomAxis == 0)dy = 0.01;else if (randomAxis == 1)dy = -0.01;else if (randomAxis == 2)dx = 0.01;elsedx = -0.01;}if (axis == 1){if (dy > 0) rect.top = i * 30 - rect.height;if (dy < 0) rect.top = i * 30 + 30;dy = 0;int randomAxis;randomAxis = rand() % 4;if (randomAxis == 0)dx = 0.01;else if (randomAxis == 1)dx = -0.01;else if (randomAxis == 2)dy = 0.01;elsedy = -0.01;}}}}Вроде бы сделал. Просто убрал алгоритм рандомного поворота после столкновения. Конфликтовало, наверное
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.