Hey again. I got back into SFML development and are working on an editor for my Raycaster engine. I got the grid and vertex placement via mouse working but I haven't gotten edges(Lines) to work yet.
Here's the editor's main script
int main(int, char const**)
{
// Create the main window
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window", sf::Style::Resize);
int gridSize = 16;
sf::RectangleShape gridBox(sf::Vector2f(gridSize, gridSize));
gridBox.setFillColor(sf::Color(0, 0, 0));
MapPoint pnt;
gridBox.setOutlineThickness(1);
gridBox.setOutlineColor(sf::Color(155, 155, 155));
const int nofRows = 128;
const int nofCols = 128;
const int distance = gridSize;
const float offset = distance/2.f;
const float height = std::sqrt(std::pow(distance,2.f) - std::pow(offset,2.f));
sf::Font font;
if (!font.loadFromFile(resourcePath() + "sansation.ttf"))
{
// error...
}
sf::Texture dotTex;
if(!dotTex.loadFromFile(resourcePath() + "dot.png"))
{
// error...
}
sf::Text text1;
sf::Text text2;
text1.setFont(font);
text2.setFont(font);
text1.setCharacterSize(8);
text2.setCharacterSize(8);
text1.setFillColor(sf::Color::Red);
text2.setFillColor(sf::Color::Blue);
text2.setPosition(0, 8);
int currentVertIndex = 0;
int currentEdgeIndex = 0;
sf::Vector2f firstPointForEdge;
std::vector<Edge> edgeNodes;
std::vector<Vertex> vertNodes;
bool addingLine;
// Start the game loop
while (window.isOpen())
{
sf::Vector2i pixelPos = sf::Mouse::getPosition(window);
sf::Vector2f worldPos = window.mapPixelToCoords(pixelPos);
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed) {
window.close();
}
// Escape pressed: exit
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
window.close();
}
if(event.type == event.MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left) {
if(!addingLine) {
firstPointForEdge = worldPos;
addingLine = true;
} else {
edgeNodes.push_back(*new Edge(firstPointForEdge, worldPos));
addingLine = false;
}
currentVertIndex++;
vertNodes.push_back(*new Vertex(worldPos));
}
}
text1.setString("World point is " + std::to_string(worldPos.x) + " " + std::to_string(worldPos.y));
text2.setString("Vertices " + std::to_string(vertNodes.size()) + " " + std::to_string(currentVertIndex));
// Clear screen
window.clear();
for (int i=0; i<nofRows; ++i) {
for (int j=0; j<nofCols; ++j){
gridBox.setPosition(j*distance, i*height);
pnt.setPosition(j*distance - 1.5, i*height - 1.5);
window.draw(gridBox);
}
}
for(int x = 0; x < vertNodes.size(); x++) {
vertNodes[x].onDraw(window);
}
for(int x = 0; x < edgeNodes.size(); x++) {
edgeNodes[x].onDraw(window);
}
window.draw(text1);
window.draw(text2);
// Update the window
window.display();
}
return EXIT_SUCCESS;
}
And here's the Edge header
#include <SFML/Graphics.hpp>
class Edge : public sf::Transformable
{
public:
Edge(sf::Vector2f pos1, sf::Vector2f pos2)
{
line[0] = sf::Vertex(pos1);
line[1] = sf::Vertex(pos2);
}
virtual void onDraw(sf::RenderTarget& target) const
{
target.draw(line, 2, sf::Lines);
}
sf::Vertex line[];
};
It will not display and can crash the editor. So what do I have to change?