SaveText.Ru

Без имени
  1. #include <SFML/Graphics.hpp>
  2. //#include "map.h"
  3. #include "view.h"
  4. #include <iostream>
  5. #include <sstream>
  6. #include "mission.h"
  7. #include "iostream"
  8. #include "level.h"
  9. #include <vector>
  10. #include <list>
  11.  
  12. #include "tinyxml2.h"
  13.  
  14. using namespace sf;
  15. ////////////////////////////////////Общий класс-родитель//////////////////////////
  16. class Entity {
  17. public:
  18.         std::vector<Object> obj;//вектор объектов карты
  19.         float dx, dy, x, y, speed,moveTimer;
  20.         int w,h,health;
  21.         bool life, isMove, onGround;
  22.         Texture texture;
  23.         Sprite sprite;
  24.         String name;
  25.         Entity(Image &image, String Name, float X, float Y, int W, int H)
  26.         {
  27.                 x = X; y = Y; w = W; h = H; name = Name; moveTimer = 0;
  28.                 speed = 0; health = 100; dx = 0; dy = 0;
  29.                 life = true; onGround = false; isMove = false;
  30.                 texture.loadFromImage(image);
  31.                 sprite.setTexture(texture);
  32.                 sprite.setOrigin(w / 2, h / 2);
  33.         }
  34.  
  35.         FloatRect getRect()
  36.         {//ф-ция получения прямоугольника. его коорд,размеры (шир,высот).
  37.                 return FloatRect(x, y, w, h);//эта ф-ция нужна для проверки столкновений
  38.         }
  39. };
  40. ////////////////////////////////////////////////////КЛАСС ИГРОКА////////////////////////
  41. class Player :public Entity {
  42. public:
  43.         enum { left, right, up, down, jump, stay } state;
  44.         int playerScore;
  45.  
  46.         Player(Image &image, String Name, TileMap &lev, float X, float Y, int W, int H) :Entity(image, Name, X, Y, W, H )
  47.         {
  48.                    playerScore = 0; state = stay; obj = lev.getAllObjects();//инициализируем.получаем все объекты для взаимодействия персонажа с картой
  49.                    if (name == "Player1"){
  50.                            sprite.setTextureRect(IntRect(4, 19, w, h));
  51.                    }
  52.            }
  53.  
  54.            void control()
  55.            {
  56.                    if (Keyboard::isKeyPressed)
  57.                    {
  58.                            if (Keyboard::isKeyPressed(Keyboard::Left))
  59.                            {
  60.                                    state = left; speed = 0.1;
  61.                            }
  62.                            if (Keyboard::isKeyPressed(Keyboard::Right))
  63.                            {
  64.                                    state = right; speed = 0.1;
  65.                            }
  66.  
  67.                            if ((Keyboard::isKeyPressed(Keyboard::Up)) && (onGround))
  68.                            {
  69.                                    state = jump; dy = -0.6; onGround = false;
  70.                            }
  71.  
  72.                            if (Keyboard::isKeyPressed(Keyboard::Down))
  73.                            {
  74.                                    state = down;
  75.                            }
  76.                    }
  77.            }
  78.  
  79.            
  80.  
  81.            void checkCollisionWithMap(float Dx, float Dy)
  82.            {
  83.  
  84.                    for (int i = 0; i<obj.size(); i++)//проходимся по объектам
  85.                    if (getRect().intersects(obj[i].rect))//проверяем пересечение игрока с объектом
  86.                    {
  87.                            if (obj[i].name == "solid")//если встретили препятствие
  88.                            {
  89.                                    if (Dy>0)    { y = obj[i].rect.top - h;  dy = 0; onGround = true; }
  90.                                    if (Dy<0)    { y = obj[i].rect.top + obj[i].rect.height;   dy = 0; }
  91.                                    if (Dx>0)    { x = obj[i].rect.left - w; }
  92.                                    if (Dx<0)    { x = obj[i].rect.left + obj[i].rect.width; }
  93.                            }
  94.                    }
  95.            }
  96.            
  97.            void update(float time)
  98.            {
  99.                    control();
  100.                    switch (state)
  101.                    {
  102.                    case right:dx = speed; break;
  103.                    case left:dx = -speed; break;
  104.                    case up: break;
  105.                    case down: dx = 0; break;
  106.                    case stay: break;
  107.                    }
  108.                    x += dx*time;
  109.                    checkCollisionWithMap(dx, 0);
  110.                    y += dy*time;
  111.                    checkCollisionWithMap(0, dy);
  112.                    sprite.setPosition(x + w / 2, y + h / 2);
  113.                    if (health <= 0){ life = false; }
  114.                    if (!isMove){ speed = 0; }
  115.                    setPlayerCoordinateForView(x, y);
  116.                    if (life) { setPlayerCoordinateForView(x, y); }
  117.                    dy = dy + 0.0015*time;
  118.            }
  119. };
  120.  
  121.  
  122.  
  123. class Enemy :public Entity{
  124. public:
  125.         Enemy(Image &image, String Name, TileMap &lvl, float X, float Y, int W, int H) :Entity(image, Name, X, Y, W, H){
  126.                 obj = lvl.getObjectsByName("solid");//инициализируем.получаем нужные объекты для взаимодействия врага с картой
  127.                 if (name == "EasyEnemy"){
  128.                         sprite.setTextureRect(IntRect(0, 0, w, h));
  129.                         dx = 0.1;
  130.                 }
  131.         }
  132.  
  133.         void checkCollisionWithMap(float Dx, float Dy)
  134.         {
  135.  
  136.                 for (int i = 0; i<obj.size(); i++)//проходимся по объектам
  137.                 if (getRect().intersects(obj[i].rect))//проверяем пересечение игрока с объектом
  138.                 {
  139.                         //if (obj[i].name == "solid"){//если встретили препятствие (объект с именем solid)
  140.                                 if (Dy>0)       { y = obj[i].rect.top - h;  dy = 0; onGround = true; }
  141.                                 if (Dy<0)       { y = obj[i].rect.top + obj[i].rect.height;   dy = 0; }
  142.                                 if (Dx>0)       { x = obj[i].rect.left - w;  dx = -0.1; sprite.scale(-1, 1); }
  143.                                 if (Dx<0)       { x = obj[i].rect.left + obj[i].rect.width; dx = 0.1; sprite.scale(-1, 1); }
  144.                         //}
  145.                 }
  146.         }
  147.  
  148.         void update(float time)
  149.         {
  150.                 if (name == "EasyEnemy"){
  151.                         //moveTimer += time;if (moveTimer>3000){ dx *= -1; moveTimer = 0; }//меняет направление примерно каждые 3 сек
  152.                         checkCollisionWithMap(dx, 0);
  153.                         x += dx*time;
  154.                         sprite.setPosition(x + w / 2, y + h / 2);
  155.                         if (health <= 0){ life = false; }
  156.                 }
  157.         }
  158. };
  159.  
  160. int main()
  161. {
  162.         RenderWindow window(VideoMode(640, 480), "window");
  163.         view.reset(FloatRect(0, 0, 640, 480));
  164.  
  165.         TileMap lvl;//создали экземпляр класса уровень
  166.         lvl.load("D:/Users/Public/source/repos/test 2/x64/Release/map/NewTile.tmx");//загрузили в него карту, внутри класса с помощью методов он ее обработает.
  167.  
  168.         Image heroImage;
  169.         heroImage.loadFromFile("D:/Users/Public/source/repos/test 2/x64/Release/textures/MilesTailsPrower.gif");
  170.  
  171.         Image easyEnemyImage;
  172.         easyEnemyImage.loadFromFile("images/shamaich.png");
  173.         easyEnemyImage.createMaskFromColor(Color(255, 0, 0));
  174.  
  175.         Object player=lvl.getObject("player");//объект игрока на нашей карте.задаем координаты игроку в начале при помощи него
  176.         Object easyEnemyObject = lvl.getObject("easyEnemy");//объект легкого врага на нашей карте.задаем координаты игроку в начале при помощи него
  177.  
  178.         Player p(heroImage, "Player1", lvl, player.rect.left, player.rect.top, 40, 30);//передаем координаты прямоугольника player из карты в координаты нашего игрока
  179.         Enemy easyEnemy(easyEnemyImage, "EasyEnemy", lvl, easyEnemyObject.rect.left, easyEnemyObject.rect.top, 200, 97);//передаем координаты прямоугольника easyEnemy из карты в координаты нашего врага
  180.        
  181.         Clock clock;
  182.         while (window.isOpen())
  183.         {
  184.  
  185.                 float time = clock.getElapsedTime().asMicroseconds();
  186.  
  187.                 clock.restart();
  188.                 time = time / 800;
  189.                
  190.                 Event event;
  191.                 while (window.pollEvent(event))
  192.                 {
  193.                         if (event.type == sf::Event::Closed)
  194.                                 window.close(); 
  195.                 }              
  196.                 p.update(time);
  197.                 easyEnemy.update(time);
  198.                 window.setView(view);
  199.                 window.clear(Color(77,83,140));
  200.                 window.draw(lvl);//рисуем новую карту
  201.  
  202.                 window.draw(easyEnemy.sprite);
  203.                 window.draw(p.sprite);
  204.                 window.display();
  205.         }
  206.         return 0;
  207. }

Share with your friends:

Print