我目前正在尝试更多地了解C++中的面向对象设计(熟悉Java)并且遇到了一些问题.我试图在一个使用SFML构建的游戏中学习这些原理的项目用于图形和音频.我有以下两个文件.
WorldObject.h
#ifndef WORLDOBJECT_H
#define WORLDOBJECT_H
#include <SFML/Graphics.hpp>
#include <string>
#include "ImageManager.h"
class WorldObject
{
private:
sf::Sprite _sprite;
void SetImagePath(std::string path);
sf::Sprite GetGraphic();
};
#endif
Run Code Online (Sandbox Code Playgroud)
WorldObject.cpp
#include "WorldObject.h"
void WorldObject::SetImagePath(std::string path)
{
_sprite.SetImage(*gImageManager.getResource(path));
}
sf::Sprite GetGraphic()
{
return _sprite;
}
Run Code Online (Sandbox Code Playgroud)
我没有看到任何这些问题,但是当我尝试编译它们时,我从g ++收到以下错误:
WorldObject.cpp: In function ‘sf::Sprite GetGraphic()’:
WorldObject.cpp:9: error: ‘_sprite’ was not declared in this scope
make: *** [WorldObject.o] Error 1
Run Code Online (Sandbox Code Playgroud)
我在这段代码中缺少什么?试图理解设置继承层次结构的正确方法已经导致游戏开发中迄今为止遇到的大多数问题,但我知道这主要是因为我更习惯于使用Java的继承模型而不是C++的多重模型.继承模型.
我想学习如何使用cmake外部项目模块下载和编译外部库.
例如,假设我想从SFML库下载源代码https://github.com/LaurentGomila/SFML.git并进行编译.我尝试过使用以下内容.不幸的是,我无法弄清楚为什么它在源被克隆后没有编译:(
EXTERNALPROJECT_ADD(sfml
PREFIX ${sfml_PREFIX}
GIT_REPOSITORY https://github.com/LaurentGomila/SFML.git
INSTALL_DIR ${sfml_INSTALL_DIR}
CMAKE_ARGS ${sfml_CMAKE_ARGS})
Run Code Online (Sandbox Code Playgroud) 我使用SFML来创建窗口.
在此屏幕截图中,多维数据集应位于金字塔后面,但它不起作用.

这是我使用的最小代码:
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <SFML/Graphics.hpp>
#include "ResourcePath.hpp"
void resize();
void drawScene();
void initGL();
float rtri = 0;
float rquad = 0;
float z = -10.0f;
int main (int argc, const char * argv[])
{
// Create the main window
sf::RenderWindow *window = new sf::RenderWindow();
window->Create( sf::VideoMode( 800, 600, 32 ), "Collision Detection", sf::Style::Close );
sf::Event event;
bool run = true;
initGL();
resize();
while( run ) {
window->PollEvent( event );
if( event.Type == sf::Event::Closed ) …Run Code Online (Sandbox Code Playgroud) 我不会开始讨论哪个库更好,它会违反规则,但更多的是提出一系列技术问题.当我问是否有特殊技术时,只需说出技术的名称或链接.
别忘了,我还要比较SDL 1.2和SDL 1.3,而不仅仅是其中之一
哪个库有多个窗口支持?我已经知道SDL的答案:SDL 1.2,不,但是是的
哪些库是多线程安全的?
大多数速度测试是在SDL和allegro使用软件加速时完成的,但现在SDL 1.3,allegro 5和sfml在速度方面使用硬件加速,它们如何比较?
哪个库可以同时检测多个键盘?有没有特殊的技术呢?
有没有办法将结果集成到GTK窗口中?如果是,是否有任何特殊技术?(我记得上次我使用SDL 1.2时,我无法做到这一点......)
哪个库支持3d?(使用openGL)
如果我将X库与OpenGL用于图形,是否会有限制,或者更多/更少的功能?(我的意思是,对于所有这些库,使用opengl的图形是否相同?)
我可以静态链接到哪些库?
最后,有些图书馆更倾向于特定的游戏风格吗?(像制作RPG时更喜欢使用X库,而制作策略游戏,基于游戏的游戏时更多使用Y库...)
不要忘记SDL 1.2和SDL 1.3
编辑:
我将尝试分享我发现的所有内容,从我的研究中,随时为我的问题提供更多答案.
多窗口:SDL 1.3,SFML无多窗口:SDL 1.2
多线程安全:Allegro 5,SFML
不是多线程安全:
速度:未知
不止一个按键支持:SFML,Allegro 5
我写了一个迷你客户端 - 服务器游戏,在我的计算机上运行正常(运行linux),因为我在客户端和服务器上安装了SFML(和GCC 4.8).现在我想将服务器应用程序部署到另一个没有SFML的Linux上.
首先,我尝试动态链接使用的SFML库(网络和系统):
g++ server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network -lsfml-system
Run Code Online (Sandbox Code Playgroud)
但是,当我运行Server应用程序时,它说它无法找到sfml-network.so.2和sfml-system.so.2,即使这两个文件位于二进制文件的同一文件夹中.
然后我静态链接两个库:
g++ -DSFML_STATIC server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network-s -lsfml-system-s
Run Code Online (Sandbox Code Playgroud)
然后当我运行它说它找不到GLIBC_2.15和GLIBC_2.17
最后在我的最后一次尝试中我将libstc ++和libgcc静态链接:
g++ -DSFML_STATIC server.cpp -o ServerLinux -std=c++11 -Os -lsfml-network-s -lsfml-system-s -static-libstdc++ -static-libgcc
Run Code Online (Sandbox Code Playgroud)
但我仍然得到相同的错误(找不到GLIBC_2.15和GLIBC_2.17).
阅读类似的问题似乎永远不应该静态链接glibc.但我不知道如何继续,如何将我的迷你游戏服务器部署到没有SFML的Linux机器上?
我最近安装了 SFML 2.1,并尝试从终端(而不是 Xcode)编译和运行,这是他们网站上的示例程序,网址为http://www.sfml-dev.org/tutorials/2.0/start-linux。 php .
Path to where I installed SFML:
/Users/.../Desktop/C++_Code/SMFL/SFML-2.1-osx-gcc-universal
Run Code Online (Sandbox Code Playgroud)
但是,我不断收到以下错误:
Undefined symbols for architecture x86_64:
"sf::String::String(char const*, std::__1::locale const&)", referenced from:
_main in window-48cb4a.o
Run Code Online (Sandbox Code Playgroud)
谷歌搜索后,我遇到了这个问题:SFML 2.1 RenderWindow linking error
在接受的答案中,该人说如果我想使用g++,我必须下载“GCC”版本。因此,我继续下载 GCC - 通用 32+64 位(OS X 10.5+)版本,然后按照在 Linux 上安装和编译 SFML 的说明进行操作,因为没有适用于 mac 的说明(http://www.sfml-dev .org/tutorials/2.0/start-linux.php)通过执行以下操作:
由于我已将 SFML 安装在非标准位置,因此我告诉编译器在哪里可以找到头文件,如下所示:
-I /Users/.../Desktop/C++_Code/SMFL/SFML-2.1-osx-gcc-universal/Frameworks/SFML.framework/Headers
Run Code Online (Sandbox Code Playgroud)
我还必须告诉编译器在哪里可以找到 SMFL 库:
-L /Users/.../Desktop/C++_Code/SMFL/SFML-2.1-osx-gcc-universal/lib
Run Code Online (Sandbox Code Playgroud)
我还需要告诉库加载器从哪里找到 SFML 库:
export LD_LIBRARY_PATH=/Users/.../Desktop/C++_Code/SMFL/SFML-2.1-osx-gcc-universal/lib
Run Code Online (Sandbox Code Playgroud)
然后,我将 sfml-audio.framework、sfml-window.framework、sfml-graphics.framework、sfml-network.framework 和 sfml-system.framework 放入我的 Frameworks 目录 (/Library/Frameworks) 中。
最后,我尝试通过以下方式编译我的程序:
g++ window.cpp -I …
我有一个包含纹理的文件.我加载它sf::Texture并分成精灵setTextureRect.
现在假设一个精灵包含20像素宽的纹理部分.如何渲染它以适应例如213像素的宽度.我能想到的唯一方法是渲染它sf::RenderTexture并用另一个精灵来裁剪它.
有一个更好的方法吗?
我SFML 2.3用来控制程序中的图形.我需要一个类才能访问窗口,即使该类不是最初创建窗口的类(没有所有权)也可以绘制它.例如,Battle班级需要能够绘制战斗场景并操纵角色,但是World班级需要前后窗口Battle来显示玩家在主游戏中的移动.
如何处理窗口对象?我最初的想法是拥有一个GameMaster将窗口作为静态成员的类.但是,考虑到通常的共识是什么,我认为最好不要错误地使用这种方法.
我意识到我总是可以将窗口的引用传递给需要它的每个类,但这会使所有需要操作窗口的类的构造函数变得非常膨胀.
我遇到了一个又一个 SFML 问题,但希望它最终是值得的。
这是错误:
致命错误:SFML/Graphics.hpp:没有这样的文件或目录
和代码:
#include < SFML/Graphics.hpp >
#include < SFML/Window.hpp >
int main(){
sf::RenderWindow Window;
Window.create(sf::VideoMode(800, 600), "SFML");
while(Window.isOpen()){
sf::Event Event;
while(Window.pollEvent(Event)){
if(Event.type == sf::Event::Closed)
Window.close();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我很困惑为什么我会收到这个警告。我的整个代码中都没有枚举?
#include <SFML/Graphics.hpp>
#include <vector>
using sf::RenderWindow;
using sf::VideoMode;
using sf::Event;
using std::vector;
using sf::Vector2f;
using sf::RectangleShape;
using sf::CircleShape;
using sf::Color;
using sf::Keyboard;
int main()
{
RenderWindow window(VideoMode(720, 640), "Shooter game w Projectiles.");
window.setFramerateLimit(60);
CircleShape player(50.f);
player.setFillColor(Color::White);
player.setPosition((window.getSize().x / 2.f) - (player.getRadius()), (window.getSize().y - player.getRadius() * 2) - 10.f);
CircleShape bullet(5.f);
bullet.setFillColor(Color::Red);
vector<CircleShape> playerBullets;
playerBullets.push_back(bullet);
RectangleShape enemy(Vector2f(30.f, 30.f));
enemy.setFillColor(Color::Magenta);
enemy.setPosition(320, 200);
vector<RectangleShape> enemies;
enemies.push_back(enemy);
enemy.setFillColor(Color::Blue);
enemy.setPosition(160, 100);
enemies.push_back(enemy);
while (window.isOpen())
{
Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed) …Run Code Online (Sandbox Code Playgroud)