![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
lenarano |
|
||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Делаю игру Пакман
В Игре имеются следующие классы Map.h
Entity.h и Entity.cpp
Player.h и Player.cpp
Собственно класс Врага по которому вопрос
В этом классе я хочу реализовать волновой алгоритм для преследования моими привидениями пакмана. Сам алгоритм я нашла и как могла разобрала. Создала функцию void find_path(int N,int M), которая находит кратчайший путь и указывает его +. Эту функцию добавила в void update(float time) этого класса, чтобы она оживала и передала ей размер своей карты. Теперь мне надо, что бы она как-то заработала в main. Все было бы хорошо, но в моей карте нет 'G' и 'S'. я использую классы.В main я создаю список врагов и для прохождения в списке использую итератор.
Функцию void update(float time) вызываю для каждого в списке,т.е для каждого врага иницилизируется свой массив для поиска в void find_path(int N,int M) и это правильно, т.к. врагов много
До этого момента я думаю, что у меня все правильно. Посмотрите. Трудность у меня в запуске всего этого механизма, хотя наверное все просто до безобразия. Я в main проверяю объекты на пересечение в цикле "пока окно открыто"и там же хочу добавить и кусок для запуска всего этого. Я так понимаю , что мне нужно получить координаты игрока и врага тут и присвоить в этом месте в карте 'G' и 'S'. Потом как-то подчищать и добавлять заново. Вообщем тут вообще запара.
Ребята, помогите. Мне кажется тут очень легко, но я туплю страшно. Добавлено через 11 минут И еще хотела спросить. что не так с самим файлом map.h на то, что он переопределяется еще раз хотя я в него добавила #ifndef MAP_H #define MAP_H #endif MAP_H Пришлось делать его статическим, чтобы как то продолжить работу, хотя его таким оставлять никак нельзя, т.к. тайлы не убираются когда надо. В чем может быть ошибка? |
||||||||||||||
|
|||||||||||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
По основному вопросу - ничего не могу сказать, алгоритм слишком сложный, долго разбираться, используется незнакомая библиотека.
В заголовке же инициализируется sf::String TileMap[HEIGHT_MAP]; В "правильных" заголовках так не делают. Твой заголовок можно включить только один раз. Добавив static, ты размножаешь TileMap столько раз, сколько раз этот заголовок используется. Без static, TileMap инициализируется столько раз, сколько раз этот заголовок используется. Это будет обнаружено при линковке, умный компилятор может выдать предупреждение. Выход: убрать инициализацию из заголовка и инициализировать в одном из файлов .cpp, например, в Map.cpp Это сообщение отредактировал(а) math64 - 23.10.2015, 08:30 |
|||
|
||||
lenarano |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
map.h
map.cpp
Посмотрите, вот так? Выдает ошибки: В map.h
В map.cpp
|
||||||||
|
|||||||||
math64 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Костанты внутри класса и вне класса - разные вещи. Внутри класса - это обычное поле, не доступное к изменению, должно инициализироваться в конструкторе. Компилятор значения этого поля не знает, поэтому не сможет создать массив TileMap[HEIGHT_MAP][HEIGHT_MAP].
В старом стандарте C++ для этого используется enum (в С++ 11 есть альтернатива, но я не помню как она используется):
При определении статического поля размерности массива указывать не нужно, компилятор их уже знает. Ширина массива увеличена на 1, иначе C-строка, заканцивающаяся '\0' не влезет:
Если поле не статическое, его нужно инициализировать в конструкторе:
(inline коструктор можно разместить в заголовке, но лучше его не делать inline и разместить в cpp). |
||||||
|
|||||||
lenarano |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Посмотрите правильно ли я поняла код и пояснения. (указала коменты в коде)
Теперь я уже не могу обращаться к элементом карты как TileMap[i][j], но на этом завязана прорисовка карты, обращения к элементам, замена тайликов. Можно ли здесь как то исправить?
|
||||
|
|||||
Starikan |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 25.10.2007 Репутация: 1 Всего: -15 |
Модератор: Сообщение скрыто. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Теперь у тебя TileMap - поле класса, а не глобальная переменная. HEIGHT_MAP и WIDTH_MAP то же находятся внутри класса.
Т. е. нужно создать где-то Map* map = new Map(); и писать map->TileMap[i][j], Map::HEIGHT_MAP и Map::WIDTH_MAP . map может быть глобальной переменной (тогда она создается и удаляется в main() ) или полем класса (тогда она создаётся в конструкторе класса, а удаляется в деструкторе). Добавлено через 7 минут и 36 секунд
const - потому что строки "0000000000000000000000000000" имеют тип const char* static - чтобы массив инициализировался компилятором во время компиляции. Без static массив будет создаваться и инициалзироваться при каждом вызове конструктора Map::Map(). |
|||
|
||||
lenarano |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Получилось.
![]() Создала в Main: Map* map = new Map(); Добавила в класс игрока и врага поля: Map* m_map; И добавила в конструктор каждого класса:
И теперь обращаюсь как
Спасибо огромное. Еще хотела спросить, если я хочу, чтобы уровней было несколько и соответственно карт тоже, как мне лучше всего реализовать? Я хочу добавить в класс игрока переменную bool, которая станет "правдой", если мой пакман съест все точки. И если она станет правдой, то будет реализован 2ой уровень. Добавлено через 2 минуты и 59 секунд Я имела ввиду, что я же создаю конструкторе свою карту, но она может то быть разной в зависимости от уровня. |
||||
|
|||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Но лучше уровни считать из файла. В этом случае char levelsMap[LEVELS_COUNT][HEIGHT_MAP][WIDTH_MAP]; будет полем класса Map и считываться в конструкторе. PS: в предыдущем сообщении в коде вставь перенос в длинной строки, чтобы страница форума выглядела нормально. Это сообщение отредактировал(а) math64 - 27.10.2015, 13:04 |
||||
|
|||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Реализовала в функции void Player::update(float time)
Герой собирает золото и если все собрал, то перешел на новый уровень. Можно ли как то преобразовать, чтобы подходила не для 2 уровней, а для нескольких вот тут m_map->setLevel(+1); И еще вопрос, как только сработало это условие у меня загрузилась моя новая карта, герой переместился, но не может двигаться. Т.е. анимация есть, но как будто там стоит стенка, которую не видно. Почему так происходит? Я вот думаю, что может вопрос в прорисовке карты, мы же здесь по факту ничего не перезапускали. Может сталкивались ![]() |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
После переключения уровня нужно найти начальное положение героя и заново пересоздать врагов. Начальное положение геороя и врагов можно задать специальными значками на карте. А можно из положения задавать случайно (проверяя чтобы они не попали на клетки со стенками).
Кроме того, программа может не всегда обращаться к карте для проверки наличия стенки, помня что раньше она там была или там было свободно (например, где-то был расчитан и запомнен путь движения). Подобные кеш-буфера должны быть сброшены. Добавлено через 54 секунды Ну, и да, экран надо перерисовать. |
|||
|
||||
lenarano |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Спасибо большое за предыдущие ответы. Надеюсь и здесь все разжуете))
В классе врага хочу прописать алгоритм, по которому враг будет преследовать пакмана. добавляю в класс новые функции 1. Чтобы нарисовать мой двумерный массив. Видимо ошибка в прорисовке printf("%.*s\n", m_map->WIDTH_MAP, m_map->TileMap[i]); т.к. отображается не мой массив, а другие символы. В алгоритме были char maze[NROWS][MCOLS].
Далее в функции движения должен прорисовываться путь, пока его нет.
2. Как все-таки переделать наш класс Map, чтобы уровней было несколько. Реализовала в функции void Player::update(float time) код C++ 1: if(counterGoldIngot<=0){m_map->setLevel(+1);counterGoldIngot=3;x=460;y=720;} Герой собирает золото и если все собрал, то перешел на новый уровень. Можно ли как то преобразовать, чтобы подходила не для 2 уровней, а для нескольких вот тут m_map->setLevel(+1); |
||||
|
|||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Я смогла вывести свой массив в класса Map, добавив пару строчек кода в void Map:: setLevel(int level)
{TileMap[i] = levelsMap[level][i]; std::cout<<levelsMap[level][i]; printf("\n"); } Но я все же хочу отдельную функцию. Как мне реализовать ее? И какие значения передать? Что тут изменить? void display_maze(void) { int i; printf("MAZE:\n"); {TileMap[i] = levelsMap[level][i];//ругается,что эти индивикаторы не определены std::cout<<levelsMap[level][i]; printf("\n"); } return; } Добавлено через 6 минут и 32 секунды Мне нужно передать наверное значение по ссылке , но я не понимаю как |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
попробовала вот так, хотя не уверена-ошибку подчеркивает
Добавлено через 10 минут и 30 секунд void display_maze( sf::String TileMap,char* levelsMap[][],int level)//массив не может содержать элементы этого типа Это сообщение отредактировал(а) lenarano - 1.11.2015, 09:14 |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Выдает непонятную мне ошибку , да вообще хотелось бы понять, что не так. Добавлено через 14 минут и 14 секунд Я в конец запуталась. Очень жду подмогу))) |
|||
|
||||
lenarano |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 17.4.2014 Репутация: нет Всего: нет |
Нашла ошибки о которых стыдно говорить. На данный момент нужна помощь в том, что я не могу вывести levelsMap в поле класса, возникают ошибки. Если кто то покажет, как это будет-буду рада, может опять что-то упускаю. Если оставить как есть, то тогда естественно моя функция прорисовки void Map::display_maze( int level) его не видит. Подскажите пути исправления
|
|||
|
||||
math64 |
|
||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
требует наличия оператора копирования:
Для
нужно определение оператора
Если такие операторы не определены, копилятор пытается сделать преобразования типов, но возможно, делает не те.
нельзя использовать вместе с cout, делайте
|
||||||||||||
|
|||||||||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |