[C++] Работа с SFML(Graphics.hpp)

spais

Регистрация
4 Июн 2018
Сообщения
37
Реакции
102
Итак, SFML мы установили. И что же с ним делать?
(для работы программы надо из папки SFML-2.5.0\bin перетащить файлы
Код:
openal32.dll
sfml-audio-d-2.dll
sfml-window-d-2.dll
sfml-graphics-d-2.dll
sfml-system-d-2.dll
)

Этот код создает окно.
C++:
#include <SFML/Graphics.hpp>
#include <Windows.h> //для WinMain

using namespace sf;// что бы не писать каждый раз sf::

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) //что бы не открывать консоль
{
    RenderWindow window(VideoMode(800, 600), "test"); //Создание окна 800 на 600 пикселей с названием "test"

    while (window.isOpen())// основной цикл, если окно отрыто то выполняется все что внутри(туда все пихать)
    {
        Event event;
        while (window.pollEvent(event))
        {
            // если событие нажали кнопку закрыть:
            if (event.type == Event::Closed)
                // закрываем окно (нихуя себе не правда ли?)
                window.close();
        }
        // очищаем экран и заливаем его белым цветом
        window.clear(Color(255, 255, 255));
     
        window.display();// выводим все на окно которое мы создали вверху
    }
    return 0;
}


Но зачем нам простое окно? Мы же не для этого устанавливали SFML, Марио ( Фаил который использовался в качестве текстур
Пожалуйста войдите или зарегистрируйтесь чтобы просматривать скрытый текст.
)

C++:
#include <SFML/Graphics.hpp>

#include <Windows.h>

using namespace sf;


float offsetX=0, offsetY=0;


const int H = 17; // ВЫсота карты
const int W = 150; // Ширина


String TileMap[H] = { // Сама карта(ее надо делать так(букафки люббые))
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"0                                                                                                                                                    0",
"0                                                                                    w                                                               0",
"0                   w                                  w                   w                                                                         0",
"0                                      w                                                                                                             0",
"0                                                                                                                                                    0",
"0                      c                                                                       w                                                     0",
"0                                                                       r                                                                            0",
"0                                                                      rr                                                                            0",
"0                                                                     rrr                                                                            0",
"0               c    kckck                                           rrrr                                                                            0",
"0                                      t0                           rrrrr                                                                            0",
"0G                                     00              t0          rrrrrr            G                                                               0",
"0           d    g       d             00              00         rrrrrrr                                                                            0",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
};




class PLAYER { // создание марио

public:

float dx,dy;// его координаты
FloatRect rect;
bool onGround; //на земле ли он
Sprite sprite;
float currentFrame; // текущий кадр(для анимации)

    PLAYER(Texture &image)
   {
    sprite.setTexture(image);
    rect = FloatRect(100,180,16,16);

    dx=dy=0.1;
    currentFrame = 0;
   }


   void update(float time)
   {

     rect.left += dx * time;
     Collision(0);


     if (!onGround) dy=dy+0.0005*time;    // физика падения
     rect.top += dy*time;
     onGround=false;
     Collision(1);
 

     currentFrame += time * 0.005;
     if (currentFrame > 3) currentFrame -= 3;


    if (dx>0) sprite.setTextureRect(IntRect(112+31*int(currentFrame),144,16,16)); // анимация при движении вправо
    if (dx<0) sprite.setTextureRect(IntRect(112+31*int(currentFrame)+16,144,-16,16)); // влево


     sprite.setPosition(rect.left - offsetX, rect.top - offsetY);
   
     dx=0;
   }


   void Collision(int num) // столкновение с блоками( те которые мы делали из букавак
{
 
    for (int i = rect.top/16 ; i<(rect.top+rect.height)/16; i++)
        for (int j = rect.left/16; j<(rect.left+rect.width)/16; j++)
             {
            // если игрок в блоке P или k или 0 или r или t то смещаем(если блок справа то влево и наоборот)
                 if ((TileMap[i][j]=='P') || (TileMap[i][j]=='k') || (TileMap[i][j]=='0') || (TileMap[i][j]=='r') || (TileMap[i][j]=='t'))
                                         {
                                                   if (dy>0 && num==1)
                                                   { rect.top =   i*16 -  rect.height;  dy=0;   onGround=true; }
                                                   if (dy<0 && num==1)
                                                   { rect.top = i*16 + 16;   dy=0;}
                                                   if (dx>0 && num==0)
                                                   { rect.left =  j*16 -  rect.width; }
                                                   if (dx<0 && num==0)
                                                   { rect.left =  j*16 +16;}
                                         }

             
             }

}

};



class ENEMY // то бегающее говно
{

public:
float dx,dy;
FloatRect rect;
Sprite sprite;
float currentFrame;
bool life;


   void set(Texture &image, int x, int y)
   {
    sprite.setTexture(image);
    rect = FloatRect(x,y,16,16);

    dx=0.05;
    currentFrame = 0;
    life=true;
   }

   void update(float time)
   {
     rect.left += dx * time;
 
     Collision();


     currentFrame += time * 0.005;
     if (currentFrame > 2) currentFrame -= 2;

    sprite.setTextureRect(IntRect(18*int(currentFrame),   0, 16,16)); // накладываем текстуры на ето говно
    if (!life) sprite.setTextureRect(IntRect(58, 0, 16,16)); // если умер то выбирается кадр где он сплющен


    sprite.setPosition(rect.left - offsetX, rect.top - offsetY);
   
   }


   void Collision() // то же самое как и с марио
  {

    for (int i = rect.top/16 ; i<(rect.top+rect.height)/16; i++)
        for (int j = rect.left/16; j<(rect.left+rect.width)/16; j++)
             if ((TileMap[i][j]=='P') || (TileMap[i][j]=='0'))
                                       {
                                                    if (dx>0)
                                                   { rect.left =  j*16 - rect.width; dx*=-1; }
                                                    else if (dx<0)
                                                   { rect.left =  j*16 + 16;  dx*=-1; }
                                         
                                        }
  }

};



int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{

    RenderWindow window(VideoMode(800, 600), "test");

    Texture tileSet;
    tileSet.loadFromFile("1.png"); // загрузка текстур

 
    PLAYER Mario(tileSet);
    ENEMY  enemy;
    enemy.set(tileSet,48*16,13*16);


    Sprite tile(tileSet);


    Clock clock; // для того что бы при любых условиях марио двигался с одинаковой скоростью вне зависимости от времени между тактами процессора

    while (window.isOpen())
    {
     
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();

        time = time/500;  // здесь регулируем скорость игры

        if (time > 20) time = 20;

        Event event;
        while (window.pollEvent(event)) // проверка закрыто ли окно
        {
            if (event.type == Event::Closed)  
                window.close();
        }


        if (Keyboard::isKeyPressed(Keyboard::Left))    Mario.dx=-0.1;
   
        if (Keyboard::isKeyPressed(Keyboard::Right))    Mario.dx=0.1;
 
        if (Keyboard::isKeyPressed(Keyboard::Up))    if (Mario.onGround) { Mario.dy=-0.27; Mario.onGround=false; }
 


         Mario.update(time);
         enemy.update(time);


         if  (Mario.rect.intersects( enemy.rect ) ) // если марио столкнулся с тем говном
         {
             if (enemy.life) {
             if (Mario.dy>0) { enemy.dx=0; Mario.dy=-0.2; enemy.life=false;}
             else window.close(); //если столкнулся то закрываем игру
             }
         }


         if (Mario.rect.left>200) offsetX = Mario.rect.left-200;           //смещение




         window.clear(Color(107,140,255)); // установка фона

         for (int i=0; i<H; i++)
             for (int j=0; j<W; j++)
              { // задаем текстуры для букавак которые мы писали в самом начале( та карта)
                if (TileMap[i][j]=='P')  tile.setTextureRect( IntRect(143-16*3,112,16,16) );

                if (TileMap[i][j]=='k')  tile.setTextureRect( IntRect(143,112,16,16) );
                                             
                   if (TileMap[i][j]=='c')  tile.setTextureRect( IntRect(143-16,112,16,16) );

                if (TileMap[i][j]=='t')  tile.setTextureRect( IntRect(0,47,32,95-47) );

                if (TileMap[i][j]=='g')  tile.setTextureRect( IntRect(0,16*9-5,3*16,16*2+5) );

                if (TileMap[i][j]=='G')  tile.setTextureRect( IntRect(145,222,222-145,255-222) );

                if (TileMap[i][j]=='d')  tile.setTextureRect( IntRect(0,106,74,127-106) );

                if (TileMap[i][j]=='w')  tile.setTextureRect( IntRect(99,224,140-99,255-224) );

                if (TileMap[i][j]=='r')  tile.setTextureRect( IntRect(143-32,112,16,16) );

                if ((TileMap[i][j]==' ') || (TileMap[i][j]=='0')) continue;

                  tile.setPosition(j*16-offsetX,i*16 - offsetY) ;
                window.draw(tile); //отрисовка карты
             }
     


        window.draw(Mario.sprite); //отрисовка марио и то говно
        window.draw(enemy.sprite);

        window.display(); // вывод на экран
    }

    return 0;
}
 
Последнее редактирование модератором:
Сверху Снизу