SFML и C++ Уроки \ Разработка игр › Форумы › Логика игр › Не работает взаимодействие с персонажем при нажатии клавиш
В этой теме 0 ответов, 1 участник, последнее обновление gelius 3 года/лет, 1 месяц назад.
Просмотр 1 сообщения - с 1 по 1 (всего 1)
-
АвторСообщения
-
Здравствуйте!
Делаю игру платформер по видеоуроку.
Не пойму, из-за чего не работает взаимодействие с персонажем при запуске.
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212#include <SFML/Graphics.hpp>#include "anim.hpp"using namespace sf;float offsetX = 0, offsetY = 0;//bool dir; //float??const int H = 12;const int W = 40;String TileMap[H] = {"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB","B B B","B B B","B B B","B B B","B 0000 BBBB B","B B B","BBB 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; //на лестнице; стреляют; ударилиbool dir;bool onGround;FloatRect rect;enum { stay, walk, duck, jump, climb, swim } STATE;std::map<std::string, bool> key;PLAYER(AnimationManager &a){anim = a;STATE = stay;}void KeyCheck(){//////////////Если клавиша нажата////////////////////if (key["L"]){dir = 1;if (STATE != duck) dx = -0.1;if (STATE == stay) STATE = walk;}if (key["R"]){dir = 0;if (STATE != duck) dx = 0.1;if (STATE == stay) STATE = walk;}if (key["Up"]){if (STATE==stay || STATE == walk) { dy = -0.27; STATE = jump; }if (STATE == swim || STATE == climb) { dy = -0.05; }}if (key["Down"]){if (STATE == stay || STATE == walk) { STATE = duck; dx = 0; }if (STATE == swim || 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 == swim || STATE == climb) dy = 0;}if (!(key["Down"])){if (STATE == duck) { STATE = stay; }}if (!(key["Space"])){shoot = false;}}void update(float time){KeyCheck();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 (!onLadder) STATE = stay;}if (shoot) {anim.set("shoot");if (STATE == walk) anim.set("shootAndWalk");}if (dir) anim.flip(true);x += dx * time;Collision(0); //функция столкновенийdy += 0.0005*time;y += dy * time;Collision(1);anim.tick(time);key["R"] = key["L"] = key["Up"] = key["Down"] = key["Space"] = false;}void Collision(int num){for (int i = rect.top / 32; i < (rect.top + rect.height) / 32; i++)for (int j = rect.left / 32; j < (rect.left + rect.width) / 32; j++){if (TileMap[i][j] == 'B'){if ((dx > 0) && (num == 0)) rect.left = j * 32 - rect.width;if ((dx < 0) && (num == 0)) rect.left = j * 32 + 32;if ((dy > 0) && (num == 1)) { rect.top = i * 32 - rect.height; dy = 0; onGround = true; }if ((dy < 0) && (num == 1)) { rect.top = i * 32 + 32; dy = 0; }}if (TileMap[i][j] == '0'){TileMap[i][j] = ' ';}}}};int main(){RenderWindow window(VideoMode(600, 400), "The runaway Princess");Texture q;q.loadFromFile("images/fang.png");AnimationManager anim;////////////параметры для картинки с видео/////////////////anim.create("walk", q, 0, 244, 40, 50, 6, 0.005, 40); //ходьбаanim.create("jump", q, 0, 528, 29, 30, 4, 0.0045, 38); //прыжокanim.create("duck", q, 0, 436, 80, 20, 1, 0.005); //присестьanim.create("stay", q, 0, 187, 42, 52, 3, 0.002, 42); //стоятьanim.create("shoot", q, 0, 572, 45, 52, 5, 0.004, 45); //стрелять//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 / 500;if (time > 40) time = 40;Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();}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;anim.tick(time);window.clear(Color(255, 255, 255));anim.draw(window, 50, 100);window.display();}return 0;} -
АвторСообщения
Просмотр 1 сообщения - с 1 по 1 (всего 1)
Для ответа в этой теме необходимо авторизоваться.