sfml 创建的 window 即使在编译成功后也会崩溃
The window created by sfml crashes even after a successful compilation
我正在尝试将 classes 与 sfml 一起使用,作为一个更大项目的起点,但我的代码存在问题:它编译得很好,但是当我单击可执行文件时,window 在 ~1s 白色后关闭。我要补充一点,我是 C++ 的初学者,由于 this doc.
,我几乎无法理解指针和数组的很多内容
我按照 this tutorial 进行了环境设置,演示脚本效果很好,我什至尝试了一些东西来学习显示其他形状并且效果很好。
我修改后的测试是关于显示一个二维数组,它是我制作的 class 的一个属性。该数组的大小应该在 class 构造函数的参数中给出,这就是为什么我尝试使用指向字符的指针数组的原因,我尝试了多种方法,包括通过递增指针(在在这种情况下,window 有效,但没有显示任何内容,并且 cout 显示从“数组”读取的颜色不是它们应该的颜色,它有很多 ' ',一个 'H' 和 'B'.
我需要这个 class 结构的原因是因为我将尝试通过单击它们来更改数组中各个图块的颜色,这也是一个更大项目的起点。
这是所有脚本:
生成文件:
main.exe: main.o grid.o
g++ main.o grid.o -o main -Lsrc\lib -lsfml-graphics -lsfml-window -lsfml-system
main.o: main.cpp
g++ -Isrc\include -c main.cpp
grid.o: grid.cpp
g++ -Isrc\include -c grid.cpp
main.cpp :
#include <SFML/Graphics.hpp>
#include "grid.h"
int W = 500, H = 500;
int main()
{
sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!");
grid Grid(5, 4, 'g');
while (window.isOpen())
{
sf::Event evnt;
while (window.pollEvent(evnt))
{
if (evnt.type == sf::Event::Closed)
window.close();
else if (evnt.type == sf::Event::Resized)
{
sf::FloatRect view(0, 0, evnt.size.width, evnt.size.height);
window.setView(sf::View(view));
}
}
window.clear();
Grid.display(&window);
window.display();
}
return 0;
}
grid.h :
#ifndef GRID_H
#define GRID_H
#include <SFML/Graphics.hpp>
#include <vector>
class grid
{
private:
int h, w;
char** colors;
public:
grid(const int h, const int w, char defCol);
void display(sf::RenderWindow* windowPoint);
};
#endif //GRID_H
grid.cpp :
#include "grid.h"
#include <iostream>
grid::grid(const int h, const int w, char defCol)
{
this->h = h;
this->w = w;
char * colorLines [h];
for (int ii=0; ii<h; ii++){
char colorLine[w];
for (int jj=0; jj<w; jj++){
colorLine[jj] = defCol;
}
colorLines[ii] = colorLine;
}
colors = colorLines;
}
void grid::display(sf::RenderWindow* windowPoint)
{
float shapeQ = w/h;
float pxlW, pxlH;
sf::Vector2u WinSize(windowPoint->getSize());
if (WinSize.x/WinSize.y > shapeQ){
pxlH = WinSize.y/2;
pxlW = pxlH*shapeQ;
}
else {
pxlW = WinSize.x/2;
pxlH = pxlW/shapeQ;
}
float x0 = (WinSize.x-pxlW)/2, y0 = (WinSize.y-pxlH)/2;
sf::RectangleShape tile(sf::Vector2f(pxlW, pxlH));
float deltax = pxlW/w, deltay = pxlH/h;
for (int x=0; x<w; x++){
for (int y=0; y<h; y++){
char color = (colors[y])[x];
std::cout << "color is " << color << ", ";
tile.setFillColor(sf::Color::White);
if (color == 'g'){
tile.setFillColor(sf::Color::Green);
}
else if (color == 'y')
{
tile.setFillColor(sf::Color::Yellow);
}
else if (color == 'r')
{
tile.setFillColor(sf::Color::Red);
}
tile.setSize(sf::Vector2f(deltax, deltay));
tile.setPosition(x0+deltax*x, y0+deltay*y);
windowPoint->draw(tile);
}
std::cout << std::endl;
}
std::cout << std::endl;
}
项目的文件夹结构与上面链接的教程中的相同:一堆来自 SFML 的 .dll,以及一个包含 include 和 lib 的 src 文件夹。
我还要补充一点,我尝试按照其他问题中的建议使用调试工具,但它无法构建...它给出了一堆看起来像 undefined reference to `_imp___ZN2sf14RectangleShapeC1ERKNS_7Vector2IfEE'
的错误
我找到了一个“有效”的解决方案! class 'grid' 的属性 'colors' 使用此构造函数正确指向填充有 defCol 的二维数组:
grid::grid(const int h, const int w, char defCol)
{
this->h = h;
this->w = w;
colors = new char * [h];
char * colorLine;
for (int y=0; y<h; y++){
colorLine = new char [w];
for (int x=0; x<w; x++){
colorLine[x] = defCol;
}
colors[y] = colorLine;
}
}
TL.DR : 我刚刚学会了如何使用关键字 'new'
PS : 绘图功能不起作用,我用cout检查了。
我正在尝试将 classes 与 sfml 一起使用,作为一个更大项目的起点,但我的代码存在问题:它编译得很好,但是当我单击可执行文件时,window 在 ~1s 白色后关闭。我要补充一点,我是 C++ 的初学者,由于 this doc.
,我几乎无法理解指针和数组的很多内容我按照 this tutorial 进行了环境设置,演示脚本效果很好,我什至尝试了一些东西来学习显示其他形状并且效果很好。
我修改后的测试是关于显示一个二维数组,它是我制作的 class 的一个属性。该数组的大小应该在 class 构造函数的参数中给出,这就是为什么我尝试使用指向字符的指针数组的原因,我尝试了多种方法,包括通过递增指针(在在这种情况下,window 有效,但没有显示任何内容,并且 cout 显示从“数组”读取的颜色不是它们应该的颜色,它有很多 ' ',一个 'H' 和 'B'.
我需要这个 class 结构的原因是因为我将尝试通过单击它们来更改数组中各个图块的颜色,这也是一个更大项目的起点。
这是所有脚本:
生成文件:
main.exe: main.o grid.o
g++ main.o grid.o -o main -Lsrc\lib -lsfml-graphics -lsfml-window -lsfml-system
main.o: main.cpp
g++ -Isrc\include -c main.cpp
grid.o: grid.cpp
g++ -Isrc\include -c grid.cpp
main.cpp :
#include <SFML/Graphics.hpp>
#include "grid.h"
int W = 500, H = 500;
int main()
{
sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!");
grid Grid(5, 4, 'g');
while (window.isOpen())
{
sf::Event evnt;
while (window.pollEvent(evnt))
{
if (evnt.type == sf::Event::Closed)
window.close();
else if (evnt.type == sf::Event::Resized)
{
sf::FloatRect view(0, 0, evnt.size.width, evnt.size.height);
window.setView(sf::View(view));
}
}
window.clear();
Grid.display(&window);
window.display();
}
return 0;
}
grid.h :
#ifndef GRID_H
#define GRID_H
#include <SFML/Graphics.hpp>
#include <vector>
class grid
{
private:
int h, w;
char** colors;
public:
grid(const int h, const int w, char defCol);
void display(sf::RenderWindow* windowPoint);
};
#endif //GRID_H
grid.cpp :
#include "grid.h"
#include <iostream>
grid::grid(const int h, const int w, char defCol)
{
this->h = h;
this->w = w;
char * colorLines [h];
for (int ii=0; ii<h; ii++){
char colorLine[w];
for (int jj=0; jj<w; jj++){
colorLine[jj] = defCol;
}
colorLines[ii] = colorLine;
}
colors = colorLines;
}
void grid::display(sf::RenderWindow* windowPoint)
{
float shapeQ = w/h;
float pxlW, pxlH;
sf::Vector2u WinSize(windowPoint->getSize());
if (WinSize.x/WinSize.y > shapeQ){
pxlH = WinSize.y/2;
pxlW = pxlH*shapeQ;
}
else {
pxlW = WinSize.x/2;
pxlH = pxlW/shapeQ;
}
float x0 = (WinSize.x-pxlW)/2, y0 = (WinSize.y-pxlH)/2;
sf::RectangleShape tile(sf::Vector2f(pxlW, pxlH));
float deltax = pxlW/w, deltay = pxlH/h;
for (int x=0; x<w; x++){
for (int y=0; y<h; y++){
char color = (colors[y])[x];
std::cout << "color is " << color << ", ";
tile.setFillColor(sf::Color::White);
if (color == 'g'){
tile.setFillColor(sf::Color::Green);
}
else if (color == 'y')
{
tile.setFillColor(sf::Color::Yellow);
}
else if (color == 'r')
{
tile.setFillColor(sf::Color::Red);
}
tile.setSize(sf::Vector2f(deltax, deltay));
tile.setPosition(x0+deltax*x, y0+deltay*y);
windowPoint->draw(tile);
}
std::cout << std::endl;
}
std::cout << std::endl;
}
项目的文件夹结构与上面链接的教程中的相同:一堆来自 SFML 的 .dll,以及一个包含 include 和 lib 的 src 文件夹。
我还要补充一点,我尝试按照其他问题中的建议使用调试工具,但它无法构建...它给出了一堆看起来像 undefined reference to `_imp___ZN2sf14RectangleShapeC1ERKNS_7Vector2IfEE'
我找到了一个“有效”的解决方案! class 'grid' 的属性 'colors' 使用此构造函数正确指向填充有 defCol 的二维数组:
grid::grid(const int h, const int w, char defCol)
{
this->h = h;
this->w = w;
colors = new char * [h];
char * colorLine;
for (int y=0; y<h; y++){
colorLine = new char [w];
for (int x=0; x<w; x++){
colorLine[x] = defCol;
}
colors[y] = colorLine;
}
}
TL.DR : 我刚刚学会了如何使用关键字 'new'
PS : 绘图功能不起作用,我用cout检查了。