Созданные ответы форума
-
АвторСообщения
-
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366#include <SFML\Graphics.hpp>#include <list>#include <math.h>#include <sstream>#include <iostream>class Block {public:float x, y;sf::String File, name;sf::Image image;sf::Texture texture;sf::Sprite sprite;int Value;Block(sf::String F, float X, float Y, sf::String Name, int value) {name = Name;File = F;image.loadFromFile(File);texture.loadFromImage(image);sprite.setTexture(texture);x = X; y = Y;Value = value;sprite.setPosition(x, y);}};class TextOut {public:float x, y, timeStart, time;sf::Color color;sf::String TextString;sf::Font font;sf::Text text;TextOut(float X, float Y, sf::String TextStrinG, sf::Font Font, sf::Color Color, float TimeStart){sf::Text Text(TextStrinG, font, 12);x = X, y = Y, TextString = TextStrinG, font = Font, color = Color, timeStart = TimeStart;text = Text;text.setPosition(x, y);text.setColor(color);timeStart = TimeStart;}void update(sf::RenderWindow &window, float time){if (timeStart >= 0){//x += 0.04; смещение//y -= 0.04; смещениеtext.setPosition(x, y);//text.setOrigin(x / 2, y / 2);window.draw(text);//timeStart -= time; (удаление когда время = 0)//std::cout << time << std::endl;}}};bool checkFree(float x, float y, std::list<Block*> entities){bool free = true;std::list<Block*>::iterator it;if ((x < 0) || (x>400) || (y < 0) || (y>400)){return false;}for (it = entities.begin(); it != entities.end(); it++){if (((*it)->x == x) && ((*it)->y == y))free = false;}return free;}bool find_path(std::list<Block*> &entities){bool free = false;int W = 400;int H = 400;int StartX, StartY;int FinishX, FinishY;bool findPath = false;float counts=0;float countsPathList = 0;std::list<Block*>::iterator it;std::list<Block*>::iterator itPath;for (it = entities.begin(); it != entities.end(); it++){if ((*it)->name == "start"){StartX = (*it)->x;StartY = (*it)->y;}if ((*it)->name == "finish"){FinishX = (*it)->x;FinishY = (*it)->y;}}if ((FinishX != 0) && (StartX != 0)){float itDistance = 1000;float Distance = 1;while (!findPath){for (it = entities.begin(); it != entities.end(); it++){counts += 1;if (findPath) break;if ((*it)->Value == itDistance){float UpX = (*it)->x;float UpY = (*it)->y - 20;free = checkFree(UpX, UpY, entities);if (free){entities.push_back(new Block("path.png", UpX, UpY, "path", Distance));}//Rightfloat RigthX = (*it)->x+20;float RigthY = (*it)->y;free = checkFree(RigthX, RigthY, entities);if (free){entities.push_back(new Block("path.png", RigthX, RigthY, "path", Distance));}//Leftfloat LeftX = (*it)->x-20;float LeftY = (*it)->y;free = checkFree(LeftX, LeftY, entities);if (free){entities.push_back(new Block("path.png", LeftX, LeftY, "path", Distance));}//Downfloat DownX = (*it)->x;float DownY = (*it)->y + 20;free = checkFree(DownX, DownY, entities);if (free){entities.push_back(new Block("path.png", DownX, DownY, "path", Distance));}if ( ( (UpX == FinishX) && (UpY == FinishY) ) || ((RigthX == FinishX) && (RigthY == FinishY)) || ((LeftX == FinishX) && (LeftY == FinishY)) || ((DownX == FinishX) && (DownY == FinishY))){findPath = true;for (itPath = entities.begin(); itPath != entities.end(); itPath++){if ((*itPath)->name == "finish"){(*itPath)->Value = Distance;}}}}}itDistance = Distance;Distance++;std::cout << "main:" << counts << std::endl;std::cout << "PathList" << countsPathList << std::endl;}}float Distance = 0;float Dx = 0;float Dy = 0;for (itPath = entities.begin(); itPath != entities.end(); itPath++){if ((*itPath)->name == "finish"){Dx = (*itPath)->x;Dy = (*itPath)->y;Distance = (*itPath)->Value;}}while (Distance != 0){Distance--;for (itPath = entities.begin(); itPath != entities.end(); itPath++){if (((*itPath)->Value == Distance)){float itX = (*itPath)->x;float itY = (*itPath)->y;float range = sqrt((itX - Dx) * (itX - Dx) + (itY - Dy) * (itY - Dy));if (range == 20){Dx = itX;Dy = itY;(*itPath)->name = "GoodPath";break;}}}}return findPath;};int main(){sf::RenderWindow window(sf::VideoMode(400, 400), "Path finder1");sf::Image image;image.loadFromFile("map.png");sf::Texture texture;texture.loadFromImage(image);sf::Sprite map;map.setTexture(texture);bool free = false;bool start = false;bool finish = false;//timefloat time = 0;sf::Clock clock;//textOutsf::Font font;font.loadFromFile("CyrilicOld.ttf");sf::Text text("500", font, 8);text.setColor(sf::Color::Red);text.setPosition(100, 100);//std::list<Block*> entities;//создаю список, сюда буду кидать объекты.например врагов.std::list<Block*>::iterator it;//итератор чтобы проходить по эл-там спискаstd::list<TextOut*> ListTextOut;std::list<TextOut*>::iterator itTextOut;int x = 0;int y = 0;int count = 0;bool findPath = false;while (window.isOpen()){//timetime = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 1000;window.clear();sf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}sf::Vector2i localPosition = sf::Mouse::getPosition(window);if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {x = 20 * (int(localPosition.x) / 20);y = 20 * (int(localPosition.y) / 20);free = checkFree(x, y, entities);if (free){entities.push_back(new Block("hero.png", x, y, "start", 1000));}start = true;}if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) {x = 20 * (int(localPosition.x) / 20);y = 20 * (int(localPosition.y) / 20);free = checkFree(x, y, entities);if (free){entities.push_back(new Block("block.png", x, y, "block", 999));}}if (sf::Mouse::isButtonPressed(sf::Mouse::Middle)) {x = 20 * (int(localPosition.x) / 20);y = 20 * (int(localPosition.y) / 20);free = checkFree(x, y, entities);if (free){entities.push_back(new Block("finish.png", x, y, "finish", 1001));}finish = true;}if ((finish == true) && (start == true) && (findPath == false)){findPath = find_path(entities);}window.draw(map);for (it = entities.begin(); it != entities.end(); it++){window.draw((*it)->sprite);}count = 0;for (it = entities.begin(); it != entities.end(); it++){count += 1;}for (it = entities.begin(); it != entities.end(); it++){if (((*it)->Value < 999) && ((*it)->name != "GoodPath"))ListTextOut.push_back(new TextOut((*it)->x, (*it)->y, std::to_string((*it)->Value), font, sf::Color::Blue, 1 * 1000));elseif ((*it)->Value < 999)ListTextOut.push_back(new TextOut((*it)->x, (*it)->y, std::to_string((*it)->Value), font, sf::Color::Cyan, 1 * 1000));}for (itTextOut = ListTextOut.begin(); itTextOut != ListTextOut.end();){TextOut *b = *itTextOut;b->update(window, time);itTextOut++;}window.display();}return 0;}
Обновлённая версия с выводом пути в цвете.
Я так понимаю что с поиском пути как таковым никто не сталкивался. Потому как никто не выложил рабочий код.
Тогда предлагаю вот что. Общими усилиями создать такой код для SFML.
Описание: Википедия Алгоритм ЛИ
Хотелось бы для начала осилить хотябы ортогональный поиск пути. То есть “в окрестности фон Неймана соседними ячейками считаются только 4 ячейки по вертикали и горизонтали”
Во вложении Слева поиск пути A* а справа Волновой алгоритм.
Вложения:
You must be logged in to view attached files.)))Визуального представления полно в инете. И между прочим на картинке что ты скинул не очень хороший поиск пути.
Вот ежели бы ты код скинул. Рабочий для SFML и С++ тогда другое дело.
Не) тут сложнее всё. В общем судя по всему придётся использовать волновой алгоритм поиска пути А* a-star.
Пока что ещё не знаю как его делать. Но будем посмотреть))
Красивые менюшки делаешь)))
Создание РПГ зависло. И вот почему.
С виду создание простенькой рпг дело плёвое. Подумаешь персонаж ходит и мочит мобов, получает опыт, лвл апы, у него есть разные…стоп стоп стоп…это всё нужно Делать!!!)))) и чем больше будет этих персонаж то персонаж это, тем больше придётся делать.
Я начал делать с того что есть персонаж с анимацией в 8 сторон, анимация удара..опять стоп)))
Я начал с идеи последовательности. Сначала делать одно, потом добавлять второе , потом третье и уже на шаге добавления врагов я завис.
Дело в том что я не продумал как я буду делать игру. Есть столкновение Игрока с врагом. И я хотел прикрутить тудаже обработку атаки. Если столкновение то обрабатывать атаку. Но в итого я сломал столкновение и не сделал атаку)))))
Пожалуй стоит начать с более маленьких проектов))))
https://habrahabr.ru/post/160547/
всё равно не получается.
Опишу ситуацию подробнее)) может кто ответит.
Скачал Visual studio 15. Версия разрядности компа 64бит.
Скачал два SFML. Visual C++ 14 (2015) – 32-bit и Visual C++ 14 (2015) – 64-bit
В настройках проекта – как показано в уроке по подключению SFML к Visual Studio,
прописал все настройки. Для Debug и Release 32 bit поставил путь к lib и include к 32 битной SFML версии.
Для 64 bit Debug и Releaes поставил путь к lib и include 64 битой версии sfml.
Для 64 и 32 битной версии пишу smfl-system-d.lib, sfml-window-d.lib,sfml-graphics-d.lib, sfml-audio-d.lib;
Далее нажимаю Проект – Пересобрать решение. Мне пишет в какое место собрался exe. Я захожу туда. Запускаю exe и он уменя запускается. и 32 битная версия и 64 битная версия.
Далее я перекидываю папку release на другой компьютер где стоит 32 битная версия винды.
А там пишет “программа не может быть запущена”.
Скидываю другу 64 разрядную версию. И требует dll Разные. На 3-ьей dll мы бросили скачивать dll)
Проекты которые выкладывают на форуме запускаются и у друга и у меня без всяких дополнительных файлов. Я даже скидывал те dll что и в скачанном проекте с форума, себе в папку, но всё равно не запускается.
Скачивал Visual studio 2013. Там ошибка sml-system-d-2.lib. Как я понял на Window render вылазит она.
3) Как то не осилю. Дело в том что код данный на уроках он работает слишком плохо со столкновениями. Переделывать его, это менять много кода)) для меня как новичка. А потом опять менять назад чтобы продолжить уроки.
Тут лучше бы делать Задания домашние такие чтобы либо менять мало кода. Либо так чтобы остальная часть кода уже работала.
То есть делать некую надстройку.
К примеру у нас есть некие блоки кода А для вывода спрайтов, Б для столкновений и в домашнем задании должна фигурировать некая третья часть С. Которая не будет менять код А и Б. )))))))
2)
C++12345678910111213141516171819202122232425float dist = 0;for (it = entities.begin(); it != entities.end(); it++){dist = p.x - (*it)->x;if (dist < 0) dist *= -1;if ((dist < 200) && (p.y - (*it)->y < 200)) {if (p.x < (*it)->dx) {(*it)->dx = 0.2;text.setString("AAAAAAH!!");text.setPosition((*it)->x+30, 720);}else{(*it)->dx = -0.2;text.setString("AAAAAAH!!");text.setPosition((*it)->x+30, 720);}}if ((dist >= 200) && (p.y - (*it)->y < 200)){text.setPosition(p.x, 720);cout << "dist:" << dist << "\n";cout << "p.y - it.y:" << p.y - (*it)->y << "\n";}}Сделал для одного врага который у меня на том же уровне по x что и игрок.
Там есть возможность только подписаться на тебя)))
vk.com/sinsinmin
Мой вк
Heisenberg, а можно глянуть твой проект где у тебя что то с рыбой связано?. Название подключаемых модулей fish как то так…
ДЗ после уроков позволяют попрактиковаться самому, получить ошибки и опыт. Поразмыслить самому.
Поэтому ДЗ после уроков очень хороши. Мне пришлось искать дополнительную инфу по SFML.
Да формулы могут пригодиться. Сохранил себе ссылку)
А чего заглохла тема то?)Есть желание сделать некую Рпг, может двоём будет делать веселее))
-
АвторСообщения