![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Да, точно.
Все запустилось, но ничего не отображается. Все данные хранятся тут std::list<Point>(); Я решила уйти от изображения 'G' на карте, а передать реальные координаты игрока. В main, где есть описание взаимодействия со врагом взяла координаты игрока (*it)->getPlayerCoord(pacman.x,pacman.y); Она у меня описана в базовом классе void Entity::getPlayerCoord(float X,float Y) { px=X; py=Y; } получила рх и ру игрока и уже в функции void update(float time) врага вызываю свой алгоритм поиска find_path(x, y, px, py); И соответственно переделала саму фунцию
Т.е. теперь у меня в лист передалась информация и о положении моего реального героя и врага. Правильно? Добавлено через 14 минут и 56 секунд Теперь find_path(x, y, px, py); передает реальные координаты врага и героя и находит путь, но я его не вижу. |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Как сделать, чтобы враг начал двигаться?
Теперь нужно создать еще одну функцию,в которую мне нужно будет передать мой лист, где расписан путь.в которой координаты моего врага будут меняться, т.е. смотрим вокруг и если не стенка и путь свободен перешли туда и делать это с определенной скоростью. Предположем эту скорость я смогу отрегулировать в самой функции движения и менять ее в зависимости от необходимости. Но я так и не могу понять как реализовать передвижение врага. Я нашла в интернете вот это 1.Этaп построения мaршрутa перемещения. Присвaивaем переменным Х и Y знaчения координaт стaртовой позиции. Это готово В окрестности позиции R(Х,Y) ищем элемент с нaименьшим знaчением (т.е.для этого просмaтривaем R(Х+1,Y), R(Х-1,Y), R(Х,Y+1), R(Х,Y-1). Координaты этого элементa зaносим в переменные X1 и Y1. Совершaем перемещение объектa (кто тaм у вaс будет - робот, aквaнaвт, Винни-Пух) по игровому полю из позиции [X,Y] в позицию [X1,Y1]. Если R(X1,Y1)=0,то переходим к пункту 15. Выполняем присвaивaние X:=X1,Y:=Y1. Переходим к пункту 11. По поводу отрисовки , то она фактически и есть в функции движения, когда мы меняем х и у(т.е. местоположение на карте), то уже все родные функции SFML перемещают игрока или врага. Поэтому мне кажется тут нужно работать именно с x и у. |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Слои библиотека поддерживает? Если да, соединить точки из list<Point> линией.
Если нет, заменить на карте в точках из списка на свой символ, запомнив старый а занем вернуть назад:
Добавлено через 11 минут и 59 секунд Найденный путь запоминается в поле класса Enemy. Проверять на свободность клеток не обязательно - это было сделано при поиске пути. Враг движется от path[0] до path[1] при float t измемающемся от 0 до 1
Когда t становится 1, из path удаляется первый элемент (глупый враг) или path пересчитывается (умный враг). Пересчет происходит также, когда в path оствается меньше 2 точек. |
||||
|
|||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
int x = path[i].x, y = path[i].y;//вот тут ругается [i
появились ошибки: отсутствует оператор[], соответствующий этим операндам. Я, поняла эти функции так. Вставила их в мой класс врага и с помощью этих функций у меня должна отобразиться дорожка
Это сообщение отредактировал(а) lenarano - 3.11.2015, 15:34 |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Ошибся. У std::list нет operator[]. Можно заменить на std::vector или
или написать свой класс-контейнер. И да, list::size() лучше не пользоваться - он слишком медленный. Соответственно, при анамации врага, нужно забрать два первых элемента из списка:
|
||||
|
|||||
lenarano |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
заменила везде лист на вектор.
На этом этапе все запускается.
Медленный потому что разбросаны элементы по памяти. Но при векторе все же расположено блоками-значит можно использовать. Правильно? Это сообщение отредактировал(а) lenarano - 3.11.2015, 20:14 |
||||
|
|||||
lenarano |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
![]()
Вот мы их расписали. Теперь их нужно прописать где-то в коде. Мы их прописываем в нашем коде после функции find_path(x, y, px, py)? Чтобы дорожки прорисовывались. Тут я не понимаю. Нам нужно добавить поля класса char* Saved и std::vector<Point> Path? Правильно? И как параметры туда передавать?
Вызвали один раз find_path(x, y, px, py); а уже потом из этой функции запускается вторая return find_path(x, y, tempMap, path);, которая возвращает std::vector<Point>(); Я правда стараюсь))) Реализовала так как и говорила вверху. Все запустилось, но дорожки нет((( Когда делаю отладку, то вижу, что Path=find_path(x, y, px, py); Path=размер 0; Что не так? ![]() Это сообщение отредактировал(а) lenarano - 3.11.2015, 21:32 |
||||
|
|||||
lenarano |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
math64, Разжуйте мне, пожалуйста. Можно сразу функцией, а я ее закоментирую, как я ее понимаю. Мне так проще. Как раньше показывали.
Вообще не представляю, как все это запустить. Очень вас прошу покажите мне, что куда вставить у меня в коде, чтобы все заработало. Очень надеюсь на вашу помощь math64. Я саму игру по урокам с интернета быстрее написала, а на этой реализации споткнулась(((
Это сообщение отредактировал(а) lenarano - 3.11.2015, 21:07 |
||||
|
|||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Элементы std::vector хранятся в виде массива + его длина. Легко получить доступ к нужному элементу, узнать размер, легко добавить элемент в конец (если зареервировать массив нужного размера) и удалять из конца. Но трудно добавлять и удалять из середины. Элементы std::list хранятся в виде списка. Лекго добавить и удалить в начало и конец, вставить и удалить в середине, если найден нужный элемент, но сам поиск элемента в середине - долгая операция. Размер списка не хранится отдельно, поэтому size() каждый раз считает число элементов - но это особенность реализации. У вас есть Enemy::update(float time); В ней нужно делать примерно так:
В заголовке определить const bool DEBUG = true; или false; (или #define DEBUG true) в зависимости от того, нужна отладка или нет. |
||||
|
|||||
lenarano |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
При компиляции ошибок не выдает, но при запуске появляется информация
vector erase iterator outside range //вектор стереть итератор вне диапазона Path.pop_front() я заменила на Path.erase(Path.begin()) , т.к. в векторе не было такой функции При отладке Path = find_path(x,y,px,py); Path по-прежнему указывает,что ровна 0 Saved при наведении пишет ошибку при чтении символов строки Ошибка при отладке происходит, когда доходит до этой строки: Path.erase(Path.begin());//Удаляет элемент в начале списка. Вообще, я поняла, что изначально должен прорабатываться алгоритм поиска пути, потом показываться и потом очищаться путь, а получается, что сразу же прорабатывается вот этот кусочек кода
Это происходит, т.к. timer сразу больше 1(значение больше 1000 при отладке) Еще хотела спросить-нужно ли иницилизировать эти значения вначале в конструкторе, или их достаточно определить?
Еще ругается вот тут, работает в режиме, когда отладка=true;
Помогите. ![]() Это сообщение отредактировал(а) lenarano - 6.11.2015, 21:28 |
||||||
|
|||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
delete[] Saved;
Saved нужно инициализировать, Path не обязательно (вызывается конструктор по умолчаниию). Приводимый мной код примерный - в нем могут быть ошибки. Да, Path должен быть вычислен до того, как враг начинает двигаться. После вычисления нужно проверить, что в Path хотя бы два элемента и если он пустой оставлять врага неподвижным или он будет двигаться на случайную соседнюю свободную клетку. И find_path скорее всего, нужно будет оптимизировать, чтобы он выводил более короткий путь - сейчас враг предпочтёт начать двигаться на север, даже если цель на юге. |
|||
|
||||
lenarano |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Внесла правки, на который указывали. пробовала отладку и нашла пару вроде ошибок
Раньше было так find_path(x, y, tempMap, path); и получалось, что мы не то нашли Правильно? При отладке вижу, что застреваем в std::vector<Point> find_path(int start_x, int start_y, int pacman_x,int pacman_y) Вроде проходимся по алгоритму, а потом застреваем тут tempMap[start_y][start_x] = startpoint; Ошибка :необработанное исключение, нарушение прав доступа при записи Может посмотрите еще, какую ошибку я не замечаю Слушаете, а может быть ситуация тупо в значениях которые мы передаем в нашу функцию start_x у меня по координатам =410, а мы его пробуем впихнуть в карту tempMap[start_y][start_x] = startpoint; И возникает вопрос, если это игровые координаты то как мне перейти к ним?
Это сообщение отредактировал(а) lenarano - 6.11.2015, 22:26 |
||||||
|
|||||||
math64 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
По идее нужно добавить деструктор и сделать там delete[] Save или ClearPath() - на случай если враг будет удалён до того, как будет вызван ClearPath().
Также, вообще-то враг не должен выходить за пределы карты. Если от вылез - лучше поправить координаты
Вероятно в Entity есть поля float x; float y; Этот код скрывает их:
Это по видимому не нужно (уже учтено в коде выше):
|
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |