/////////////////////////Клас Игрока(Террорист и Коп)////////////////////////////////////////////// class Player { public: float x,y, w, h, dx, dy, speed; // координаты + высота и ширина,скорость премещения int dir,health; //переменная направления движения,очки игроков,жизнь bool life;//логическая переменная жизни String File_Angel,File_Demon; //вводим файл с расширением Image image_Angel, image_Demon;//вводим сфмл изображиние Texture texture_Angel, texture_Demon;//сфмл текстура Sprite sprite_Angel, sprite_Demon;//сфмл спрайт Player(String F, float X, float Y, float W, float H)//конструктор с параметрами передаваемые игроку для класса { dir = 0, speed = 0, health = 100; File_Angel = F;//имя файла+расширение для террориста File_Demon = F;//имя файла+расширение для копа w = W; h = H;//высота и ширина image_Angel.loadFromFile("images/" + File_Angel);//запихиваем в image наше изображение image_Demon.loadFromFile("images/" + File_Demon); texture_Angel.loadFromImage(image_Angel);//закидываем изображение в текстуру texture_Demon.loadFromImage(image_Demon); sprite_Angel.setTexture(texture_Angel);//заливаем спрайт текстурой sprite_Demon.setTexture(texture_Demon); x = X; y = Y;//координата появления спрайта sprite_Angel.setTextureRect(IntRect(0, 0, w, h)); //Задаем спрайту один прямоугольник для вывода одного ангела и демона,а не кучи. IntRect - приведение типов sprite_Demon.setTextureRect(IntRect(0, 0,w, h)); } void update(float time) //функция "оживления" объекта класса. update - обновление. принимает в себя время SFML , вследствие чего работает бесконечно, давая персонажу движение. { 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;//зануляем скорость, чтобы персонаж остановился. sprite_Angel.setPosition(x, y); //выводим спрайт в позицию x y , посередине. бесконечно выводим в этой функции, иначе бы наш спрайт стоял на месте. sprite_Demon.setPosition(x, y); interactionWithMap(); if (health <= 0){ life = false; } //умирает } void interactionWithMap()//ф-ция взаимодействия с картой { for (int i = y / 32; i < (y + h) / 32; i++)//проходимся по тайликам, контактирующим с игроком,, то есть по всем квадратикам размера 32*32. for (int j = x / 32; j<(x + w) / 32; j++)//икс делим на 32, тем самым получаем левый квадратик, с которым персонаж соприкасается. { if (TileMap[i][j] == '0' || TileMap[i][j] == 'b')//если наш квадратик соответствует символу 0 (стена), то проверяем "направление скорости" персонажа: { if (dy>0)//если мы шли вниз, { y = i * 32 - h;//то стопорим координату игрек персонажа. сначала получаем координату нашего квадратика на карте(стены) и затем вычитаем из высоты спрайта персонажа. } if (dy<0) { y = i * 32 + 32;//аналогично с ходьбой вверх. dy<0, значит мы идем вверх (вспоминаем координаты паинта) } if (dx>0) { x = j * 32 - w;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа } if (dx < 0) { x = j * 32 + 32;//аналогично идем влево } } if (TileMap[i][j] == 's') { health -= 50; TileMap[i][j] = ' '; } if (TileMap[i][j] == 'h') { health += 10; TileMap[i][j] = ' '; } } } }; int main() { Font font;//шрифт font.loadFromFile("CyrilicOld.TTF");//передаём фаил шрифта Text text("", font, 30); text.setColor(Color::White); text.setStyle(sf::Text::Bold); Clock clock; //создаём переменную времяни,привязка ко времени.....не привязана к мощности и т.п процессора float CurrentFrame = 0; //хранит текущий кадр RenderWindow window(sf::VideoMode(1300,700), "CS:1.0"); //задаём размер окна Player A("ter.png", 50, 50, 42, 57); Player D("counter.png", 1150, 550, 29, 55); Image map_image; map_image.loadFromFile("images/map.png"); Texture map; map.loadFromImage(map_image); Sprite s_map; s_map.setTexture(map); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } float time = clock.getElapsedTime().asMicroseconds(); // дать прошедшее время в микросекундах clock.restart(); // перезагружает время time = time / 800; // скорость игры if (A.life) { if (Keyboard::isKeyPressed(Keyboard::A)) //задаём перемещение террориста влево { A.dir = 1; A.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; A.sprite_Angel.setTextureRect(IntRect(115, 57 * int(CurrentFrame), 39, 57)); } if (Keyboard::isKeyPressed(Keyboard::D)) //задаём перемещение террориста вправо { A.dir = 0; A.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; A.sprite_Angel.setTextureRect(IntRect(79, 57 * int(CurrentFrame), 39, 57)); } if (Keyboard::isKeyPressed(Keyboard::W)) //задаём перемещение террориста вверх { A.dir = 3; A.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; A.sprite_Angel.setTextureRect(IntRect(39, 57 * int(CurrentFrame), 39, 57)); } if (Keyboard::isKeyPressed(Keyboard::S)) //задаём перемещение террориста вниз { A.dir = 2; A.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; A.sprite_Angel.setTextureRect(IntRect(0, 57 * int(CurrentFrame), 39, 57)); } } if (D.life){ if (Keyboard::isKeyPressed(Keyboard::Left)) //задаём перемещение копа влево { D.dir = 1; D.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; D.sprite_Demon.setTextureRect(IntRect(93, 55 * int(CurrentFrame), 29, 55)); } if (Keyboard::isKeyPressed(Keyboard::Right)) //задаём перемещение копа вправо { D.dir = 0; D.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; D.sprite_Demon.setTextureRect(IntRect(59, 55 * int(CurrentFrame), 32, 55)); } if (Keyboard::isKeyPressed(Keyboard::Up)) //задаём перемещение копа вверх { D.dir = 3; D.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; D.sprite_Demon.setTextureRect(IntRect(29, 55 * int(CurrentFrame), 29, 55)); } if (Keyboard::isKeyPressed(Keyboard::Down)) //задаём перемещение копа вниз { D.dir = 2; D.speed = 0.1; CurrentFrame += 0.005*time; if (CurrentFrame > 3) CurrentFrame -= 3; D.sprite_Demon.setTextureRect(IntRect(0, 55 * int(CurrentFrame), 29, 55)); } } std::cout << time << "\n"; //выводим время на экран A.update(time); D.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));//главная текстура,заливка карты if (TileMap[i][j] == '0') s_map.setTextureRect(IntRect(32, 0, 32, 32));//границы карты if ((TileMap[i][j] == 'h')) s_map.setTextureRect(IntRect(64, 0, 32, 32));//жизни героев if ((TileMap[i][j] == 'b')) s_map.setTextureRect(IntRect(128, 0, 32, 32));//баррикады if ((TileMap[i][j] == 's')) s_map.setTextureRect(IntRect(160, 0, 32, 32));//бомба(смерть) s_map.setPosition(j * 32, i * 32); window.draw(s_map); } std::ostringstream playerHealthString1; playerHealthString1 << A.health; text.setString("Terrorist Health:" + playerHealthString1.str()); text.setPosition(10,0); window.draw(text); window.draw(A.sprite_Angel); //выводим спрайт на экран std::ostringstream playerHealthString2; playerHealthString2 << D.health; text.setString(" Cops Health:" + playerHealthString2.str()); text.setPosition(750, 0); window.draw(text); window.draw(D.sprite_Demon); window.display(); } return 0; }