SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Взаимодействие игрока с картой
В этой теме 2 ответа, 3 участника, последнее обновление Alaz777 6 года/лет, 5 мес. назад.
-
АвторСообщения
-
Доброго времени суток, дорогие друзья! Прошу помочь, проблемы с взаимодействием игрока и карты.
Проблема вот в чем, когда в конструкторе нет этой строки:
C++1h = anim.getH(); w = anim.getW();то происходит такая проблема: http://hkar.ru/Lxuj (скрин) т.е. проблемы с проверкой по х.
Если в конструкторе эта стока есть, т.е. мы получаем w, h текущей анимации, то проблема в другом http://hkar.ru/LxuL (скрин) , персонаж отлично взаимодействует с картой, но она как бы не сходится с рисунком.
Файл проекта прикрепил, пожалуйста посмотрите!
Вот код:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248#include <SFML/Graphics.hpp>#include <C:\\Users\\alosha folel\\Desktop\\Проект1\\Проект1\\Animation.hpp>using namespace sf;float offsetX = 0, offsetY = 0; //смещение картыconst int H = 12;const int W = 40;String TileMap[H] = { //карта 12/40"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB","B B B","B B B","B B B","BBBBBBB B B","B B 0000 BBBB B","B B B B","BBBBBBBBBBBBB B B","B BB BB B","B BB B","B B BB BB B","BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",};class PLAYER { //движение игрока под действием гравитацииpublic:float x, y, dx, dy, w, h;AnimationManager anim;bool onLadder, shoot, hit, dir;enum { stay, walk, duck, jump, climb, swim } STATE;std::map<std::string, bool> key;PLAYER(AnimationManager &a){anim = a;x = 40 ; y = 100;//h = anim.getH(); w = anim.getW();STATE = stay;dx = dy = 0.1;}void draw(RenderWindow &window){anim.draw(window, x, y);}void KeyCheck(){if (key["L"]){dir = true;if (STATE != duck) dx = -0.1;if (STATE == stay) STATE = walk;}if (key["R"]){dir = false;if (STATE != duck) dx = 0.1;if (STATE == stay) STATE = walk;}if (key["Up"]){if (onLadder) STATE = climb;if (STATE == stay || STATE == walk) { dy = -0.27; STATE = jump; anim.play("jump"); }if (STATE == climb) dy = -0.05;if (STATE == climb) if (key["L"] || key["R"]) STATE = stay;}if (key["Down"]){if (STATE == stay || STATE == walk) { STATE = duck; dx = 0; }if (STATE == climb) dy = 0.05;}if (key["Space"]){shoot = true;}/////////////////////если клавиша отпущена///////////////////////////if (!(key["R"] || key["L"])){dx = 0;if (STATE == walk) STATE = stay;}if (!(key["Up"] || key["Down"])){if (STATE == climb) dy = 0;if (STATE == jump) STATE = stay;}if (!key["Down"]){if (STATE == duck) { STATE = stay; }}if (!key["Space"]){shoot = false;}key["R"] = key["L"] = key["Up"] = key["Down"] = key["Space"] = false;}void Animation(float time){if (STATE == stay) anim.set("stay");if (STATE == walk) anim.set("walk");if (STATE == jump) anim.set("jump");if (STATE == duck) anim.set("duck");if (STATE == climb) { anim.set("climb"); anim.pause(); if (dy != 0) anim.play(); }if (shoot) {anim.set("shoot");if (STATE == walk) anim.set("shootAndWalk");}/*if (hit) {timer += time;if (timer>1000) { hit = false; timer = 0; }anim.set("hit");}*/if (dir) anim.flip();anim.tick(time);}void update(float time){KeyCheck();Animation(time);if (STATE == climb) if (!onLadder) STATE = stay;if (STATE != climb) dy += 0.0005*time;onLadder = false;x += dx*time;Collision(0);y += dy*time;Collision(1);anim.tick(time);}void Collision(int num) //обработка столкновений{for (int i = y / 32; i < (y + h) / 32; i++)for (int j = x / 32; j< (x + w) / 32; j++){if (TileMap[i][j] == 'B'){if ((dy > 0) && (num == 1)) { y = i * 32 - h; dy = 0; }if ((dy < 0) && (num == 1)) { y = i * 32 + 32; dy = 0; }if ((dx > 0) && (num == 0)) { x = j * 32 - w; }if ((dx < 0) && (num == 0)) { x = j * 32 + 32; }}}}};int main(){RenderWindow window(VideoMode(1280, 720), "SFML works!");Texture t; //создаём текстуруt.loadFromFile("C:\\Users\\alosha folel\\Documents\\Visual Studio 2013\\Projects\\Проект1\\Debug\\fang.png"); //загружаем картинкуAnimationManager anim;anim.create("walk", t, 0, 244, 40, 50, 6, 0.005, 40);anim.create("jump", t, 0, 528, 29, 30, 4, 0.0045, 38);anim.create("duck", t, 0, 436, 80, 20, 1, 0.005);anim.create("stay", t, 0, 187, 42, 52, 3, 0.002, 42);anim.create("shoot", t, 0, 572, 45, 52, 5, 0.004, 45);//anim.create("shootAndWalk", t, 0, 900, 45, 52, 5, 0.004, 49);//float currentFrame = 0; //номер текущего кадра, для анимацииPLAYER p(anim);Clock clock; //время прошедшее с последнего тикаRectangleShape rectangle(Vector2f(32, 32));while (window.isOpen()) //пока окно открыто{float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 800; //регулируем скорость игрыEvent event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();}//anim.set("stay");if (Keyboard::isKeyPressed(Keyboard::Left)) p.key["L"] = true;if (Keyboard::isKeyPressed(Keyboard::Right)) p.key["R"] = true;if (Keyboard::isKeyPressed(Keyboard::Up)) p.key["Up"] = true;if (Keyboard::isKeyPressed(Keyboard::Down)) p.key["Down"] = true;if (Keyboard::isKeyPressed(Keyboard::Space)) p.key["Space"] = true;p.update(time);//anim.tick(time);//if (p.rect.left > 640) { offsetX = p.rect.left - 1280 / 2; } // привязываем камеру (смещение карты)//if (p.rect.top > 360) { offsetY = p.rect.top - 720 / 2; } //если половина экрана больше, то делаем смещениеwindow.clear(Color::White);for (int i = 0; i < H; i++)for (int j = 0; j < W; j++){if (TileMap[i][j] == 'B') rectangle.setFillColor(Color::Black); //если B то в черныйif (TileMap[i][j] == '0') rectangle.setFillColor(Color::Green); //если 0 то в зелёныйif (TileMap[i][j] == ' ') continue; //если пустой, то пропускаем этот шагrectangle.setPosition(j * 32, i * 32); //нужные координатыwindow.draw(rectangle);}//window.draw(p.sprite);p.draw(window);window.display();}return 0;}Проект: http://rgho.st/8RxlMPrdZ
…..
Для начала прикрепи робочий проект.Ошибка
Почти на 100% уверен что проблема тут в setOrigin, и находится она в классе анимаций. Поищи строку в классе анимаций у себя:
sprite.setOrigin(…, …);
Если найдешь ее – удали, и должно все заработать, разумеется если оставишь w и h = anim.getW() и anim.getH() соответственно.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.