标签: sfml

有没有一个很好的方法用Luabridge将sf :: Event暴露给Lua?

根据LuaBridge自述文件,LuaBridge不支持"枚举常数",我认为这只是enums.由于sf::Event几乎完全是enums,有没有什么办法,我可以揭露类?目前,我能想出的唯一其他解决方案是在C++中检测按键,然后向Lua发送一个字符串,用于描述事件.显然,在现代键盘上有大约100多个键,这将导致一个巨大的,丑陋的段if语句.

对于那些没有使用过SFML的人:链接到sf :: Event类源代码


更新:

在尝试创建我的问题中概述的函数之后,我发现它无论如何都不起作用,因为你不能在C++中返回多个字符串,因此大多数事件都被忽略.

示例源(不起作用):

std::string getEvent()
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed) {window.close(); return "";}
        else if (event.type == sf::Event::GainedFocus) {return "GainedFocus";}
        else if (event.type == sf::Event::LostFocus) {return "LostFocus";}
        else if (event.type == sf::Event::Resized) {return "Resized";}
        else if (event.type == sf::Event::TextEntered)
        {
            if ((event.text.unicode < 128) && (event.text.unicode > 0)) {return "" + static_cast<char>(event.text.unicode);}
        }
        else if (event.type == sf::Event::KeyPressed)
        {
            //If else for …
Run Code Online (Sandbox Code Playgroud)

c++ lua enums sfml luabridge

12
推荐指数
1
解决办法
595
查看次数

"看着"具有四元数的对象

所以我目前正在尝试创建一个函数,它将采用两个3D点A和B,并为我提供四元数,表示点A要求"看"点B所需的旋转(这样点A的局部Z轴通过B点,如果你愿意).

我最初发现这篇文章,其中最重要的答案似乎为我提供了一个很好的起点.我继续实现以下代码; 而不是假设默认(0,0,-1)方向,正如原始答案所示,我尝试提取表示相机实际方向的单位向量.

void Camera::LookAt(sf::Vector3<float> Target)
{
    ///Derived from pseudocode found here:
    ///https://stackoverflow.com/questions/13014973/quaternion-rotate-to

    //Get the normalized vector from the camera position to Target
    sf::Vector3<float> VectorTo(Target.x - m_Position.x,
                                Target.y - m_Position.y,
                                Target.z - m_Position.z);
    //Get the length of VectorTo
    float VectorLength = sqrt(VectorTo.x*VectorTo.x +
                              VectorTo.y*VectorTo.y +
                              VectorTo.z*VectorTo.z);
    //Normalize VectorTo
    VectorTo.x /= VectorLength;
    VectorTo.y /= VectorLength;
    VectorTo.z /= VectorLength;

    //Straight-ahead vector
    sf::Vector3<float> LocalVector = m_Orientation.MultVect(sf::Vector3<float>(0, 0, -1));

    //Get the cross product as the axis of rotation
    sf::Vector3<float> Axis(VectorTo.y*LocalVector.z - VectorTo.z*LocalVector.y, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl rotation quaternions sfml

11
推荐指数
1
解决办法
5611
查看次数

ld链接器错误"cpu模型隐藏符号"

尝试在ubuntu 16.04上编译sfml程序时出现ld错误.这显然是一个已知的问题,应该有一个解决方法,但我不明白它是什么...

http://web.archive.org/web/20160509014317/https://gitlab.peach-bun.com/pinion/SFML/commit/3383b4a472f0bd16a8161fb8760cd3e6333f1782.patch

由ld吐出的错误是

hidden symbol `__cpu_model' in /usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a(cpuinfo.o) is referenced by DSO
Run Code Online (Sandbox Code Playgroud)

没有相关的代码 - 据我所知,如果要链接的程序包含诸如sf::Texture和的对象,则所有带有g ++ 5的ubuntu 16.04系统都会产生此错误sf::Sprite.(我不知道比这更详细.)

我也试过用g ++ 4.9进行编译,但是会出现同样的错误.

我的编译行是 g++-4.9 --std=c++11 -Wall main.cpp -lsfml-graphics -lsfml-window -lsfml-system -o a.out

有没有其他人遇到此错误并成功解决了?

c++ linker sfml ubuntu-16.04 g++-5

11
推荐指数
1
解决办法
2722
查看次数

texelFetch的替代方案?

我正在进入GLSL并需要一些纹理查找帮助.我正在尝试使用纹理进行存储,但我无法获得"正确"的纹理查找.我更喜欢使用通常的texture2D方法(使用GLSL 1.2),但结果不够好.

使用texture2D: 一

使用texelFetch: 二

现在很明显第一个问题出了问题.这是我想要做的事情(是的尺寸是正确的,除非有一些我不知道的事情):

vec4 texelFetch(sampler2D tex, ivec2 size, ivec2 coord)
{
    return texture2D(tex, vec2(float(coord.x) / float(size.x), 
                               float(coord.y) / float(size.y)));
}
Run Code Online (Sandbox Code Playgroud)

那么,这将如何正确完成?

opengl glsl sfml

10
推荐指数
1
解决办法
9243
查看次数

在应用程序中编写控制台

我的应用程序需要在应用程序窗口中嵌入控制台,例如,在autoCAD中,控制台位于窗口底部等待命令.

在此输入图像描述

我需要在我的应用程序中使用控制台,以便我可以更改变量和其他内容,因此控制台不需要是一个完全爆炸的shell.

目前我的应用程序中有一个简单的控制台,但与终端(shell)相比,它看起来非常笨重,这就是我想要控制台的样子.

在此输入图像描述

我用控制台完成它的方式是当用户按下TAB控制台显示的键时,他们可以输入他们的命令/行; 一旦Return按下了键,就会解析它们键入的字符串并处理该命令.

我正在使用sf::Text对象在我的应用程序窗口中打印文本.总共使用了5个sf::Text对象,4个用于以前的命令/错误消息,1个用于当前命令行.当Return按下该键时,第4个sf::Text将其当前字符串更改为第3个,第3个到第2个,第2个到第1个,第1个更改为当前命令字符串,然后当前命令字符串被清除并准备再次输入.这样就有4个"历史"命令和/或错误的空间.不是最好的,但它是我能想到的最好的.当然,可以通过添加更多sf::Text对象来更改历史记录的数量.所以最后这就是我将控制台渲染到屏幕的方式

sf::RectangleShape rectangle;

rectangle.setSize(sf::Vector2f(App->getSize().x, App->getSize().y / 3));
rectangle.setPosition(0, 0);

rectangle.setFillColor(sf::Color::black);

App->draw(rectangle);   // This renders the console looking background rectangle
App->draw(CLine);   // This renders the current command line

for(int i = 4; i >= 0; --i) // This renders the history as described above, their idevidual positions are setup earlier on in the program
{
    CHistory[i].setString(CS[i]);
    App->draw(CHistory[i]);
}
Run Code Online (Sandbox Code Playgroud)

App 只是一个 …

c++ shell console sfml

9
推荐指数
1
解决办法
6265
查看次数

是否可以绘制Drawable并从中获取位图?

是否可以将绘制DrawableTexture(位图)?我怎么能这样做,拜托?


我的尝试

我修改了绿圈示例.现在它真的被绘制为位图......

但它就是这样绘制的:

不平滑的弧形.

我想要抗锯齿.

通过RenderWindow课程,我可以通过传递一个来消除锯齿ContextSettings.使用@ Mario的建议我需要,不幸的是RenderTexture我无法控制它ContextSettings.

@ AlexG的建议

我创建了一个Context,但我的编译器说my_test.cc:9:57: error: use of deleted function 'sf::Context::Context(const sf::Context&)'.呃!还有其他选择

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>

int main()
{
    sf::ContextSettings settings =
        sf::ContextSettings(0, 0, 6);

    sf::Context context = sf::Context(settings, 200, 200);
    context.setActive(true);

    sf::RenderWindow window(
        sf::VideoMode(200, 200), "sfml test", sf::Style::Default,
        settings
    );

    sf::RenderTexture cacheTexture;
    if (!cacheTexture.create(200, 200)) return 0;
    cacheTexture.setSmooth(true);

    sf::CircleShape shape(100.f, 75);
    shape.setFillColor(sf::Color::Green);

    cacheTexture.setActive(true);
    cacheTexture.draw(shape);

    cacheTexture.setActive(false);
    context.setActive(false); …
Run Code Online (Sandbox Code Playgroud)

c++ sfml

9
推荐指数
2
解决办法
237
查看次数

#leror gl.h包含在glew.h之前

所以我试图将我的OpenGL代码从Main()移动到一个特定的类中,该类只在必要时处理3D图形.以前,我的main.cpp文件的顶部看起来像这样:

#define GLEW_STATIC
#include <GL/glew.h>
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Game.h"
Run Code Online (Sandbox Code Playgroud)

这很好用.我试图做的是将所有与OpenGL相关的代码移到Game类的方法中.所以我删除#define GLEW_STATIC,并#include <GL/glew.h>从上面的,并把它们放到Game.h,这样Game.h的顶部,现在看起来是这样的:

#define GLEW_STATIC
#include <GL/glew.h>
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Environment.h"
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我得到标题错误,#error gl.h included before glew.h.

为什么会发生这种情况,如何在不发生这种情况的情况下(几乎)完全在特定类的函数内部使用OpenGL代码?

编辑:

我也在main.cpp中尝试过这个配置,试图确保在GLEW之前没有包含任何SFML.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include "Game.h"
#include <SFML/Graphics.hpp>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有帮助(没有其他任何内容,我在这里没有提到).

c++ opengl codeblocks include sfml

8
推荐指数
1
解决办法
2万
查看次数

OpenGL非常特定于机器

最近我开始在C++中使用OpenGL进行一些3D渲染,但奇怪的是它似乎只适用于几台机器.我正在使用OpenGL 3.0或更高版本(目前设置为3.0)使用顶点数组对象(不确定它是如何被调用的,但API修订版删除了glBegin,glEnd等).

在另一台机器上测试之前,我总是要求他们的GPU驱动程序,大多数都支持OpenGL 4.2,如果没有,我确保它们至少支持3.0.然而在某些机器上我的应用程序只是崩溃,或者没有渲染任何东西,OpenGL不会抛出任何错误(我每帧至少检查一次错误).虽然它在我自己的机器上工作得很好,但在某些情况下,我的机器甚至比某些机器上的机器还要老.

我开始只使用OpenGL本身和GLEW,但为了易于使用和我喜欢的其他一些功能切换到SFML和GLEW,OpenGL本身并没有改变它的行为.我确实重写了我正在处理的引擎来封装所有GL调用并合并顶点数组对象和其他一些功能,实际上我可以给你一个应用程序使用的所有API调用的列表.显然它并没有在测试应用程序中使用它们,但这些都是我在引擎中使用的所有调用(这是最小的能够渲染,所以是的,引擎甚至没有接近完成):

  • glAttachShader
  • glBindAttribLocation
  • glBindBuffer
  • glBindVertexArray
  • glBufferData
  • glBufferSubData
  • glClear
  • glClearColor
  • glClearDepth
  • glCompileShader
  • glCreateProgram
  • glCreateShader
  • glCullFace
  • glDeleteBuffers
  • glDeleteProgram
  • glDeleteShader
  • glDeleteVertexArrays
  • glDepthFunc
  • glDepthMask
  • glDepthRange
  • glDisableVertexAttribArray
  • glDrawElements
  • glEnable
  • glEnableVertexAttribArray
  • glFrontFace
  • glGenBuffers
  • glGenVertexArrays
  • glGetAttribLocation
  • glGetBufferParameteriv
  • glGetBufferSubData
  • glGetError
  • glGetIntegerv
  • glGetProgramInfoLog
  • glGetProgramiv
  • glGetShaderInfoLog
  • glGetShaderiv
  • glGetShaderSource
  • glGetUniformLocation
  • glIsProgram
  • glIsShader
  • glLinkProgram
  • glMapBufferRange
  • glPixelStorei
  • glShaderSource
  • glUniform(1i,1ui,1f,2f,3f,4f,Matrix3fv,Matrix4fv)
  • glUnmapBuffer
  • glUseProgram
  • glVertexAttrib(1i,1ui,1f,2f,3f,4f)
  • glVertexAttribPointer

简而言之,Shader和ShaderProgram部分没有什么特别之处,我有一些方法可以创建/编译它们,事先设置一些属性位置,最后设置属性/制服.缓冲区对象也没有什么特别之处,你可以编写,读取和映射缓冲区,目前我只使用GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER.最后我使用顶点数组对象实际渲染对象,显然我设置了属性指针,封装了绘制调用和程序用法,它总是使用索引绘图.

此外,我广泛搜索谷歌和堆栈溢出本身的答案.但是所有问题都与OpenGL无法在任何地方工作有关,例如,某些API调用未按顺序调用或根本不调用.遗憾的是,这些答案都不适用于我,它一直在我自己的机器和我可以直接访问的其他机器上工作,但是当我将应用程序发送给其他人在他们的机器上进行测试时,它从未起作用.

希望这是特定的XD

编辑,从下面的帖子复制

每个测试都在windows vista或7上完成.我已经对每个API调用进行了OpenGL错误检查,似乎没有任何错误.我无法在自己的机器上重现它,但在其他机器上进行了一些跟踪后,我发现它不会崩溃直到渲染.设置工作正常,它可以很好地创建所有缓冲区和对象,但是一旦我尝试渲染网格(VAO),它就会崩溃而没有任何错误(除了.exe已停止工作).我怀疑glUseProgram或glDrawElements命令

关于一个例子,除非你想搜索大约10个类,否则我不能给你一个简短的例子

编辑,渲染对象的微小代码

Mesh类将这些结构添加到对象中,因此它知道要绘制的内容:

// Define Geometry (draw command)
struct Geometry
{
    // Primitives
    PrimitiveType primitiveType;

    // Indices
    IndexType …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glew render sfml

8
推荐指数
1
解决办法
814
查看次数

让SFML Snake游戏对按键更敏感?

我找到了一个SFML C++蛇游戏,我一直在搞乱它并改变一些东西,但我无法弄清楚的一件事是如何通过箭头按键使其更平滑/响应.现在,它的使用enum Direction {Up, Down, Left, Right};

while (window.isOpen())
{

    sf::Vector2f lastPosition(snakeBody[0].getPosition().x, snakeBody[0].getPosition().y);

    // Event
    sf::Event event;
    while (window.pollEvent(event))
    {
        //.....

        if (event.type == sf::Event::KeyPressed && event.key.code
                == sf::Keyboard::Return)
        {
            //clock.restart;
            if (!currentlyPlaying)
                currentlyPlaying = true;
            move = Down;

            New_Game(snakeBody, window_width, window_height, engine, apple, score, scoreText, lowBounds);
            mode = 1;
            moveClock.restart();
            //start game
        }
            if(inputClock.getElapsedTime().asSeconds() >= 0.07)
            {
                if(event.key.code == sf::Keyboard::Up && move != Down)
                    move = Up;
                inputClock.restart();
                if(event.key.code == sf::Keyboard::Down && move != Up)
                    move = …
Run Code Online (Sandbox Code Playgroud)

keyboard performance sfml c++11

8
推荐指数
2
解决办法
623
查看次数

继承SFML中的Transformable和Drawable

我试图继承SFML中的Transformable和Drawable,以便使我的对象......好,可转换和可绘制.我正在制作一个简单的突破游戏,但也许我会以错误的方式解决这个问题.这是我的代码:

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>

class Player : public sf::Transformable, public sf::Drawable {
    public:
        Player(int x, int y);
        ~Player() {};

        sf::RectangleShape p_rect;

        void doMovement(const sf::RenderWindow& window);
        sf::FloatRect getGlobalBounds() const;
    private:
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const {
            states.transform *= getTransform();
            target.draw(p_rect, states);
        }

};

class Ball : public sf::Transformable, public sf::Drawable {
    public:
        Ball(int r, int x, int y);
        ~Ball() {};

        sf::CircleShape b_circle;

        void doXMovement();
        void doYMovement();
        bool doXCollisions(const Player& player);
        bool doYCollisions(const Player& player);
        sf::FloatRect getGlobalBounds() const;
    private: …
Run Code Online (Sandbox Code Playgroud)

c++ collision-detection game-physics sfml

7
推荐指数
1
解决办法
5289
查看次数