SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Нужны идеи: как определить плоскость препятствия?
В этой теме 9 ответов, 3 участника, последнее обновление Павел Букреев 7 года/лет, 11 мес. назад.
-
АвторСообщения
-
Здравствуйте!
В моей аркаде шарик должен отскакивать от блоков( препятствий). Препятствия я задаю отдельными классами(начальные координаты, ширина,высота модели препятствия), а столкновения определяю при помощи функции intersect. Как нужно написать так, что бы шар определил, к какой плоскости(горизонталь или вертикаль) он подлетел?
Дальше я меняю вектор движения по Х или по У. В зависимости от плоскости.
Заранее Спасибо!
C++123456789101112131415class Enemy{public:FloatRect rect;Sprite sprite;bool life;Enemy(Texture &image){sprite.setTexture(image);rect = FloatRect(20*32,5*32,64,32);}void update(float time){sprite.setPosition(rect.left,rect.top);}};C++123if(block.rect.intersects(ball.rect)){if(ball.dy<0){ball.dy*=-1;}else{ball.dy*=-1;}}Не совсем понял вопроса. Имеешь ввиду столкновения с нижней частью карты(пол) и с боковыми стенами? Посмотри урок про взаимодействие персонажа с картой на этом сайте. он по моему №14. И по тому же принципу попробуй сделать
Пол, стены, потолок заданы “картой”, в которой границы вертикальные заданы буквами “А”, горизонтали – буквами “Б”. На этом основании шарик “знает” какой вектор менять на противоположный для формирования “отскока”.
Препятствия (кирпичи) сформированы как классы, представляют из себя начальную координату по X, Y к которой добавлены высота и ширина. Для формирования “отскока” необходимо шарику “понимать” с какой стороны он коснулся препятствия (снизу, сверху, слева-справа). А если говорить еще точнее, то нужно понимать это горизонтальная плоскость препятствия, или вертикальная?
Про горизонтальную и вертикальную плоскость трудно представить что ты имеешь в виду, но по поводу куда попал шар по препятствию можно определить углом вектора положения шарика и препятствия. Только вектор и угол должно определять препятствие. В последних уроках посмотри там есть по этому поводу информация. Лично я таким образом определяю положение себя по отношению к мобу и тем самым гружу анимацию мобу тоесть если я внизу него – это некий диапазон от столько до столько градусов, значит анимация такая та.
Попробуй может поможет.
Я такой схемой пользуюсь
Вложения:
You must be logged in to view attached files.Посмотри в последнем уроке функцию checkCollisionWithMap. там по Dx<0 это столкновение с левой стеной (вертикально), Dx>0 (с правой стеной, вертикально), Dy>0 – столкновение с полом. Вот при выполнении этих условий и пили то , что тебе нужно.
Столкновение с картой мне определять не нужно( работает по принципу checkCollisionWithMap). Определить нужно другое – с какой стороны шарик подлетел к кирпичику(который на карте желтый). Когда шарик подлетает сверху или снизу, я меняю значение движения y на обратное ему(Умножаю на -1). Но когда шарик влетает в боковую сторону кирпича, он проходит сквозь него и вылетает с другой стороны – это связано с тем что не меняю движение по х. Кирпич у меня воспринимается как единая коллижн модель, поэтому в любой точке пересечения меняется только у. Что бы менять х или у нужно придумать, как шарик поймет с какой стороны к кирпичу он подлетел.
И еще вопрос – можно ли при касании шариком кирпича, “Уничтожить кирпич”( закрасить в цвет фона, обнулить высоту и ширину коллижн модели)?
Вложения:
You must be logged in to view attached files.А можно фрагмент кода, пожалуйста? В голове не укладывается, как это реализовать?
Фрагментом кода и будет функция checkCollisionMap из урока.
C++1234567891011121314void checkCollisionWithMap(float Dx, float Dy)//ф ция проверки столкновений с картой{for (int i = y / 32; i < (y + h) / 32; i++)//проходимся по элементам картыfor (int j = x / 32; j<(x + w) / 32; j++){if (TileMap[i][j] == '0')//положим, что символ "0" и есть твой желтый квадрат{if (Dy>0){ твой шар ударился о желтый квадрат летя вниз}if (Dy<0){ твой шар ударился о желтый квадрат летя вверх }if (Dx>0){твой шар ударился о желтый квадрат летя вправо}if (Dx<0){твой шар ударился о желтый квадрат летя влево}}}}При столкновении (одно из четырех условий выше) просто заменяется символ “0” на другой, который тебе надо, например на пробел TileMap[i][j] = ‘ ‘;
посмотри вроде 13 или 14 урок, мы там собирали бонусы и они исчезали.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.