我试图使用OpenCV从网络摄像头抓取帧并使用SFML在窗口中显示它们.
VideoCapture以OpenCV的Mat格式返回帧.为了显示帧,SFML需要uint8格式的一维像素阵列,据我所知,它可与uchar互换.预计该阵列表示每像素RGBA 32位.
所以,我有一个uchar数组,我循环Mat数据并复制每个像素:
VideoCapture cap(0);
Mat frame;
cap >> frame;
uchar* camData = new uchar[640*480*4];
uchar* pixelPtr = frame.data;
for(int i = 0; i < frame.rows; i++)
{
for(int j = 0; j < frame.cols; j++)
{
camData[i*frame.cols + j + 2] = pixelPtr[i*frame.cols + j + 0]; // B
camData[i*frame.cols + j + 1] = pixelPtr[i*frame.cols + j + 1]; // G
camData[i*frame.cols + j + 0] = pixelPtr[i*frame.cols + j + 2]; // R
camData[i*frame.cols + j …Run Code Online (Sandbox Code Playgroud) 我为打扰你们而道歉,但我对cmake有一点编译问题.
我有一个CMakeLists.txt文件,我用它来构建一个测试可执行文件和一个共享库.它们都依赖于另一个库(SFML).
我在MinGW的窗口上使用cmake.
我知道我正在构建的lib的名称与sfml有点混淆,但它应该是一个SFML包装器,所以,我找不到更好的名字!
这里是CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(projectName)
set(EXECUTABLE_NAME testSFML)
set(LIBRARY_NAME SFMLwindow)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include /
${CMAKE_CURRENT_SOURCE_DIR}/../../include
)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/)
file(
GLOB_RECURSE
SRC_FILES
src/*
)
file(
GLOB_RECURSE
INCLUDE_FILES
include/*
)
add_executable(
${EXECUTABLE_NAME}
main.cpp
${SRC_FILES}
${INCLUDE_FILES}
)
target_link_libraries(
${EXECUTABLE_NAME}
sfml-main
sfml-system
sfml-window
)
add_library(
${LIBRARY_NAME}
SHARED
${SRC_FILES}
)
Run Code Online (Sandbox Code Playgroud)
我在终端得到了什么:
"C:\MinGW\bin\mingw32-make.exe"
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/iksemel/docs/WorkBench/programming/projets/TestSFML/cmake
Linking CXX shared library libSFMLwindow.dll
Creating library file: libSFMLwindow.dll.a
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x59):undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0xda): undefined reference to `_imp___ZN2sf6WindowC1ENS_9VideoModeERKSsjRKNS_15ContextSettingsE' …Run Code Online (Sandbox Code Playgroud) 我想知道如何在SFML中获取文本的尺寸?
我试着这样做:
sf::Text text("Hello SFML", font, 50);
// using text.getRect()
// i also tried getScale() & getSize()
// neither are correct
text.setPosition( window.getSize().y/2 - text.getRect().y,50 );
Run Code Online (Sandbox Code Playgroud)
有人知道吗 ?
谢谢 :)
我正在通过使用SFML和OpenGL制作一个小游戏来练习我的新手c ++技能.编程部分在大多数情况下都很好,但我对实际代码/类设计有疑问.
我有一个类,MainLoop,它包含游戏循环并拥有以下每个类的一个实例:事件,图形,命令,游戏和UI.我最初希望所有这些都是一个单独的类(在不同的.cpp文件中分隔函数),但被告知这是OOP/C++的错误方法.然而,虽然我可以看到分离它们的好方面(封装,模块化,调试),但我似乎也遇到了很多不好的东西.让我举一个用户按下UI按钮的例子.
首先,MainLoop从SFML的窗口类中获取事件.MainLoop将它发送到我自己的Event类,该类解释事件并将其发送到UI类以检查它是否"命中"了任何按钮.如果为true,则UI类将其发送到Command类,该类解释按钮命令.然后,最后,命令类将其发送到Game类或其他任何需要去的地方.
对我来说这一切看起来都非常苛刻,并且至少我此刻一直在做的方式,还需要很多前瞻性声明(在我了解那些我最终得到大量循环依赖之前) .我怀疑它对性能有多大好处.
无论如何,这里有一些我不知道的伎俩吗?这些课程应该如何联系,他们应该如何沟通?我应该如何将命令从事件类转发到UI类?我是否真的应该在任何地方都有前瞻性声明,包含和内容,这不会破坏模块化吗?我是否应该通过MainLoop类运行并使用不需要声明的整数/浮点数/字符转发返回值?我在这里有点不知所措.
我在SFML2中玩Box2D并实现了; 当我改变世界的引力时,未受影响的动态物体不会受到重力变化的影响.我准备了一个视频,使这个解释更加清晰.
有解决方案吗 我是否必须发挥自己的引力,为什么会发生这种情况?
我有一个简单的文件“main.cpp”,如下所示。我还在“C:\SFML-2.1\”下拥有所有 sfml 2.1 库。我的问题是:编译、链接和运行该项目的命令是什么?我非常习惯使用 g++ 从命令行编译项目,但之前从未使用任何外部库(例如 sfml)这样做过。任何帮助将不胜感激。谢谢。
#include <SFML/Window.hpp>
int main()
{
sf::Window window(sf::VideoMode(800, 600), "My window");
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在以下列方式编译我的c ++项目:
/usr/bin/i686-w64-mingw32-g++ -g -std=c++0x -Wall -I /home/bluszcz/dev/win64/SFML-2.1/include -L /home/bluszcz/dev/win64/SFML-2.1/lib -static-libgcc -static-libstdc++ -static -O4 -c src/game.cpp -o src/game.a -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行我的exe文件时,我得到关于丢失dll文件的错误:
bluszcz@zendo ~/dev/win32/builds/magicwizard $ wine mw.exe
err:module:import_dll Library libgcc_s_dw2-1.dll (which is needed by L"Z:\\home\\bluszcz\\dev\\win32\\builds\\magicwizard\\sfml-system-2.dll") not found
err:module:import_dll Library libgcc_s_sjlj-1.dll (which is needed by L"Z:\\home\\bluszcz\\dev\\win32\\builds\\magicwizard\\libstdc++-6.dll") not found
err:module:import_dll Library libwinpthread-1.dll (which is needed by L"Z:\\home\\bluszcz\\dev\\win32\\builds\\magicwizard\\libstdc++-6.dll") not found
err:module:import_dll Library libstdc++-6.dll (which is needed by L"Z:\\home\\bluszcz\\dev\\win32\\builds\\magicwizard\\sfml-system-2.dll") not found
err:module:import_dll Library sfml-system-2.dll (which is needed by L"Z:\\home\\bluszcz\\dev\\win32\\builds\\magicwizard\\sfml-audio-2.dll") not found
err:module:import_dll Library …Run Code Online (Sandbox Code Playgroud) 今天我决定下载,安装并尝试使用SFML 2.2.我还用MinGW编译器下载了Code :: Blocks.我设置了所有内容并正确安装了所有内容(或者我认为)并尝试运行示例代码以查看它是否可行:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码编译正确,虽然尝试运行它出现一个错误消息框说"程序入口点_ZSt24__throw_out_of_range_fmtPKcz无法位于动态链接库sfml-graphics-2.dll".我在网上搜索但没有发现任何与此问题有关的内容,所以我来到这里寻求帮助.感谢进一步的答案.
我想在我的项目中包含SFML源代码.我的目录布局如下:
main
SFML (subtree synced with the official git repo)
src
<various modules>
General (here lies the binary)
Run Code Online (Sandbox Code Playgroud)
从主要级别我首先添加SFML子目录然后再添加src.正如我看到构建日志,这产生了库:
sfml?system
sfml?window
sfml?network
sfml?graphics
sfml?audio
sfml?main
Run Code Online (Sandbox Code Playgroud)
现在我想将它们链接到General目录中的二进制文件,如下所示:
add_executable(main ${main_SRCS})
target_link_libraries (main
sfml?system
sfml?window
sfml?network
sfml?graphics
sfml?audio
sfml?main
# Other stuff here
)
Run Code Online (Sandbox Code Playgroud)
但我得到:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml?system
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml?window
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml?network
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml?graphics
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml?audio
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lsfml?main
Run Code Online (Sandbox Code Playgroud)
为什么CMake尝试使用系统库而不是刚刚构建的系统库,如何解决这个问题呢?
我使用CMake for MinGW编译了SFML.运行"mingw32-make install"后,所有内容都已构建并安装,没有任何错误.但是在运行示例时--pong.exe,sound.exe,sound-capture.exe和voip.exe都依赖于openal32.dll.
我SFML_USE_STATIC_LIBS = true在配置CMake时指定,示例可执行文件的所有其他依赖项仅在本机Windows dll上.
任何人都可以解释为什么它动态链接到openal32(但没有别的)?
编辑:我刚刚遇到了这个主题http://en.sfml-dev.org/forums/index.php?topic=262.0,它正在讨论完全相同的问题.我想(因为这是从2008年开始),现在已经实现了.还是它仍处于相同的情况?
编辑2:此处的响应http://en.sfml-dev.org/forums/index.php?topic=18119.0表明OpenAL必须由于许可证而动态链接.任何人都可以确认许可证是否允许使用可执行文件分发openal32.dll?