由于某些奇怪的原因,我的 SFML 程序不会呈现任何内容,直到我将鼠标悬停在它上面,或按下某个键或执行任何符合事件资格的操作。
我该如何解决?
目标平台: Windows XP高中计算机
需要的库: SFML,GLEW,ODE,Python(用于嵌入)
计划的功能让我相信我可能需要多线程:
我需要多线程来完成这个项目吗?
我对新的sfml有一个巨大的问题,并花了一天时间试图找出它.我终于发现我需要用cmake编译它.最大的问题是cmake一直要求CMakeLists.txt而不是那里.请帮帮我,我只想在sfml中开始编码.我正在运行Windows 8.1,如果您需要更多信息,请问我,我会尽力给您.如果我看错的问题,请你提出一个新的解决方案.
问题:
所以,我一直在撞墙挡在头上.我有一个在OSX和Linux上编译并运行良好的应用程序,但是当我使用MingW64在Windows上编译它时,我在运行时获得了一个SEGFAULT.所以这就是发生的事情;
我有一个包含的Map类std::vector<Tilesheet*> m_tilesheets.我通过引用构造函数将此变量传递给另一个类MapLayer:
MapLayer::MapLayer(std::vector<unsigned int>& p_data,
std::vector<MindTrip::Graphics::TileSheet*>& p_tilesheets)
: m_data(p_data),
m_tilesheets(p_tilesheets)
{
DrawTexture();
}
Run Code Online (Sandbox Code Playgroud)
矢量存储为MapLayerClass中的引用, std::vector<MindTrip::Graphics::TileSheet*>& m_tilesheets;
如果我在该构造函数的第一行放置断点,则m_tilesheets具有_M_First的定义值.如果我在构造函数的最后一行放置一个断点,则m_tilesheets不再具有_M_First的定义值.我没有进行多线程处理,并且应用程序还没有离开这些变量定义的范围.
在它的下一个函数中DrawTexture(),有一个foreach循环遍历m_tilesheets,它不断给我一个SEGFAULT:
void MapLayer::DrawTexture() {
for(unsigned int tile_val: m_data)
{
// SEGFAULT ON THIS LINE
for(MindTrip::Graphics::TileSheet* tileSheet : m_tilesheets)
{
}
}
}`
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的:
我已经尝试将其转换为常规for循环,但仍然会遇到同样的问题.
我尝试使用引用通过将foreach循环转换为向量来抓取向量中的对象:
for(auto& tileSheet : m_tilesheets).同样的问题
如果我将m_tilesheets移出MapLayer类及其构造函数并将其作为参数传递给DrawTexture作为参考:
MapLayer::DrawTexture(std::vector<MindTrip::Graphics::TileSheet*>& p_tilesheets)
M_data开始在其foreach循环中抛出段错误.这很奇怪,因为m_data的foreach循环实际上发生在m_tilesheet之前的行上:for(unsigned int tile_val: m_data)
所以,为了回应这个问题,我尝试将m_data移动到DrawTexture的参数并将其作为成员删除,就像我为m_tilesheets所做的那样,通过引用传递:
MapLayer::DrawTexture(std::vector<MindTrip::Graphics::TileSheet*>& p_tilesheets, std::vector<unsigned int>& p_data)
当我尝试这个时,我使用for循环而不是foreach.p_tiles表中应该有1个条目,p_data中应该有10000个条目.这次segfault抛出了我访问p_tilsheet数据的行,p_tilesheet[j]; j并没有超出范围并被设置为0.
尝试了所有这些之后,我将代码重置回原来的样本,而不是决定使用std :: copy()来复制向量中的数据,而不是使用类中的引用,我只是实例化了新的变量对于m_tilesheets和m_data.我将foreach切换回常规for循环,然后再次获得段错误访问m_tilesheets的元素[j].
我对你的记忆甚至发生了什么感到困惑.m_tilesheets和m_data在被访问时不为null,并且甚至在构造函数结束之前,它们的_M_First属性也会以某种方式取消设置.
再一次,只发生在Windows上.OSX和Linux工作正常.在我实现map类之前,应用程序在windows上正常运行.不只是寻找修复作为答案,而是发生错误的原因.
编辑:
这是Map的构造函数,我在这里定义这些值并将它们传递给MapLayer的新实例.
Map::Map(const char* …Run Code Online (Sandbox Code Playgroud) 我真是一言不发。我一直坐在电脑前,试图弄清为什么它不起作用。我试图使播放器无法在空中跳跃。但是由于某种原因,玩家仍然可以跳两次,与此同时,如果玩家尝试第三次或第四次跳跃等。它不会和我的代码工作。但是,为什么我仍然能够跳一跳?我不知道这一点。感谢所有帮助。
#include "pch.h"
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
using namespace std;
int width = 800;
int height = 600;
int main()
{
sf::RenderWindow window(sf::VideoMode(width, height), "In Development");
window.setFramerateLimit(70);
window.setVerticalSyncEnabled(true);
sf::RectangleShape player;
player.setSize(sf::Vector2f(50, 50));
player.setFillColor(sf::Color::Cyan);
player.setPosition(width / 2, 0);
sf::Vector2f velocity(0, 0);
float gravity = .1;
bool jumping = true;
sf::Event event;
while (window.isOpen())
{
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::Space)
{
if (jumping == false)
{
velocity.y = …Run Code Online (Sandbox Code Playgroud) 我使用了一个我在这个问题中找到的函数,适用于用"%20"替换所有空格(可能会更有效地完成!):
## Heading ##std::string Main::SpacesForWeb(std::string text) {
for (std::string::iterator it = text.begin(); it != text.end(); ++it) {
if (*it == ' ') {
*it = '%20';
}
}
return text;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将它用于字符串时Local Live Test Server,输出是这样的:

我的最后一个问题涉及string的问题,并发现string被typedef编为指向内部CryString在游戏SDK类型我使用(Cryengine2引擎).我现在正在使用std::string以解决这个问题.
此问题也反映在我转换发生后使用的数据库中,并将数据发送到数据库:

为什么我不能%20以这种方式使用(也许还有其他URL编码符号),我怎样才能使它工作?我试图对此进行一些研究以便自己解决这个问题,但是没有任何相关内容出现.
我已尝试使用*it = (char)"%20";原位*it = (char)"%20";,但是这实际上删除了0出现在字符串中而不是替换空格%20.
目前,我正在学习c ++而且只是为了好玩,我想编写一个小型国际象棋游戏(当然没有AI).我使用visual studio社区,SFML 2.5作为渲染器和图形对象.我试图为所有数字制作一个名为"数字"的模型.所以我有一个继承自sfml sprite(一个drawable)和一个从该图继承的pawn类fe的figure类.Sf :: sprite - > figure-> pawn/queen/tower等...但由于某种原因,我不能将pawn用作精灵,例如,我无法使用windowRenderer的draw函数绘制它.但是函数文档说它需要一个可绘制的对象.我收到一条错误消息,上面写着:基类中无法访问的对话无效.我做错了什么或是不可能使用像这样的精灵.这是我的构造函数,因为我认为我最有可能在那里犯了一个错误.到目前为止我只用java编码所以分离到头文件和实现文件对我来说有点陌生,构造函数语法也不同.
figure.h:
class figure : sf::Sprite {
public:
figure(int startPosition);
void changeImage(std::string);
void dissapear();
void loadImage(std::string);
private:
sf::Image img;
};
figure.cpp:
figure::figure(int startPosition):sf::Sprite(){
}
pawn.h:
class pawn :
public figure
{
public:
pawn(int startPosition);
~pawn();
private:
void move(bool canBeat, bool isAsStart);
};
pawn.cpp:
pawn::pawn(int startPosition):figure (startPosition)
{
}
in main.cpp:
pawn pawn1(position);
sf::RenderWindow window(sf::VideoMode(sets.windowX, sets.windowY), "frame");
window.draw(pawn1);
Run Code Online (Sandbox Code Playgroud) 我正在使用.NET Framework 2.0来编写一个2d平台游戏.我正在使用SFML .NET,因为它是跨平台并且由MONO支持并且具有成熟的API.我的问题是,虽然我的程序编译正确并且运行正常,但在关闭它时会出错.
"0x5ed0530e"处的指令引用"0x0000051c"处的存储器.内存无法"读取"
仔细调试后,我注意到在初始化SFML String2d类后出现问题.
怎么了; 关闭程序时为什么会出现此错误?即使没有任何问题,仍然可以停止接收错误,以便我的程序的用户不会被它烦恼?
使用系统; 使用SFML.Graphics; 使用SFML.Window;
namespace ProGUI
{
class TextBox : Sprite
{
private String2D Text;
public TextBox(RenderWindow App)
{
Image = new Image(App.Width, App.Height / 4, new Color(0, 0, 0));
Position = new Vector2(0, App.Height - App.Height / 4);
}
public void SetText(string text)
{
Text = new String2D(text);
Text.Font = new Font("Greyscale_Basic_Bold.ttf");
Text.Position = new Vector2(Position.X + 5, Position.Y + 5);
Text.Size = 12;
}
public string GetText()
{
return Text.Text; …Run Code Online (Sandbox Code Playgroud) sfml ×8
c++ ×7
.net ×1
2d ×1
c# ×1
cmake ×1
codeblocks ×1
crysis ×1
inheritance ×1
ode-library ×1
python ×1
sprite ×1
string ×1
url-encoding ×1
vector ×1