SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Взаимодействие с картой
В этой теме 2 ответа, 2 участника, последнее обновление Maksim 5 года/лет, 9 мес. назад.
-
АвторСообщения
-
Почему, когда персонаж идёт вправо и вниз написано w и h, а вверх и влево – размер тайла?
C++1234567891011121314151617181920212223242526272829303132void interactionWithMap()//ф-ция взаимодействия с картой{for (int i = y / 65; i < (y + h) / 65; i++)//проходимся по тайликам, контактирующим с игроком, то есть по всем квадратикам размера 32*32, которые мы окрашивали в 9 уроке. про условия читайте ниже.for (int j = x / 65; j<(x + w) / 65; j++)//икс делим на 32, тем самым получаем левый квадратик, с которым персонаж соприкасается. (он ведь больше размера 32*32, поэтому может одновременно стоять на нескольких квадратах). А j<(x + w) / 32 - условие ограничения координат по иксу. то есть координата самого правого квадрата, который соприкасается с персонажем. таким образом идем в цикле слева направо по иксу, проходя по от левого квадрата (соприкасающегося с героем), до правого квадрата (соприкасающегося с героем){if (TileMap[i][j] == '0')//если наш квадратик соответствует символу 0 (стена), то проверяем "направление скорости" персонажа:{if (dy>0)//если мы шли вниз,{y = i * 65 - h;//то стопорим координату игрек персонажа. сначала получаем координату нашего квадратика на карте(стены) и затем вычитаем из высоты спрайта персонажа.}if (dy<0){y = i * 65 + 65;//аналогично с ходьбой вверх. dy<0, значит мы идем вверх (вспоминаем координаты паинта)}if (dx>0){x = j * 65 - w;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа}if (dx < 0){x = j * 65 + 65;//аналогично идем влево}}if (TileMap[i][j] == 's') { //если символ равен 's' (камень)playerScore++;//какое то действие... например телепортация герояTileMap[i][j] = ' ';//убираем камень, типа взяли бонус. можем и не убирать, кстати.}}}Всё зависит от размеров прямоугольника персонажа, размеров тайла карты и направления столкновения. Допустим, персонаж столкнулся с тайлом карты при движении слева направо. Тогда он немного “продавит” этот тайл и должен будет оттолкнуться от него влево. Мы в коде должны сами прописать координату, в которой он окажется после столкновения, а эта координата как раз определяется размерами прямоугольника персонажа и тайлов карты. А именно, персонаж после столкновения должен вплотную прилегать к тайлу карты, с которым он столкнулся, отсюда можно найти координаты персонажа после коллизии. Если персонаж двигался слева направо, то после столкновения нужно от левого края прямоугольника карты отступить влево ширину персонажа, тогда персонаж будет стоять как раз вплотную слева от прямоугольника. А если персонаж двигался справа налево, то к левому краю прямоугольника карты нужно прибавить ширину тайла карты, тогда персонаж окажется как раз вплотную справа от него. Проще всего это понять, если на бумаге схематично нарисовать кусочек карты и вручную промоделировать коллизии персонажа с тайлами карты по всем направлениям (т.е., просто по шагам проследить, как выполнятеся функция interactionWithMap(), чему равны в момент столкновения переменные i и j и т. д.), тогда станет ясно, на какое расстояние нужно его сдвигать.
Все понятно, спасибо
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.