SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Элементы карты (к примеру камень с урока – s)
В этой теме 16 ответов, 3 участника, последнее обновление KindRedSand 5 года/лет, 9 мес. назад.
-
АвторСообщения
-
Здравствуйте!
В общем говоря, нарисовал что-то типа графа.
Есть карта(написан как на видео, только чуть изменен):
C++12345678910111213141516171819202122232425262728293031323334#include <SFML/Graphics.hpp>using namespace sf;using namespace std;const int HEIGHT_MAP = 23;//размер карты высотаconst int WIDTH_MAP = 35;//размер карты ширинаString TileMap[HEIGHT_MAP] = {"00000000000000000000000000000000000","0 0","0 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 0","0 0","00000000000000000000000000000000000",};“v” – можно сказать что это “Вершина”.
“-” – это горизонтальное “Ребро”.
“|”- а это вертикальное “Ребро”.
(В моём случае у всех выше перечисленных элементов карты серый цвет!)
Другие элементы:
“=” – замена элементу карты “-“.
“:” – замена элементу карты “|”.
(А эти элементы в моём случае красные!).Сама суть задачи, которую я поставил.
Пользователь пишет в консольном окне:
1) Номер начальной вершины(на которой он находится).
2) Номер конечной вершины(на которую которую он хочет попасть).Теперь, я не знаю как получить координаты этих вершин и ребер, и причем нужно не только получить но еще и заменить на определенный элемент.
К примеру элемент “-” – заменить на “=”.Надеюсь хоть сейчас я внятно написал.
Вложения:
You must be logged in to view attached files.Не очень понял вопрос. Пользователь пишет номер вершины. Какой номер и откуда он его берёт? На картинке никаких номеров нет. Могу предположить, что нумерация вершин идёт слева направо и сверху вниз (что-то вроде 0 1 2 – это первй ряд, 3 4 5 – второй ряд и т. д.). Дальше, как получить координаты этих вершин и рёбер. Каких вершин и каких рёбер? Надо уточнить детали.
Вопрос и правду непонятен.
C++12if (TileMap[x][y] == '-')TileMap[x][y] = '='Ты что-то подобное хотел?
Нумерация, вершины и ребра указаны во вложенной картинке посмотрите пожалуйста.
Я специально отредактировал через Paint screenshot, чтобы вы поняли что я имею ввиду.Вложения:
You must be logged in to view attached files.Ок, с нумерацией вроде ясно. Пусть A – это двумерный массив всех вершин. Тогда каждая вершина задаётся двумя числами – номером строки i и столбца j (например, вершина A[4][2] расположена на пересечении четвёртой строки и второго столбца). Я так понимаю, нужно по индексам вершины A[i][j] узнать её координаты в массиве строк String TileMap[HEIGHT_MAP]? Тогда надо сначала узнать координаты верхнего левого угла массива вершин (то есть вершины A[1][1]) в массиве строк TileMap. Координаты верхнего левого угла определяются, когда ты рисуешь карту, то есть их можно найти вручную и потом в программе создать для них специальные переменные. Пусть эти координаты равны x и y. Другими словами, вершине A[1][1] соответствует элемент карты TileMap[x][y]. Пусть на карте TileMap соседние вершины разделены t рёбрами по горизонтали и s рёбрами по вертикали. Тогда координаты вершины A[i][j] на карте TileMap можно вычислить как
C++1TileMap[x + (s + 1) * (i - 1)][y + (t + 1) * (j - 1)]Должно быть так, если ничего не напутал.
tobidashi, а что если я скажу вам, что цифры просто текст(т.е вывел просто текст и всё)?
Просто вывел весь код проекта.
Main.cpp:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207#include <SFML/Graphics.hpp>#include "map.h"#include "view.h"#include "iostream"#include "sstream"using namespace std;using namespace sf;class Map {public:float FloatOriginX, FloatOriginY, Width, Heigth;String File;Image MapIm;Texture MapTr;Sprite MapSr;Map(String Im){MapIm.loadFromFile("images/" + Im);MapTr.loadFromImage(MapIm);MapSr.setTexture(MapTr);}};char *StreetName[5][5] ={"Oxford", "King,s Road", "Carnaby", "Baker", "Whitehall","Downing", "Floral", "Dryden", "Macklin", "Cleveland","Howland", "Chitty", "Hanson", "Hallam", "Mansfield","Duchess", "Harley", "Wimpole", "Vere", "Barrett","Duke", "Wigmore", "Baker", "George", "Aybrook"};int StreetNum[5][5] ={1, 2, 3, 4, 5,6, 7, 8, 9, 10,11, 12, 13, 14, 15,16, 17, 18, 19, 20,21, 22, 23, 24, 25};class MainText {public:Text text;MainText(const string &sText, const Font &font, unsigned int iSize, const Color &cColor,const Uint32 &uStyle, float x, float y){text.setString(sText);text.setFont(font);text.setCharacterSize(iSize);text.setFillColor(cColor);text.setStyle(uStyle);text.setPosition(Vector2f(x, y));}};int main(){RenderWindow window(VideoMode(1120, 737), "Route");view.reset(FloatRect(0, 0, 1120, 737));Map m("labels.png");Font font; font.loadFromFile("fonts/CyrilicOld.ttf");float VertexPosX[25], VertexPosY[25];int Count;Clock clock;while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 800;Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();}if (Keyboard::isKeyPressed(Keyboard::C)){Vector2i pixelPos = Mouse::getPosition(window);Vector2f pos = window.mapPixelToCoords(pixelPos);cout << pos.x << endl;cout << pos.y << endl;}ViewMap(time);window.setView(view);window.clear();for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDTH_MAP; j++){Count = 0;switch (TileMap[i][j]){case '0': m.MapSr.setTextureRect(IntRect(64, 0, 32, 32)); break;case 'v': m.MapSr.setTextureRect(IntRect(32, 0, 32, 32)); break;case '-': m.MapSr.setTextureRect(IntRect(128, 0, 32, 32)); break;case '|': m.MapSr.setTextureRect(IntRect(96, 0, 32, 32)); break;default: m.MapSr.setTextureRect(IntRect(0, 0, 32, 32)); break;}m.MapSr.setPosition(j * 32, i * 32);window.draw(m.MapSr);}MainText Number1X("1", font, 25, Color::Green, Text::Bold, 108, 50);MainText Number2X("2", font, 25, Color::Green, Text::Bold, 300, 50);MainText Number3X("3", font, 25, Color::Green, Text::Bold, 492, 50);MainText Number4X("4", font, 25, Color::Green, Text::Bold, 682, 50);MainText Number5X("5", font, 25, Color::Green, Text::Bold, 878, 50);MainText Number1Y("1", font, 25, Color::Blue, Text::Bold, 60, 94);MainText Number2Y("2", font, 25, Color::Blue, Text::Bold, 60, 222);MainText Number3Y("3", font, 25, Color::Blue, Text::Bold, 60, 350);MainText Number4Y("4", font, 25, Color::Blue, Text::Bold, 60, 480);MainText Number5Y("5", font, 25, Color::Blue, Text::Bold, 60, 607);MainText GreenCub("<>", font, 20, Color::Green, Text::Bold, 90, 640);MainText BlueCub("<>", font, 20, Color::Blue, Text::Bold, 90, 670);MainText NumberB("Номер автобусов", font, 20, Color::White, Text::Bold, 134, 640);MainText NumberT("Номер троллейбусов", font, 20, Color::White, Text::Bold, 134, 670);MainText V00(StreetName[0][0], font, 20, Color::White, Text::Bold, 145, 82);MainText V01(StreetName[0][1], font, 20, Color::White, Text::Bold, 340, 82);MainText V02(StreetName[0][2], font, 20, Color::White, Text::Bold, 550, 82);MainText V03(StreetName[0][3], font, 20, Color::White, Text::Bold, 730, 82);MainText V04(StreetName[0][4], font, 20, Color::White, Text::Bold, 915, 82);MainText V10(StreetName[1][0], font, 20, Color::White, Text::Bold, 160, 210);MainText V11(StreetName[1][1], font, 20, Color::White, Text::Bold, 355, 210);MainText V12(StreetName[1][2], font, 20, Color::White, Text::Bold, 525, 210);MainText V13(StreetName[1][3], font, 20, Color::White, Text::Bold, 730, 210);MainText V14(StreetName[1][4], font, 20, Color::White, Text::Bold, 908, 210);MainText V20(StreetName[2][0], font, 20, Color::White, Text::Bold, 150, 339);MainText V21(StreetName[2][1], font, 20, Color::White, Text::Bold, 350, 339);MainText V22(StreetName[2][2], font, 20, Color::White, Text::Bold, 540, 339);MainText V23(StreetName[2][3], font, 20, Color::White, Text::Bold, 745, 339);MainText V24(StreetName[2][4], font, 20, Color::White, Text::Bold, 910, 339);MainText V30(StreetName[3][0], font, 20, Color::White, Text::Bold, 150, 467);MainText V31(StreetName[3][1], font, 20, Color::White, Text::Bold, 350, 467);MainText V32(StreetName[3][2], font, 20, Color::White, Text::Bold, 550, 467);MainText V33(StreetName[3][3], font, 20, Color::White, Text::Bold, 750, 467);MainText V34(StreetName[3][4], font, 20, Color::White, Text::Bold, 930, 467);MainText V40(StreetName[4][0], font, 20, Color::White, Text::Bold, 150, 595);MainText V41(StreetName[4][1], font, 20, Color::White, Text::Bold, 340, 595);MainText V42(StreetName[4][2], font, 20, Color::White, Text::Bold, 550, 595);MainText V43(StreetName[4][3], font, 20, Color::White, Text::Bold, 745, 595);MainText V44(StreetName[4][4], font, 20, Color::White, Text::Bold, 915, 595);window.draw(Number1X.text);window.draw(Number2X.text);window.draw(Number3X.text);window.draw(Number4X.text);window.draw(Number5X.text);window.draw(Number1Y.text);window.draw(Number2Y.text);window.draw(Number3Y.text);window.draw(Number4Y.text);window.draw(Number5Y.text);window.draw(GreenCub.text);window.draw(BlueCub.text);window.draw(NumberB.text);window.draw(NumberT.text);window.draw(V00.text);window.draw(V01.text);window.draw(V02.text);window.draw(V03.text);window.draw(V04.text);window.draw(V10.text);window.draw(V11.text);window.draw(V12.text);window.draw(V13.text);window.draw(V14.text);window.draw(V20.text);window.draw(V21.text);window.draw(V22.text);window.draw(V23.text);window.draw(V24.text);window.draw(V30.text);window.draw(V31.text);window.draw(V32.text);window.draw(V33.text);window.draw(V34.text);window.draw(V40.text);window.draw(V41.text);window.draw(V42.text);window.draw(V43.text);window.draw(V44.text);window.display();}return 0;}Map.h:
C++12345678910111213141516171819202122232425262728293031323334#include <SFML/Graphics.hpp>using namespace sf;using namespace std;const int HEIGHT_MAP = 23;//размер карты высотаconst int WIDTH_MAP = 35;//размер карты ширинаString TileMap[HEIGHT_MAP] = {"00000000000000000000000000000000000","0 0","0 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 | | | | | 0","0 | | | | | 0","0 | | | | | 0","0 v-----v-----v-----v-----v----- 0","0 0","0 0","00000000000000000000000000000000000",};View.h:
C++1234567891011121314#include <SFML/Graphics.hpp>using namespace std;using namespace sf;View view;View ViewMap(float time){if (Keyboard::isKeyPressed(Keyboard::W)) view.move(0, -0.1*time);if (Keyboard::isKeyPressed(Keyboard::S)) view.move(0, 0.1*time);if (Keyboard::isKeyPressed(Keyboard::D)) view.move(0.1*time, 0);if (Keyboard::isKeyPressed(Keyboard::A)) view.move(-0.1*time, 0);if (Keyboard::isKeyPressed(Keyboard::Q)) view.setCenter(560, 369);return view;}vproject57, лучше привести конкретный пример того, что хотите реализовать. То есть пользователь запустил вашу игру, затем он ввёл такой-то текст (например, “QWe145bK8f”), программа в ответ на это должна сделать то-то и то-то (например, нарисовать зелёный треугольник внутри синего круга и вывести в консоль “Hello, World”). Я пока не очень понимаю, что конкретно вводит пользователь и как должна на это отреагировать программа.
vproject57, Я не понимаю зачем ты так себе усложняешь жизнь. Просто сделай масив который будет содержть кординаты вершин в строке и после ввода пользователем данных просто через обращение к этому масиву находи нужные тебе строки и заменяй их.
Описание программы:
1) Вводит пользователь место нахождение(т.е где он находится, а точнее улицу).
2) Вводит пользователь место прибытия(т.е куда он хочет попасть, а точнее улицу).
3) Теперь, программа имеет начальную и конечную точку. Нужно изменить элемент карты “-” или “|”(в зависимости от пути) на “=” или “||”.На этом всё!
У меня проблема только из-за того что я не могу получить в цикле прорисовки карты, а точнее:
C++123456789101112131415for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDTH_MAP; j++){Count = 0;switch (TileMap[i][j]){case '0': m.MapSr.setTextureRect(IntRect(64, 0, 32, 32)); break;case 'v': m.MapSr.setTextureRect(IntRect(32, 0, 32, 32)); break;case '-': m.MapSr.setTextureRect(IntRect(128, 0, 32, 32)); break;case '|': m.MapSr.setTextureRect(IntRect(96, 0, 32, 32)); break;default: m.MapSr.setTextureRect(IntRect(0, 0, 32, 32)); break;}m.MapSr.setPosition(j * 32, i * 32);window.draw(m.MapSr);}К примеру к случаю “v” написать сохрани в переменную сVertices[x][y]. Как-то так!
Не дал мне еще раз сайт отредактировать свой комментарий.
Проблема: не могу получить во время цикла координаты x, y, какого-то элемента.KindRedSan, если сделать как вы сказали – Я думаю, это будет не правильно, так как с такой проблемой можно столкнутся и во время работы над другой программой. А как вы понимаете, каждый раз писать координаты каждого элемента карты в ручную – это не очень скажем удобно!
И почему же вы не можете в цикле найти кординаты? Сектора у вас разбиты 32×32, сответственно когда вы попадает в случай ‘v’
C++1234567891011121314151617181920for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDTH_MAP; j++){Count = 0;switch (TileMap[i][j]){case '0': m.MapSr.setTextureRect(IntRect(64, 0, 32, 32)); break;case 'v':сVertices[j][i] = Vector2(j * 32, i * 32);/*x = j * 32;y = i * 32;*/break;case '-': m.MapSr.setTextureRect(IntRect(128, 0, 32, 32)); break;case '|': m.MapSr.setTextureRect(IntRect(96, 0, 32, 32)); break;default: m.MapSr.setTextureRect(IntRect(0, 0, 32, 32)); break;}m.MapSr.setPosition(j * 32, i * 32);window.draw(m.MapSr);}KindRedSan, на Vector2 ругается. Что делать с ним?
Переписать его в Vector2f. Привычка с XNA уже выработалась…
KindRedSan, хм. А теперь: “не существует подходящей функции преобразования из “sf::Vector2f” в “float” “.
Одну делаю другая выходит). -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.