标签: sfml

如何调用另一个文件上找到的函数?

我最近开始学习C++和SFML库,我想知道我是否在一个名为"player.cpp"的文件上定义了一个Sprite,如何在位于"main.cpp"的主循环上调用它?

这是我的代码(请注意,这是SFML 2.0,而不是1.6!).

main.cpp中

#include "stdafx.h"
#include <SFML/Graphics.hpp>
#include "player.cpp"

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "Skylords - Alpha v1");

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw();
        window.display();
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

player.cpp

#include "stdafx.h"
#include <SFML/Graphics.hpp>

int playerSprite(){
    sf::Texture Texture;
    if(!Texture.loadFromFile("player.png")){
        return 1;
    }
    sf::Sprite Sprite;
    Sprite.setTexture(Texture);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要帮助的main.cpp地方window.draw();在我的绘图代码中所说的位置.在该括号中,应该有我想要加载到屏幕上的Sprite的名称.据我搜索,并通过猜测尝试,我没有成功使绘图功能与我的精灵在另一个文件上工作.我觉得我错过了一些大的,非常明显的(在任何一个文件上),但是再一次,每个职业选手都曾经是一个新手.

c++ identifier sfml

60
推荐指数
2
解决办法
11万
查看次数

无法初始化GLEW.缺少GL版本

我试图用最新版本的qt创建器设置SFML 2.0,我已经设置了SFML,我导入了一个我在visual studio中编写的小游戏.编译后,我得到这个:

在此输入图像描述

我尝试了什么

  • 从头开始重新安装整个qt SDK和qt creator IDE
  • 重新安装SFML
  • 重新安装mingw
  • 我试着编写一个简单的程序来确保它不是我的代码,程序编译正确但是当我关闭应用程序时,我得到的OpenGL错误不正常
  • 我尝试在SFML论坛上发帖,但无济于事.
  • 谷歌搜索错误显示一些特定于OpenGL的结果,并且过于本地化,它们不适用于我,在SFML 2.0中没有回答这个问题

额外细节

  • 我正在运行Windows XP SP3,最新版本的mingw和qt SDK以及SFML

  • 我正在尝试使用的代码在Visual Studio 2010 Code :: Blocks 上没有任何错误甚至警告

  • 是的,我确信在我的IDE上设置了SFML,基本代码可以正常运行,但是显示了这些错误,更高级的代码将所有精灵和文本显示为框.
  • 我自己没有编译SFML

  • 我的gcc版本是4.6.2

  • 我的gcc是DW2

我没有得到任何结果,我甚至不知道如何远程接近解决这个问题,甚至不知道从哪里开始.

编辑 我无法向您展示我的所有代码,它是超过20个文件,我几乎90%确定它不是我的代码,我上面说过:我可以运行此代码,没有任何警告甚至任何IDE上的错误除了qt创建者.

c++ opengl glew qt-creator sfml

22
推荐指数
3
解决办法
2万
查看次数

矢量不是模板?

我目前正在尝试按照教程为自上而下的RPG制作一个简单的2D磁贴引擎.出于某种原因,虽然我得到了智能感知错误

vector is not a template

"向量"一词用红色加下划线.为什么这不起作用?为什么它告诉我它是一个模板,为什么程序不起作用?

#ifndef _IMAGEMANAGER_H
#define _IMAGEMANAGER_H

#include <vector>
#include <SFML\Graphics.hpp>

class ImageManager
{
private:
    vector<sf::Texture> textureList;

public:
    ImageManager();
    ~ImageManager();

    void AddTexture(sf::Texture& texture);
    sf::Texture& GetTexture(int index);
};
#endif
Run Code Online (Sandbox Code Playgroud)

我得到的错误(毫无疑问,其中一些错误来自上面这部分的错误):

  • 错误1错误C2143:语法错误:缺少';' 在'<'c:\ users\vipar\dropbox\computer science\programming\visual studio 2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误2错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int c:\ users\vipar\dropbox\computer
    science\programming\visual studio
    2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误3错误C2238:';'之前的意外令牌 c:\ users\vipar\dropbox\computer science\programming\visual studio 2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误4错误C2143:语法错误:缺少';' 在'<'c:\ users\vipar\dropbox\computer science\programming\visual studio 2012\projects\sfml-app\sfml-app\imagemanager.h 10 1 sfml-app

  • 错误5错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int c:\ users\vipar\dropbox\computer
    science\programming\visual studio
    2012\projects\sfml-app\sfml-app\imagemanager.h 10 …

c++ vector sfml

22
推荐指数
2
解决办法
4万
查看次数

在一行上声明多个对象指针会导致编译器错误

当我这样做(在我班上)

public:
    Entity()
    {
        re_sprite_eyes = new sf::Sprite();
        re_sprite_hair = new sf::Sprite();
        re_sprite_body = new sf::Sprite();
    }

private:
    sf::Sprite* re_sprite_hair;
    sf::Sprite* re_sprite_body;
    sf::Sprite* re_sprite_eyes;
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,如果我将声明更改为:

private:
    sf::Sprite* re_sprite_hair, re_sprite_body, re_sprite_eyes;
Run Code Online (Sandbox Code Playgroud)

我得到这个编译器错误:

error: no match for 'operator=' in '((Entity*)this)->Entity::re_sprite_eyes = (operator new(272u), (<statement>, ((sf::Sprite*)<anonymous>)))
Run Code Online (Sandbox Code Playgroud)

然后它说候选人re_sprite_eyessf::Sprite对象和/或参考.

为什么这不起作用?声明不一样吗?

c++ oop sfml

21
推荐指数
3
解决办法
2万
查看次数

乒乓物理问题

我有问题,但我不知道如何描述它所以我画了它.

乒乓物理图形

当你发现碰撞时你可以看到球弹跳.没关系角度 - 我刚刚那样画了.但有时球会穿过桨而离开它.

为什么会这样?当我发现碰撞时,我将vx更改为-vx.在那种情况下我该怎么办?也改变了吗?但是如何检查桨球的哪一侧击中?

也许其他想法?

c++ math physics sfml

18
推荐指数
2
解决办法
3240
查看次数

使用四元数进行OpenGL旋转

所以我正在编写一个程序,其中对象围绕着spaceim风格移动,以便学习如何在3D空间中平滑地移动物体.在稍微弄清楚欧拉角度之后,看起来它们并不适合任意方向的自由形式3D运动,所以我决定继续寻找最适合这项工作的东西 - 四元数.我打算让对象始终围绕其局部XYZ轴旋转,而不是围绕全局XYZ轴旋转.

我试图使用四元数实现旋转系统,但有些东西不起作用.沿单轴旋转物体时,如果没有进行先前的旋转,则物体沿给定轴旋转精细.但是,当执行一个接一个的旋转后,第二个旋转并不总是沿着它应该旋转的局部轴 - 例如,绕Z轴旋转约90°后,围绕Y轴旋转仍然发生在全局Y轴周围,而不是与全局X轴对齐的新的局部Y轴.

呵呵.让我们一步一步来看看.错误必须在某处.

第1步 - 捕获输入

我认为最好使用Euler角度(或Pitch-Yaw-Roll方案)来捕捉玩家输入.此时,箭头键控制俯仰和偏航,而Q和E控制滚动.我捕获了播放器输入(我正在使用SFML 1.6):

    ///SPEEDS
    float ForwardSpeed = 0.05;
    float TurnSpeed = 0.5;

    //Rotation
    sf::Vector3<float> Rotation;
    Rotation.x = 0;
    Rotation.y = 0;
    Rotation.z = 0;
    //PITCH
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Up) == true)
    {
        Rotation.x -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Down) == true)
    {
        Rotation.x += TurnSpeed;
    }
    //YAW
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Left) == true)
    {
        Rotation.y -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Right) == true)
    {
        Rotation.y += TurnSpeed;
    }
    //ROLL
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Q) == true)
    {
        Rotation.z -= TurnSpeed; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d quaternions sfml

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

2D等距 - SFML - 正确的公式,错误的坐标范围

我不使用tile,而是使用sf :: Vertex绘制的多维数据集.每个立方体有6个边,每个边有4个点. 在此输入图像描述

所以我只需要cubes[numCube].sides()[numSide]....选择一个方面.

我创建了立方体layer.cpp:

for(int J = 0; J < mapSize; J++)
    {
        for(int I = 0; I < mapSize; I++)
        {
            x = (J - I) * (cubeSize/2);
            y = (J + I) * (cubeSize/4);

            c = new cube(cubeSize, x, y, z, I, J);
            cs.push_back(*c);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在cube.cpp中我创建了侧面,然后,在sides.cpp中,我像这样计算每个点的坐标:

switch(typeSide)
{
    case 0://DOWN_SIDE
        light = 1;

        tmp_x = x + (size/2);
        tmp_y = y + (size/2);
        p0 = new point(tmp_x, tmp_y, tmp_z);

        tmp_x = x + size; …
Run Code Online (Sandbox Code Playgroud)

c++ linear-equation isometric sfml

18
推荐指数
1
解决办法
632
查看次数

使用SFML在屏幕上居中显示文本

我正在使用Ubuntu 12.10上的SFML 2.0库

sudo apt-get install libsfml-dev
Run Code Online (Sandbox Code Playgroud)

得到他们.现在我试图让sf :: Text在sreen中居中.为此,我将文本的原点(用于进行转换的位置,如设置位置,旋转等)设置为sf :: Text的边界框的中心,然后将位置设置为屏幕中心,如下:

//declare text
sf::Font font;
sf::Text text;
font.loadFromFile("helvetica.ttf");
text.setFont(font);
text.setString("RANDOMTEXT");
text.setCharacterSize(100);
text.setColor(sf::Color::White);
text.setStyle(sf::Text::Regular);

//center text
sf::FloatRect textRect = text.getLocalBounds();
text.setOrigin(textRect.width/2,textRect.height/2);
text.setPosition(sf::Vector2f(SCRWIDTH/2.0f,SCRHEIGHT/2.0f));
Run Code Online (Sandbox Code Playgroud)

这不起作用,文本偏离一些量,如x轴为3,y轴为25.奇怪的是,如果您设置一个sf :: RectangleShape来表示文本的边界框,那么该矩形将居中并且大小正确以适合文本.但是,然后使用前面提到的偏移量从该框中抽出文本.

在这张图片中,我标记了屏幕的中心,在文本边界框的位置绘制了sf :: RectangleShape,以及sf :: Text.

http://i.imgur.com/4jzMouj.png

该图像是由以下代码生成的:

const int SCRWIDTH = 800; 
const int SCRHEIGHT = 600;

int main() {
sf::RenderWindow window;
window.create(sf::VideoMode(SCRWIDTH,SCRHEIGHT), "MYGAME" ,sf::Style::Default);
window.setMouseCursorVisible(false);
window.setVerticalSyncEnabled(true);

sf::Font font;
sf::Text text;
font.loadFromFile("helvetica.ttf");
text.setFont(font);
text.setString("RANDOMTEXT");
text.setCharacterSize(100);
text.setColor(sf::Color::White);
text.setStyle(sf::Text::Regular);

sf::FloatRect textRect = text.getLocalBounds();

text.setOrigin(textRect.width/2,textRect.height/2);
text.setPosition(sf::Vector2f(SCRWIDTH/2.0f,SCRHEIGHT/2.0f));

sf::RectangleShape rect(sf::Vector2f(textRect.width,textRect.height)); …
Run Code Online (Sandbox Code Playgroud)

c++ linux 2d sfml

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

sf ::以错误的方式应用的纹理

在我的2D等距引擎中,我有以下类:

`maps(variable)/layers(variable)/cubes(variable)/sides(6)/points(4)/coordinates(3)`
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 每个sides包含4 points(1 point= 1 coordinate(x,y,z)).
  • 每个立方体包含6个边.
  • 我可以用立方体创建一个我想要的尺寸的地图(相同,我想要的尺寸).

Folers:

assets/numTexture/numLight.png
Run Code Online (Sandbox Code Playgroud)

我用numTexture和numLight计算一个数字,它是textureNumberEntry(我在数组中加载了所有numLight.png(纹理)).

但纹理化的错误是错误的:

在此输入图像描述

我在图层类中定义了立方体坐标:

for(int J = 0; J < mapSize; J++)
{
    for(int I = 0; I < mapSize; I++)
    {
        x = (J - I) * (cubeSize/2);
        y = (J + I) * (cubeSize/4);

        c = new cube(cubeSize, x, y, z, I, J);
        cs.push_back(*c);
    }
}
Run Code Online (Sandbox Code Playgroud)

在side.cpp中,我在sideType上有一个开关(如果它是顶部,左边等等......我用不同的方式定义我的点'坐标).每个立方体我有6个(这里只有数据)像这样:

    switch(typeSide)
        {
            case 0://DOWN_SIDE
                light = 0;

                tmp_x = x + (size/2);
                tmp_y = y + …
Run Code Online (Sandbox Code Playgroud)

c++ textures isometric sfml

14
推荐指数
1
解决办法
512
查看次数

有没有一个很好的方法用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
查看次数