spais
Гл. Модератор
- Регистрация
- 4 Июн 2018
- Сообщения
- 37
- Реакции
- 102
Итак, SFML мы установили. И что же с ним делать?
(для работы программы надо из папки SFML-2.5.0\bin перетащить файлы
)
Этот код создает окно.
Но зачем нам простое окно? Мы же не для этого устанавливали 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;
}
Последнее редактирование модератором: