SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Проблема проверки текущего тайла
В этой теме 4 ответа, 2 участника, последнее обновление FerrariHD 7 года/лет, 11 мес. назад.
-
АвторСообщения
-
Добрый день. Появилась проблемка с проверкой текущего тайла. Сама коллизия (типо что нельзя проехать за бетонную стену) работает правильно, однако если мы хотим проверить текущий тайл и изменить, например, скорость, то почему-то используется только правый нижний угол тайла. Тайлы 30х30
P.S. танчикиC++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119class Entity{protected:int currentAxis;float speed;String name;public:float dx, dy;FloatRect rect;Sprite sprite;bool life;~Entity(){}};class Player : public Entity{private:int score;public:Player(){}Player(Texture &image, String Name){sprite.setTexture(image);rect = FloatRect(30, 30, 30, 30);score = 0;name = Name;dx = dy = -0.01;currentAxis = 0;speed = 1;if (name == "Player1"){rect.left = 550;rect.top = 690;}else{rect.left = 400;rect.top = 690;}}void update(float time){rect.left += dx*time*speed;Collision(0);rect.top += dy*time*speed;Collision(1);sprite.setPosition(rect.left, rect.top);if (name == "Player1"){if (dx < 0) sprite.setTextureRect(IntRect(222, 32, -30, 30));if (dx > 0) sprite.setTextureRect(IntRect(224, 32, 30, 30));if (dy < 0) sprite.setTextureRect(IntRect(0, 32, 30, 30));if (dy > 0) sprite.setTextureRect(IntRect(160, 32, 30, 30));}else{if (dx < 0) sprite.setTextureRect(IntRect(222, 64, -30, 30));if (dx > 0) sprite.setTextureRect(IntRect(224, 64, 30, 30));if (dy < 0) sprite.setTextureRect(IntRect(0, 64, 30, 30));if (dy > 0) sprite.setTextureRect(IntRect(127, 64, 30, 30));}currentAxis = 0;dx = 0;dy = 0;}void Collision(int axis){for (int i = rect.top / 30; i < (rect.top + rect.height) / 30; i++)for (int j = rect.left / 30; j < (rect.left + rect.width) / 30; j++){speed = 1;if (TileMap[i][j] == 'G'){speed = 0.75;}if ((TileMap[i][j] == 'B') || (TileMap[i][j] == '0')){if (axis == 0){if (dx > 0) rect.left = j * 30 - rect.width;if (dx < 0) rect.left = j * 30 + 30;}if (axis == 1){if (dy > 0) rect.top = i * 30 - rect.height;if (dy < 0) rect.top = i * 30 + 30;}}}}void setCurrentAxis(int axis){currentAxis = axis;}int getCurrentAxis(){return currentAxis;}~Player(){}};скорость не изменяется скорее всего потому, что ты её опять делаешь единицой. перенеси speed=1 вне тело цикла for и вобще из collision ф-ции убери
Скорость изменяется, но только если правый нижний угол танка находится на “траве”
Проблему решил сместив изменение скорости в другой метод
C++1234567891011void Physics(){int i = (rect.top + 15) / 30;int j = (rect.left + 15) / 30;if (TileMap[i][j] == 'G'){speed = 0.75;}elsespeed = 1;} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.