Mac 上使用 cpack 捆绑的应用程序不接受键盘事件

问题描述 投票:0回答:1

sfml cmake 项目的 我的 fork 上,我正在尝试使用 cpack

 创建适用于 macOS 的应用程序包。我已成功复制所需的共享库。但是,没有键盘输入传递到应用程序。我修改了示例代码,使其具有一个圆圈,您可以使用箭头键移动它来测试它。

我设置了这些 cpack 属性

cmake_minimum_required(VERSION 3.16) project(CMakeSFMLProject LANGUAGES CXX VERSION 1.0.0) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) option(BUILD_SHARED_LIBS "Build shared libraries" ON) include(FetchContent) FetchContent_Declare(sfml GIT_REPOSITORY https://github.com/SFML/SFML.git GIT_TAG 2.6.x) set(CPACK_SOURCE_IGNORE_FILES ${sfml_SOURCE_DIR}) if (NOT sfml_POPULATED) FetchContent_Populate(sfml) add_subdirectory(${sfml_SOURCE_DIR} ${sfml_BINARY_DIR} EXCLUDE_FROM_ALL) endif() add_executable(CMakeSFMLProject src/main.cpp) target_link_libraries(CMakeSFMLProject PRIVATE sfml-graphics) target_compile_features(CMakeSFMLProject PRIVATE cxx_std_17) if(WIN32) add_custom_command( TARGET CMakeSFMLProject COMMENT "Copy OpenAL DLL" PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SFML_SOURCE_DIR}/extlibs/bin/$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,x64,x86>/openal32.dll $<TARGET_FILE_DIR:CMakeSFMLProject> VERBATIM) endif() set(OS_NAME "MacOS") set(CPACK_GENERATOR "ZIP;DragNDrop") set_target_properties(CMakeSFMLProject PROPERTIES MACOSX_BUNDLE TRUE INSTALL_RPATH "@executable_path/../Frameworks" ) if(APPLE) # Set the install name directory for shared libraries to be relative to the executable set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks") # Copy SFML shared libraries into the app bundle install(DIRECTORY ${SFML_BINARY_DIR}/lib/ DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_PROJECT_NAME}.app/Contents/Frameworks FILES_MATCHING PATTERN "*.dylib") # Create a macOS app bundle set(MACOS_BUNDLE_BUNDLE_NAME ${CMAKE_PROJECT_NAME}) set(MACOS_BUNDLE_GUI_IDENTIFIER "com.example.${CMAKE_PROJECT_NAME}") set(MACOS_BUNDLE_ICON_FILE "") set(MACOS_BUNDLE_BUNDLE_VERSION "1.0.0") set(MACOS_BUNDLE_SHORT_VERSION_STRING "1.0.0") install(TARGETS CMakeSFMLProject BUNDLE DESTINATION . COMPONENT Runtime) endif() # Set the CPack properties set(CPACK_BUNDLE_NAME "Example") set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}-${OS_NAME}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Example") set(CPACK_PACKAGE_VENDOR "SFML") set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md") set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.md") set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}") include(CPack)
包装内容看起来正确

:: tree CMakeSFMLProject.app CMakeSFMLProject.app └── Contents ├── Frameworks │ ├── libsfml-audio.2.6.1.dylib │ ├── libsfml-audio.2.6.dylib -> libsfml-audio.2.6.1.dylib │ ├── libsfml-audio.dylib -> libsfml-audio.2.6.dylib │ ├── libsfml-graphics.2.6.1.dylib │ ├── libsfml-graphics.2.6.dylib -> libsfml-graphics.2.6.1.dylib │ ├── libsfml-graphics.dylib -> libsfml-graphics.2.6.dylib │ ├── libsfml-network.2.6.1.dylib │ ├── libsfml-network.2.6.dylib -> libsfml-network.2.6.1.dylib │ ├── libsfml-network.dylib -> libsfml-network.2.6.dylib │ ├── libsfml-system.2.6.1.dylib │ ├── libsfml-system.2.6.dylib -> libsfml-system.2.6.1.dylib │ ├── libsfml-system.dylib -> libsfml-system.2.6.dylib │ ├── libsfml-window.2.6.1.dylib │ ├── libsfml-window.2.6.dylib -> libsfml-window.2.6.1.dylib │ └── libsfml-window.dylib -> libsfml-window.2.6.dylib ├── Info.plist └── MacOS └── CMakeSFMLProject
但是,当我运行应用程序包时,没有键盘事件传递到应用程序。但如果我打开捆绑包中的二进制文件,一切都会正常。

如何正确地将应用程序与 cpack 捆绑在一起并仍然允许它接受键盘事件?

cmake
1个回答
0
投票
在实际代码中我使用了

isKeyPressed

,这显然很糟糕。仅使用事件修复它

类似的东西

sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); if (event.type == sf::Event::KeyPressed) { if (event.key.code == sf::Keyboard::Right) { shape.move(moveSpeed, 0); } if (event.key.code == sf::Keyboard::Left) { shape.move(-moveSpeed, 0); } if (event.key.code == sf::Keyboard::Up) { shape.move(0, -moveSpeed); } if (event.key.code == sf::Keyboard::Down) { shape.move(0, moveSpeed); } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.