SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Движение объектов › Ответ в теме: Движение объектов
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
#include <SFML/Graphics.hpp> #include "view.h" #include <iostream> #include <sstream> #include "mission.h" #include "iostream" #include "level.h" #include <vector> #include <list> #include "TinyXML/tinyxml.h" using namespace sf; ////////////////////////////////////Общий класс-родитель////////////////////////// class Entity { public: std::vector<Object> obj;//вектор объектов карты float dx, dy, x, y, speed, moveTimer; int w, h, health; bool life, isMove; Texture texture; Sprite sprite; String name; Entity(Image &image, String Name, float X, float Y, int W, int H){ x = X; y = Y; w = W; h = H; name = Name; moveTimer = 0; speed = 0; health = 100; dx = 0; dy = 0; life = true; isMove = false; texture.loadFromImage(image); sprite.setTexture(texture); sprite.setOrigin(w / 2, h / 2); } FloatRect getRect(){//ф-ция получения прямоугольника. его коорд,размеры (шир,высот). return FloatRect(x, y, w, h);//эта ф-ция нужна для проверки столкновений } }; class Enemy :public Entity{ public: Enemy(Image &image, String Name, Level &lvl, float X, float Y, int W, int H) :Entity(image, Name, X, Y, W, H){ obj = lvl.GetObjects("solid");//инициализируем.получаем нужные объекты для взаимодействия врага с картой if (name == "EasyEnemy"){ sprite.setTextureRect(IntRect(0, 0, w, h)); //dx = 0.1; dy = 0.1; } } void checkCollisionWithMap(float Dx, float Dy) { for (int i = 0; i<obj.size(); i++)//проходимся по объектам if (getRect().intersects(obj[i].rect))//проверяем пересечение игрока с объектом { if (obj[i].name == "solid"){//если встретили препятствие (объект с именем solid) if (Dy < 0) { x = obj[i].rect.left + w; dx = -0.1; dy = 0; sprite.scale(-1, 1); } if (Dy > 0) { x = obj[i].rect.left + obj[i].rect.width; dx = 0.1; dy = 0; sprite.scale(-1, 1); } if (Dx < 0) { y = obj[i].rect.top + h; dy = -0.1; dx = 0; sprite.scale(1, -1); } if (Dx > 0) { y = obj[i].rect.top + obj[i].rect.height; dy = 0.1; dx = 0; sprite.scale(1, -1); } } } } void update(float time) { if (name == "EasyEnemy"){ //moveTimer += time;if (moveTimer>3000){ dx *= -1; moveTimer = 0; }//меняет направление примерно каждые 3 сек checkCollisionWithMap(dx, dy); y += dy*time; x += dx*time; sprite.setPosition(x + w / 2, y + h / 2); if (health <= 0){ life = false; } } } }; int main() { RenderWindow window(VideoMode(1280, 700), "Lesson 22. kychka-pc.ru"); view.reset(FloatRect(0, 0, 1280, 700)); Level lvl;//создали экземпляр класса уровень lvl.LoadFromFile("map.tmx");//загрузили в него карту, внутри класса с помощью методов он ее обработает. Image easyEnemyImage; easyEnemyImage.loadFromFile("B1.png"); easyEnemyImage.createMaskFromColor(Color(255, 0, 0)); Object easyEnemyObject = lvl.GetObject("easyEnemy");//объект легкого врага на нашей карте.задаем координаты игроку в начале при помощи него Enemy easyEnemy(easyEnemyImage, "EasyEnemy", lvl, easyEnemyObject.rect.left, easyEnemyObject.rect.top, 32, 32);//передаем координаты прямоугольника easyEnemy из карты в координаты нашего врага Clock clock; 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(); } easyEnemy.update(time); window.setView(view); window.clear(Color(77, 83, 140)); lvl.Draw(window);//рисуем новую карту window.draw(easyEnemy.sprite); window.display(); } return 0; } |