SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Поворот спрайта за курсором
В этой теме 2 ответа, 2 участника, последнее обновление zxchope 2 нед., 5 дн. назад.
-
АвторСообщения
-
Здравствуйте, столкнулся с проблемой того, что при повороте спрайта за курсором, его прямоугольник( хитбокс) не меняется.
Также при использовании setOrigin получается пространство при взаимодействии с объектами карты. На первом скриншоте используется setOrigin, на втором нет.
Думал может надо как то менять координаты / по другому работать с объектами карты, но не получилось.
На 3 скрине сама карта.
С темой еще плохо знаком, прошу помощи или хотя бы наводки в каком направлении действовать для исправления.
Заранее спасибоC++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167#include <SFML/Graphics.hpp>#include <iostream>#include <string>#include <cmath>#include "map.h" //подключили код с картой//map для лидерборда//не меняется хитбокс при ротейте спрайта//в вычислении стенок добавить размерность спрайтаusing namespace sf;class Player {public:float x, y, w, h, dx, dy, speed ;int dir ;std::string File;Image image;Texture texture;Sprite sprite;Player(std::string F, float X, float Y, float W, float H){dx=0; dy=0; speed=0; dir = 0;File = F;w = W; h = H;image.loadFromFile(File);texture.loadFromImage(image);sprite.setTexture(texture);x = X; y = Y;sprite.setTextureRect(IntRect(0, 0, w, h));//sprite.setOrigin(38,19); // задали расположение теперь нужно задать хитбокс//sprite.//sprite.setPosition(38,19); ????//задать размерность?}void update(float time){switch (dir){case 0: dx = speed; dy = 0; break;case 1: dx = -speed; dy = 0; break;case 2: dx = 0; dy = speed; break;case 3: dx = 0; dy = -speed; break;}x += dx*time;y += dy*time;speed = 0;mapWork();sprite.setPosition(x,y);}float getPlayersCoordinateX(){return x;}float getPlayersCoordinateY(){return y;}void mapWork(){ //работает так : смотрим с какой стороны подходит персонаж, относительно этого переприсваиваем координаты, чтобы он не мог попасть на клетку со стеной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'){if(dy > 0) //движение внизy = i * 32 - h;if(dy < 0) //движение вверхy = i * 32 + 32;if(dx > 0) //движение вправоx = j * 32 - w;if(dx < 0) //движение влевоx = j * 32 + 32;}}}};int main(){RenderWindow window(sf::VideoMode(1920, 1080), "Hotline miami 3");Image map_image;//объект изображения для картыmap_image.loadFromFile("map.png");//загружаем файл для картыTexture map;//текстура картыmap.loadFromImage(map_image);//заряжаем текстуру картинкойSprite s_map;//создаём спрайт для картыs_map.setTexture(map);//заливаем текстуру спрайтомPlayer p("shoot.png", 250, 250, 76, 39);float CurrentFrame = 0;Clock clock;while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 400;Vector2i pixelPos = Mouse::getPosition(window);//забираем коорд курсораVector2f pos = window.mapPixelToCoords(pixelPos);//переводим их в игровые (уходим от коорд окна)sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}float dX = pos.x-p.x;//вектор , колинеарный прямой, которая пересекает спрайт и курсорfloat dY = pos.y-p.y;//он же, координата yfloat rotation = (atan2(dY, dX)) * 180 / 3.14159265;//получаем угол в радианах и переводим его в градусыstd::cout << rotation << "\n";//смотрим на градусы в консолькеp.sprite.setRotation(rotation);//поворачиваем спрайт на эти градусы// p.sprite.setPosition(p.sprite.getPosition()); ???if ((Keyboard::isKeyPressed(Keyboard::Left) || (Keyboard::isKeyPressed(Keyboard::A)))) {p.dir = 1; p.speed = 0.1;}if ((Keyboard::isKeyPressed(Keyboard::Right) || (Keyboard::isKeyPressed(Keyboard::D)))) {p.dir = 0; p.speed = 0.1;}if ((Keyboard::isKeyPressed(Keyboard::Up) || (Keyboard::isKeyPressed(Keyboard::W)))) {p.dir = 3; p.speed = 0.1;}if ((Keyboard::isKeyPressed(Keyboard::Down) || (Keyboard::isKeyPressed(Keyboard::S)))) {p.dir = 2; p.speed = 0.1;}p.update(time);window.clear();for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDTH_MAP; j++){if (TileMap[i][j] == ' ') s_map.setTextureRect(IntRect(0, 0, 32, 32)); //если встретили символ пробел, то рисуем 1й квадратик//if (TileMap[i][j] == 's') s_map.setTextureRect(IntRect(0, 0, 32, 32));//если встретили символ s, то рисуем 2й квадратикif ((TileMap[i][j] == '0')) s_map.setTextureRect(IntRect(64, 0, 32, 32));//если встретили символ 0, то рисуем 3й квадратикs_map.setPosition(j * 32, i * 32);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадратwindow.draw(s_map);//рисуем квадратики на экран}window.draw(p.sprite);window.display();}return 0;}C++1234567891011121314151617181920212223242526272829303132333435363738394041#include <SFML/Graphics.hpp>const int HEIGHT_MAP = 34;const int WIDTH_MAP = 60;sf::String TileMap[HEIGHT_MAP] = {"000000000000000000000000000000000000000000000000000000000000","0 0 0","0 0 0","0 0 0","0 0 0","0 0 0000000000 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 0 0","0 0 0","0 0 0000000000 0","0 0 0","0 0 0","0 0 0","0 0 0","000000000000000000000000000000000000000000000000000000000000",};Вложения:
You must be logged in to view attached files.Не совсем понятно, а зачем именно так проверять столкновения? По идее не важно с какой стороны подошел, смотрим сначала, будут ли следующие координаты пересекаться с какоц либо стеной, если будут, то просто не обновляем координаты и оставляем как есть. Кажется будет проще. На счет хитбокса, а в каком месте вы пытаетесь получить хитбокс?
Проблема была в том, что из за setOrigin спрайт касался стены, то есть не мог дальше двигаться, раньше, чем видимая часть спрайта, но я уже решил эту проблему.
Спасибо за ответ. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.