SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Нужна помощь с взаимодействием с картой
В этой теме 12 ответов, 3 участника, последнее обновление modest 7 года/лет, 12 мес. назад.
-
АвторСообщения
-
Нужна помощь с взаимодействием с картой, у меня карта рисуется с 330 по х до 955(5 квадратиков по 125 шириной, общая ширина 625). И рисуется с низу на вверх, высота одного квадратика(тайлика) 180, размер игрока(машинки) ш 115 высота 180
C++12345678910for(int i=0; i< HEIGHT_MAP; i++)for (int j=0; j<WIDTH_MAP; j++){if (TileMap[i][j] == ' ') s_map.setTextureRect(IntRect(125,0, 125, 180));if ((TileMap[i][j] == '0')) s_map.setTextureRect(IntRect(0,0, 125, 180));if ((TileMap[i][j] == '-')) s_map.setTextureRect(IntRect(0,0, 125, 180));s_map.setPosition((j*125)+330,(i*-180));window.draw(s_map);}Машинка игрока постоянно едет вверх(-dy)
Так выглядит проверка
C++12345678910111213void Collision(){for(int i=y/-180; i<(y-h)/-180;i++)for(int j=x/455; j<(x+w)/455;j++){if (TileMap[i][j]=='0'){if(dx<0) x= ((j*125)+330) + w;if(dx>0) x= ((j*125)-450) - w;}if (TileMap[i][j]=='-'){if(dy<0) {y=i*-180+180; dir=4;}}}}Так выглядит карта
C++1234567891011121314151617181920212223242526272829303132333435const int HEIGHT_MAP = 30;const int WIDTH_MAP = 5;String TileMap[HEIGHT_MAP] = {"0 0","0 0","0 0","0 0","0- 0","0 0","0-- 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0 0","0---0",};Так вот, проблема в том что когда появляться “препятствие” в виде одного кубика когда его объезжаю все равно проехать дальше не могу, срабатывает условие и я “останавливаюсь”, а должен проехать дальше так как объехал. И так же не упирается в правую грань карты, в левую я сделал работает.
Вот скриншоты
Вложения:
You must be logged in to view attached files.Возможно край машины цепляет тайл с препятствием.
Привет, спасибо, что написали на форум и хорошо оформили вопрос со всеми вложениями. Сегодня приболел неожиданно, валяюсь теперь.. Бегло глянул вопрос – первая мысль как в ответе ниже – возможно машинка по высоте и ширине чуть больше, чем видит игрок. за счет этого происходит невидимая коллизия и застревание.
насчет второго вопросаC++1if(dx>0) x= ((j*125)-450) - w;не совсем понятно зачем тут вычитаете 450
Машинка объект 115 шириной 180 высотой, а в спрайте машинка еще меньше, вокруг прозрачная область.
а я не знаю почему отнимал, все варианты пробовал
в фотошопе убери эту прозрачную область лишнюю, она мешает. или программно измени (урок про вывод участка изображения на экран).
C++1if(dx>0) x= (j*125) - w;а вот так попробуй со стенкой правой (пример выше)
Со стенкой делал так не помогало. Буду дома гляну возможно дело в intRect
вообщем пробовал объект меньше делать и его анимацию соответственно, не помогло, просто уже даже не знаю, может условие циклов не верно, не знаю
да, цикл вызывает подозрение. плюс не понятно зачем делишь на отрицательное значение 180
посмотри в уроке было так:
C++1234567891011121314151617181920212223242526272829303132void interactionWithMap()//ф-ция взаимодействия с картой{for (int i = y / 32; i < (y + h) / 32; i++)//проходимся по тайликам, контактирующим с игроком,, то есть по всем квадратикам размера 32*32, которые мы окрашивали в 9 уроке. про условия читайте ниже.for (int j = x / 32; j<(x + w) / 32; j++)//икс делим на 32, тем самым получаем левый квадратик, с которым персонаж соприкасается. (он ведь больше размера 32*32, поэтому может одновременно стоять на нескольких квадратах). А j<(x + w) / 32 - условие ограничения координат по иксу. то есть координата самого правого квадрата, который соприкасается с персонажем. таким образом идем в цикле слева направо по иксу, проходя по от левого квадрата (соприкасающегося с героем), до правого квадрата (соприкасающегося с героем){if (TileMap[i][j] == '0')//если наш квадратик соответствует символу 0 (стена), то проверяем "направление скорости" персонажа:{if (dy>0)//если мы шли вниз,{y = i * 32 - h;//то стопорим координату игрек персонажа. сначала получаем координату нашего квадратика на карте(стены) и затем вычитаем из высоты спрайта персонажа.}if (dy<0){y = i * 32 + 32;//аналогично с ходьбой вверх. dy<0, значит мы идем вверх (вспоминаем координаты паинта)}if (dx>0){x = j * 32 - w;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа}if (dx < 0){x = j * 32 + 32;//аналогично идем влево}}if (TileMap[i][j] == 's') { //если символ равен 's' (камень)x = 300; y = 300;//какое то действие... например телепортация герояTileMap[i][j] = ' ';//убираем камень, типа взяли бонус. можем и не убирать, кстати.}}}если не делать отрицательное деление 180, то тогда нету никакого взаимодействия, выезжает за левую сторону и не упирается об “препятствие”, у меня же карта рисуется с низу вверх, каждый тайлик на -180 выше
Поменял в цикле
C++1for(int j=x/455;на
int j=x/330; // 330 это та координата х когда начинается рисоваться картаНачал проезжать некоторые препятствия но некорректно, а левая грань(тайлик с желтыми линиями) перестал сдерживать машинку и меня отталкивать начало только с х 330, то есть с начала тайлика с линиями
Вот скриншоты тут все понятно
Вложения:
You must be logged in to view attached files.Вообщем, передвинул карту влево, машинку игрока уменьшил и заработало, конечно не то что хотелось но и так хорошо
Тема закрыта
как костыль можно было бы сделать черные квадраты по бокам, но как часть карты. тогда казалось бы , что она посередине. хотя конечно не лучший вариант:))
Довольно таки годный вариант, можно подумать. Но думаю потом еще насобираю костылей)
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.