SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Создание игры "Уголки"
В этой теме 49 ответов, 3 участника, последнее обновление Павел Букреев 8 года/лет, 5 мес. назад.
-
АвторСообщения
-
std::list<T>, std::vector<T>…
использовать цикл for i=0, … , 12
где element[i].sprite.setPosition(x,y); // как то такесли у меня белые это объект w класса Player, а черные объект b класса Player, то тогда для расстановки, element[i].w.sprite.setposition(x,y)?
почему спрайт не перемещается, ведь когда я его пробовал перемещать как в 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;
}так где может быть ошибка, а?
фиг знает, код не подсвечивается, не видно что к чему))
он перетаскивает только в том случае, если я не указываю начальные координаты в int main и ее координаты получаются (0,0), но если мне стоит изменить их в int main,он показывается что ее координаты (0,0) , но на самом деле шашка стоит (120,60) и все она не двигается после этого, где надо правильно указывать координаты шашек, чтоб они еще и двигались?
кстати если убрать void update(float time), то передвижения тоже нет!
C++1if (i == 2 & j == 6) p.sprite.setPosition(310, 70);//это что?забей, это я убрал. я понял что указание позиции он там рисует(я оставил <span class=”crayon-v”>p</span><span class=”crayon-sy”>.</span><span class=”crayon-v”>sprite</span><span class=”crayon-sy”>.</span><span class=”crayon-e”>setPosition</span><span class=”crayon-sy”>(</span><span class=”crayon-cn”>310</span><span class=”crayon-sy”>,</span> <span class=”crayon-cn”>70</span><span class=”crayon-sy”>)</span><span class=”crayon-sy”>;)</span>, но почему-то я все равно он не перерисовывается на новом месте(расчеты идут и есть координаты новой позиции, но стоит)
ох, что то с подсветкой кода. как ты вставлял код?
то что никуда не едет надо смотреть в сторону движения x+=, y+=
вот весь проект, вот именно что они меняют, а шашка не двигается
здесь находятся картинки и сам код программы
Вложения:
You must be logged in to view attached files.вечером гляну
https://yadi.sk/d/l9_yQIZ5kbXTy здесь полная сборка программы
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.