我最近开始学习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的名称.据我搜索,并通过猜测尝试,我没有成功使绘图功能与我的精灵在另一个文件上工作.我觉得我错过了一些大的,非常明显的(在任何一个文件上),但是再一次,每个职业选手都曾经是一个新手.
我试图用最新版本的qt创建器设置SFML 2.0,我已经设置了SFML,我导入了一个我在visual studio中编写的小游戏.编译后,我得到这个:

我尝试了什么
额外细节
我正在运行Windows XP SP3,最新版本的mingw和qt SDK以及SFML
我正在尝试使用的代码在Visual Studio 2010 和 Code :: Blocks 上没有任何错误甚至警告
我自己没有编译SFML
我的gcc版本是4.6.2
我的gcc是DW2
我没有得到任何结果,我甚至不知道如何远程接近解决这个问题,甚至不知道从哪里开始.
编辑 我无法向您展示我的所有代码,它是超过20个文件,我几乎90%确定它不是我的代码,我上面说过:我可以运行此代码,没有任何警告甚至任何IDE上的错误除了qt创建者.
我目前正在尝试按照教程为自上而下的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 …
当我这样做(在我班上)
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_eyes是sf::Sprite对象和/或参考.
为什么这不起作用?声明不一样吗?
我有问题,但我不知道如何描述它所以我画了它.

当你发现碰撞时你可以看到球弹跳.没关系角度 - 我刚刚那样画了.但有时球会穿过桨而离开它.
为什么会这样?当我发现碰撞时,我将vx更改为-vx.在那种情况下我该怎么办?也改变了吗?但是如何检查桨球的哪一侧击中?
也许其他想法?
所以我正在编写一个程序,其中对象围绕着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) 我不使用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) 我正在使用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) 在我的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)).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) 根据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)