![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
На данный момент нужна помощь в том, что я не могу вывести levelsMap в поле класса, возникают ошибки. Если кто то покажет, как это будет-буду рада, может опять что-то упускаю. Если оставить как есть, то тогда естественно моя функция прорисовки void Map::display_maze( int level) его не видит. Подскажите пути исправления
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Не понял, что Вы хотите, и что за ошибки возникают. Может, так:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
это нужно вынести из функции, иначе не видно снаружи.
в классе написать декларацию:
а где-то в спп-шнике определение:
|
||||
|
|||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Спасибо всем, проблема была в том, что я пробовала иницилизировать его в конструкторе в срр файле, хотя до этого объявила его в заголовочном. Почему нельзя было?
Хотела еще спросить. Я эту прорисовку хотела использовать для того, чтобы видеть мой алгоритм кратчайшего пути. Т.е. по идее я должна была вызвать прорисовку карты,затем преобразование карты, и затем ту же прорисовку, но на ней должны были отобразиться изменения- + там где есть путь. Сама прорисовка рабочая,т.е когда я запускаю игру с одной функцией преобразования, то мои тайлики выстраивают путь и я его вижу, но когда я делаю так:
У меня в моей консольке видно, что массив не преобразуется и карта пути тайликами не прорисовывается. Я подумала,что у нас значения переменной константное,ничего не помогло. static char* levelsMap[][HEIGHT_MAP]; Почему так? |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
В вложениях показала как отрисовывается путь, когда работает только алгоритм поиска пути и когда сначала рисую массив, потом прорабатываю алгоритм и опять рисую ничего не вижу. Путь на массиве должен быть выложен "+", а получается, что и не прорисовывается не в массиве и не на карте.
Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
вот как с функцией прорисовки
Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
displayMaze() инициализирует массив TileMap из levelsMap:
Естественно, если какой-то путь был посчитан, здесь он затирается. |
|||
|
||||
lenarano |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
А как это изменить? Я планирую эту функцию использовать для того, что бы видеть прорисовку моего пути, т.е. нужно, чтобы массив мог видоизменяться?
Добавлено через 11 минут и 59 секунд Еще хотела спросить. У меня сейчас видно, что я просто обозначила на карте где буднт прорисовываться 'G' и 'S' и я по этому алгоритму прорисовываю свой путь. Вот кусочек кода с прорисовкой и реализацией алгоритма поиска пути
Теперь я хочу перейти к следующему этапу, когда Этaп построения мaршрутa перемещения. Присвaивaем переменным Х и Y знaчения координaт стaртовой позиции. Т.е. я хочу передать координаты врага и пакмана и нарисовать на их месте на карте 'S'и 'G' , а не прорисовывать их на карте. Все эти изменения сейчас пытаюсь сделать. Вот мой класс героя
и Врага
В main в обработчике событий я хочу в обработчике событий передать эти координаты
Что я тут делаю не так? Почему выдается ошибка, программа не запускается. Хочу добиться прорисовки дорожки от девочки к дракону. |
||||||||
|
|||||||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Ну, я бы не стал портить карту во время поиска пути.
find_path() возвращает пустой список если путь не найден. Если путь будет найден - его можно будет отобразить на карте. При рекурсивном поиске пути нужно помечать, где уже были, чтобы не возвращаться. Делаем это на временной карте:
|
||||
|
|||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
PS: значения flag лучше задавить степенями двойки:
Тогда можно задавать комбинации значений:
|
||||
|
|||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Не поняла((
У нас есть struct Point { int x, int y}; std::list<Point> find_path(int x, int y) { Point start = { x, y }; return find_path(start); } Я должна это добавить в класс врага? Я в листе информация о передвижении моего врага, т.е. где он находится? А потом в классе карта я работаю уже std::list<Point> find_path(const Point& start); передаю координаты врага enum flag { free, // свободно wall, // стенка startpoint, // начало пути endpoint, // конец пути inpath, // в пробном пути noway, // проверено, что ведет в тупик ... }; и реализация в cpp/ файле? std::list<Point> find_path(const Point& start) { flag tempMap[HEIGHT_MAP][WIDTH_MAP]; for(int y =0; y < HEIGHT_MAP; y++) for(int x =0; x < WIDTH_MAP; x++) tempMap[y][x] = free; // или wall - см. оригинальную карту tempMap[start.y][start.x] = startpoint; return find_path(const Point& start, tempMap); // Вызываем рекурсивную функцию } |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Ребята, вы меня конечно извините, что туплю. У меня уже с этим курсовым скоро крыша поедет. Варюсь в собственном соку-так получилось. Деваться некуда -стараюсь делать, а знаний и умений мало. Вот как мне оживить моих врагов.
math64, вот вы мне показали, а я не могу понять куда, что всунуть и до конца, что где обозначает. Вот мои основные классы , которые тут нужны. Карта, враг, герой. Что мне добавить куда и как вставить, чтобы мои враги поумнели и карту я увидела.
Класс героя и врага в предыдущем посте. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Главная идея - при поиске пути использовать временную карту.
Куда запихнуть? Можно в класс карты, можно в класс игрока (если путь ищется для игрока), можно в класс врага (если путь ищется для врага), можно в базовый класс Entity для игрока и врага (путь ищется для того и другого, в производных классах можно переоределить специфику) показывыть путь лучше не в консоли, а в игровом окне - так нагляднее, но я не знаю возможностей вашего движка. Реализовать можно примерно так (могут быть ошибки):
Это сообщение отредактировал(а) math64 - 2.11.2015, 15:35 |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Оставила в классе Map только прорисовку карты. Решила реализовать в классе Врага, т.к. он преследует героя.
Компилятор ругается на эти строки, подчеркивая переменную y.(в последней функции) if ( (tempMap[y][x] & endpoint) != 0) return path; if ( (tempMap[y][x] & wall) != 0) if ( (tempMap[y][x] & (inpath|noway)) != 0) и т.д. Пишет: выражение должно относиться к целочисленному типу или типу перечисления без области видимости индекс имеет нецелый тип Посмотрите правильно ли я все остальное указала. Но вроде больше ошибок нет. Это сообщение отредактировал(а) lenarano - 2.11.2015, 18:13 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Ну, можно было заметить мою ошибку (предупреждал, что могут быть). Параметры функции - start_x и start_y, а внутри функции - x и y.
Если будет ругаться на tempMap[y][x] &= ~inpath; придется писать tempMap[y][x] = (flag)(tempMap[y][x]&~inpath); или объявить int tempMap[HEIGHT_MAP][WIDTH_MAP]. Относительно того как показывать результат поиска пути. В подобных библиотеках обычно имеется возможность работать со слоями (Layer) Карту нужно разбить на слои: 1. собственно карта - стены и проходы 2. неподвижные объекты - золото 3. подвижные объекты - спрайты - игрок и враги 4. слой отладки - в нем и выводить найденный путь. 5. Слой надписей (GAME OVER) |
|||
|
||||
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. |