Ответ в теме: Создание игры "Уголки"

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics Создание игры "Уголки" Ответ в теме: Создание игры "Уголки"

#2217

CapitanRex19
Участник
Сообщений:28

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

Репутация:0

почему спрайт не перемещается, ведь когда я его пробовал перемещать как в 17 уроке все работало, а как по 18 не перемещается, а просто выводит “приехали”

 

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

using namespace sf;

class Player { // класс Игрока
public:
float dx,dy,x, y, w, h, d,speed; //координаты игрока х и у, высота ширина
int dir;
bool isMove, isSelect;//добавили переменные состояния движения и выбора объекта
String File; //файл с расширением
Image image;//сфмл изображение
Texture texture;//сфмл текстура
Sprite sprite;//сфмл спрайт

Player(String F, float X, float Y, float W, float H) { //Конструктор с параметрами(формальными) для класса Player. При создании объекта класса мы будем задавать имя файла, координату Х и У, ширину и высоту
isMove = false; isSelect = false;
dir = 0, speed = 0,dx=0,dy=0;
File = F;//имя файла+расширение
w = W; h = H;//высота и ширина
image.loadFromFile(“images/” + File);//запихиваем в image наше изображение вместо File мы передадим то, что пропишем при создании объекта. В нашем случае “hero.png” и получится запись идентичная image.loadFromFile(“images/hero/png”);
image.createMaskFromColor(Color(136, 102, 64));
texture.loadFromImage(image);//закидываем наше изображение в текстуру
sprite.setTexture(texture);//заливаем спрайт текстурой
x = X; y = Y;//координата появления спрайта
sprite.setTextureRect(IntRect(0, 0, w, h)); //Задаем спрайту один прямоугольник для вывода одного льва, а не кучи львов сразу. IntRect – приведение типов

}

void update(float time)
{
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;
if (!isMove) speed = 0;
sprite.setPosition(x, y);
}
};

int main()
{
RenderWindow window(VideoMode(600, 600), “Game Corner”);

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

Player p(“white_checker.png”, 0, 0, 39.0, 39.0);//создаем объект p класса player,задаем “hero.png” как имя файла+расширение, далее координата Х,У, ширина, высота.

Player b(“black_checker.png”, 0, 0, 39.0, 39.0);//создаем объект p класса player,задаем “hero.png” как имя файла+расширение, далее координата Х,У, ширина, высота.

b.sprite.setPosition(57, 79);
p.sprite.setPosition(4, 6);

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

float dX = 0;//корректировка нажатия по х
float dY = 0;//по у
int tempX = 0;//временная коорд Х.Снимаем ее после нажатия прав клав мыши
int tempY = 0;//коорд Y
float distance = 0;//это расстояние от объекта до тыка курсора

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

clock.restart();
time = time / 800;

Vector2i pixelPos = Mouse::getPosition(window);//забираем коорд курсора
Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();

if (event.type == Event::MouseButtonPressed)//если нажата клавиша мыши
if (event.key.code == Mouse::Left) {//а именно левая
if (p.sprite.getGlobalBounds().contains(pixelPos.x, pixelPos.y))//и при этом координата курсора попадает в спрайт
{
p.sprite.setColor(Color::Green);//красим спрайт в зеленый,тем самым говоря игроку,что он выбрал персонажа и может сделать ход
p.isSelect = true;
}
}
if (p.isSelect)//если выбрали объект
if (event.type == Event::MouseButtonPressed)//если нажата клавиша мыши
if (event.key.code == Mouse::Right) {//а именно правая
p.isMove = true;//то начинаем движение
p.isSelect = false;//объект уже не выбран
p.sprite.setColor(Color::White);//возвращаем обычный цвет спрайту
tempX = pixelPos.x;//забираем координату нажатия курсора Х
tempY = pixelPos.y;//и Y

}
}
if (p.isMove) {
distance = sqrt((tempX – p.x)*(tempX – p.x) + (tempY – p.y)*(tempY – p.y));//считаем дистанцию (расстояние от точки А до точки Б). используя формулу длины вектора

if (distance > 2) {//этим условием убираем дергание во время конечной позиции спрайта

p.x += 0.1*time*(tempX – p.x) / distance;//идем по иксу с помощью вектора нормали
p.y += 0.1*time*(tempY – p.y) / distance;//идем по игреку так же
}
else { p.isMove = false; std::cout << “priehali\n”; }//говорим что уже никуда не идем и выводим веселое сообщение в консоль
}

p.update(time);
window.clear();

/////////////////////////////Рисуем карту/////////////////////
for (int i = 0; i < HEIGHT_MAP; i++)
for (int j = 0; j < WIDTH_MAP; j++)
{
if (TileMap[i][j] ==’F’) s_map.setTextureRect(IntRect(458, 159, 60, 60));

if (TileMap[i][j] == ‘1’) s_map.setTextureRect(IntRect(458, 159, 60, 60)); //если встретили символ пробел, то рисуем 1й квадратик
if (TileMap[i][j] == ‘0’) s_map.setTextureRect(IntRect(347, 159, 60, 60));//если встретили символ s, то рисуем 2й квадратик

if (i == 2 & j == 6) p.sprite.setPosition(310, 70);

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

window.draw(s_map);//рисуем квадратики на экран

}
window.draw(p.sprite);
window.draw(b.sprite);
window.display();
}

return 0;
}