Ответ в теме: уроки sfml ,вопросы по урокам

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics уроки sfml ,вопросы по урокам Ответ в теме: уроки sfml ,вопросы по урокам

#2797
Alex
Alex
Участник
Сообщений:41

Зарегистрирован:
19.01.2016

Репутация:22

#include <SFML/Graphics.hpp>
#include <iostream>
#include “map.h”
#include “viev.h”

using namespace sf;//включаем пространство имен sf, чтобы постоянно не писать sf::

class Player//class igroka
{

private:float x, y;

public:

float w,h, dx,dy,speed;
int dir =0;
String File;
Image image;
Texture texture;
Sprite sprite;

Player(String F,float X,float Y,float W,float H)//конструктор
{
dx = 0;dy = 0;speed = 0;dir = 0;
File = F;
w=W,h=H;
image.loadFromFile(“imaj/” + File);
image.createMaskFromColor(Color(255,255,255));
image.createMaskFromColor(Color(41,33,59));
texture.loadFromImage(image);
sprite.setTexture(texture);
x=X,y=Y;

sprite.setTextureRect(IntRect(0, 0, w, h));
}

void ogivlenie (float time)
{
switch(dir)
{
case 0: dx = speed; dy = 0;break;
case 1: dx = -speed; dy = 0;break;
case 3: dx = 0;dy =-speed;

}
x += dx*time;
y+= dy*time;

speed =0;

sprite.setPosition(x,y);
interactionWithMap();

}

void interactionWithMap()//ф-ция взаимодействия с картой
{

for (int j = x / 32; j<(x + w) / 32; j++)
for (int i = y / 32; i < (y + h) / 32; i++)
{
if (TileMap[j][i] == ‘0’)//если наш квадратик соответствует символу 0 (стена), то проверяем “направление скорости” персонажа:
{

if (dx>0)
{
x = j * 32 ;break;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа
}
if (dx < 0)
{
x = j * 32 + 32;break;//аналогично идем влево
}
}

if (TileMap[j][i] == ‘s’) { //если символ равен ‘s’ (камень)

TileMap[j][i] = ‘ ‘;//убираем камень, типа взяли бонус. можем и не убирать, кстати.
}
}
}

float getplayercoordinateX(){ //этим методом будем забирать координату Х
return x;
}

float getplayercoordinateY(){ //этим методом будем забирать координату Y
return y;
}

};

int main()
{
RenderWindow window(sf::VideoMode(640, 480), “Marin”); //увеличили для удобства размер окна
view.reset(sf::FloatRect(0,0, 640, 480));//размер “вида” камеры при создании объекта вида камеры. (потом можем менять как хотим) Что то типа инициализации.

// карта//////////////////////////////////////
Image map_image;//объект изображения для карты
map_image.loadFromFile(“imaj/11.png”);//загружаем файл для карты
Texture map;//текстура карты
map.loadFromImage(map_image);//заряжаем текстуру картинкой
Sprite s_map;//создаём спрайт для карты
s_map.setTexture(map);//заливаем текстуру спрайтом
// //////////////////////////////////////////////////

Player p(“martin.png”,100,390,120,125);//ввод в коструктор

p.sprite.setTextureRect(IntRect(0,200, 120, 125));//начальное расположение спрайта

p.sprite.setScale(0.5, 0.5);//размер персонажа

float CurrentFrame = 0;//хранит текущий кадр

Clock clock;//переменная времени

while (window.isOpen())
{

float time = clock.getElapsedTime().asMicroseconds(); //дать прошедшее время в микросекундах
clock.restart();//перезагружает время
time = time/800; //скорость игры

sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}

/////////////////////////////Движение обекта//////////////////////////////////////

if (Keyboard::isKeyPressed(Keyboard::Right)){
p.dir = 0; p.speed = 0.3;
CurrentFrame += 0.008*time;//скорость анимации
if(CurrentFrame >6)CurrentFrame -= 6;
p.sprite.setTextureRect(IntRect(150 * int(CurrentFrame),0, 120,125));
getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY());
}
else
p.sprite.setTextureRect(IntRect(0,200, 120, 125));//начальное расположение спрайта

if (Keyboard::isKeyPressed(Keyboard::Left)){
p.dir = 1; p.speed = 0.3;
CurrentFrame += 0.008*time;
if(CurrentFrame >6)CurrentFrame -= 6;
p.sprite.setTextureRect(IntRect(150* int(CurrentFrame)+150,0, -130, 125));
getplayercoordinateforview(p.getplayercoordinateX(), p.getplayercoordinateY());
}
else if (p.dir ==1){
p.sprite.setTextureRect(IntRect(120,200, -120, 125));//начальное расположение спрайта
}

if (Keyboard::isKeyPressed(Keyboard::Up)){
p.dir = 3; p.speed = 0.3;

p.sprite.setTextureRect(IntRect(450,0, 120,125));

}

// //////////////////////////////////////////////////

p.ogivlenie(time);//оживление ввод времени

window.clear(Color(246,236,211));

// ///////////карта(печатаем карту по квадратику)////////////////////// //
for (int i = 0; i < visota; i++)
for (int j = 0; j < shirina; j++)
{
if (TileMap[i][j] == ‘ ‘) s_map.setTextureRect(IntRect(283,157, 32, 32)); //если встретили символ пробел, то рисуем 1й квадратик
if (TileMap[i][j] == ‘s’) s_map.setTextureRect(IntRect(32, 329, 32, 32));//если встретили символ s, то рисуем 2й квадратик
if ((TileMap[i][j] == ‘0’)) s_map.setTextureRect(IntRect(0, 409, 32, 32));//если встретили символ 0, то рисуем 3й квадратик

s_map.setPosition(j * 32, i * 32);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадрат

window.draw(s_map);//выводим карту

}

window.setView(view);
window.draw(p.sprite);//выводим спрайт на экран
window.display();
}

return 0;
}