From 0d3f858f9a1a93bc8f8c7107ce118c5e4cd70795 Mon Sep 17 00:00:00 2001 From: dayu521 <1357662066@qq.com> Date: Wed, 8 Dec 2021 20:28:42 +0800 Subject: [PATCH 1/2] fixed: failed to find sdl2 library when compiled on archlinux --- CMakeLists.txt | 9 +- cmake/FindSDL2.cmake | 203 ++++++++++++++++++++++++++++++++++++- cmake/FindSDL2_image.cmake | 115 +++++++++++++++++---- cmake/FindSDL2_ttf.cmake | 6 +- 4 files changed, 303 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d987ba..096d611 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,10 +2,12 @@ cmake_minimum_required(VERSION 3.16) project(smb) +#for linux +#https://stackoverflow.com/questions/28395833/using-sdl2-with-cmake?answertab=votes#tab-top set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") -find_package(SDL2_mixer REQUIRED) find_package(SDL2 REQUIRED) +find_package(SDL2_mixer REQUIRED) find_package(SDL2_image REQUIRED) find_package(SDL2_ttf REQUIRED) @@ -26,5 +28,8 @@ set_property(TARGET smb PROPERTY CXX_STANDARD 17) set_target_properties(smb PROPERTIES OUTPUT_NAME smb-${CMAKE_BUILD_TYPE}) target_include_directories(smb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_include_directories(smb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/vendor) -target_link_libraries(smb PRIVATE ${SDL2_MIXER_LIBRARY} ${SDL2} ${SDL2_IMAGE} ${SDL2_TTF}) +target_link_libraries(${PROJECT_NAME} PRIVATE ${SDL2_LIBRARIES} ${SDL2_MIXER_LIBRARY} ${SDL2_IMAGE_LIBRARIES} ${SDL2_TTF}) +if(UNIX AND NOT APPLE) + target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_DL_LIBS}) +endif() diff --git a/cmake/FindSDL2.cmake b/cmake/FindSDL2.cmake index 443369f..769c78e 100644 --- a/cmake/FindSDL2.cmake +++ b/cmake/FindSDL2.cmake @@ -1,9 +1,202 @@ +#from https://trenki2.github.io/blog/2017/06/02/using-sdl2-with-cmake/ + +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindSDL2 +# ------- +# +# Locate SDL2 library +# +# This module defines +# +# :: +# +# SDL2_LIBRARY, the name of the library to link against +# SDL2_FOUND, if false, do not try to link to SDL +# SDL2_INCLUDE_DIR, where to find SDL.h +# SDL2_VERSION_STRING, human-readable string containing the version of SDL +# +# +# +# This module responds to the flag: +# +# :: +# +# SDL2_BUILDING_LIBRARY +# If this is defined, then no SDL2_main will be linked in because +# only applications need main(). +# Otherwise, it is assumed you are building an application and this +# module will attempt to locate and set the proper link flags +# as part of the returned SDL2_LIBRARY variable. +# +# +# +# Don't forget to include SDLmain.h and SDLmain.m your project for the +# OS X framework based version. (Other versions link to -lSDLmain which +# this module will try to find on your behalf.) Also for OS X, this +# module will automatically add the -framework Cocoa on your behalf. +# +# +# +# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your +# configuration and no SDL2_LIBRARY, it means CMake did not find your SDL +# library (SDL.dll, libsdl.so, SDL.framework, etc). Set +# SDL2_LIBRARY_TEMP to point to your SDL library, and configure again. +# Similarly, if you see an empty SDLMAIN_LIBRARY, you should set this +# value as appropriate. These values are used to generate the final +# SDL2_LIBRARY variable, but when these values are unset, SDL2_LIBRARY +# does not get created. +# +# +# +# $SDL2DIR is an environment variable that would correspond to the +# ./configure --prefix=$SDL2DIR used in building SDL. l.e.galup 9-20-02 +# +# Modified by Eric Wing. Added code to assist with automated building +# by using environmental variables and providing a more +# controlled/consistent search behavior. Added new modifications to +# recognize OS X frameworks and additional Unix paths (FreeBSD, etc). +# Also corrected the header search path to follow "proper" SDL +# guidelines. Added a search for SDLmain which is needed by some +# platforms. Added a search for threads which is needed by some +# platforms. Added needed compile switches for MinGW. +# +# On OSX, this will prefer the Framework version (if found) over others. +# People will have to manually change the cache values of SDL2_LIBRARY to +# override this selection or set the CMake environment +# CMAKE_INCLUDE_PATH to modify the search paths. +# +# Note that the header path has changed from SDL/SDL.h to just SDL.h +# This needed to change because "proper" SDL convention is #include +# "SDL.h", not . This is done for portability reasons +# because not all systems place things in SDL/ (see FreeBSD). + +if(NOT SDL2_DIR) + set(SDL2_DIR "" CACHE PATH "SDL2 directory") +endif() + +find_path(SDL2_INCLUDE_DIR SDL.h + HINTS + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + include/SDL2 include +) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(VC_LIB_PATH_SUFFIX lib/x64) + set(VC_LIB_PATH_SUFFIX lib/x64) else() - set(VC_LIB_PATH_SUFFIX lib/x86) + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +find_library(SDL2_LIBRARY_TEMP + NAMES SDL2 + HINTS + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} +) + +# Hide this cache variable from the user, it's an internal implementation +# detail. The documented library variable for the user is SDL2_LIBRARY +# which is derived from SDL2_LIBRARY_TEMP further below. +set_property(CACHE SDL2_LIBRARY_TEMP PROPERTY TYPE INTERNAL) + +if(NOT SDL2_BUILDING_LIBRARY) + if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") + # Non-OS X framework versions expect you to also dynamically link to + # SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms + # seem to provide SDLmain for compatibility even though they don't + # necessarily need it. + find_library(SDL2MAIN_LIBRARY + NAMES SDL2main + HINTS + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS + /sw + /opt/local + /opt/csw + /opt + ) + endif() +endif() + +# SDL may require threads on your system. +# The Apple build may not need an explicit flag because one of the +# frameworks may already provide it. +# But for non-OSX systems, I will use the CMake Threads package. +if(NOT APPLE) + find_package(Threads) endif() -# find_package finds and runs /usr/local/Cellar/sdl2/2.0.12_1/lib/cmake/SDL2/sdl2-config.cmake -find_package(SDL2 PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) -set(SDL2 SDL2::SDL2-static) \ No newline at end of file +# MinGW needs an additional link flag, -mwindows +# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -mwindows +if(MINGW) + set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") +endif() + +if(SDL2_LIBRARY_TEMP) + # For SDLmain + if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) + list(FIND SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" _SDL2_MAIN_INDEX) + if(_SDL2_MAIN_INDEX EQUAL -1) + set(SDL2_LIBRARY_TEMP "${SDLMAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP}) + endif() + unset(_SDL2_MAIN_INDEX) + endif() + + # For OS X, SDL uses Cocoa as a backend so it must link to Cocoa. + # CMake doesn't display the -framework Cocoa string in the UI even + # though it actually is there if I modify a pre-used variable. + # I think it has something to do with the CACHE STRING. + # So I use a temporary variable until the end so I can set the + # "real" variable in one-shot. + if(APPLE) + set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") + endif() + + # For threads, as mentioned Apple doesn't need this. + # In fact, there seems to be a problem if I used the Threads package + # and try using this line, so I'm just skipping it entirely for OS X. + if(NOT APPLE) + set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) + endif() + + # For MinGW library + if(MINGW) + set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) + endif() + + # Set the final string here so the GUI reflects the final state. + set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found") +endif() + +if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") + set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) + unset(SDL2_VERSION_MAJOR_LINE) + unset(SDL2_VERSION_MINOR_LINE) + unset(SDL2_VERSION_PATCH_LINE) + unset(SDL2_VERSION_MAJOR) + unset(SDL2_VERSION_MINOR) + unset(SDL2_VERSION_PATCH) +endif() + +set(SDL2_LIBRARIES ${SDL2_LIBRARY} ${SDL2MAIN_LIBRARY}) +set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR}) + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 + REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) diff --git a/cmake/FindSDL2_image.cmake b/cmake/FindSDL2_image.cmake index 82324bf..9788735 100644 --- a/cmake/FindSDL2_image.cmake +++ b/cmake/FindSDL2_image.cmake @@ -1,27 +1,102 @@ -# Find path to the include (header) files ######### -find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h PATH_SUFFIXES SDL2 include/SDL2 include) -set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR}) +#from https://trenki2.github.io/blog/2017/07/04/using-sdl2-image-with-cmake/ + +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindSDL2_image +# ------------- +# +# Locate SDL2_image library +# +# This module defines: +# +# :: +# +# SDL2_IMAGE_LIBRARIES, the name of the library to link against +# SDL2_IMAGE_INCLUDE_DIRS, where to find the headers +# SDL2_IMAGE_FOUND, if false, do not try to link against +# SDL2_IMAGE_VERSION_STRING - human-readable string containing the +# version of SDL2_image +# +# +# +# For backward compatibility the following variables are also set: +# +# :: +# +# SDL2IMAGE_LIBRARY (same value as SDL2_IMAGE_LIBRARIES) +# SDL2IMAGE_INCLUDE_DIR (same value as SDL2_IMAGE_INCLUDE_DIRS) +# SDL2IMAGE_FOUND (same value as SDL2_IMAGE_FOUND) +# +# +# +# $SDLDIR is an environment variable that would correspond to the +# ./configure --prefix=$SDLDIR used in building SDL. +# +# Created by Eric Wing. This was influenced by the FindSDL.cmake +# module, but with modifications to recognize OS X frameworks and +# additional Unix paths (FreeBSD, etc). -# Find path to the library (static) ############### +if(NOT SDL2_IMAGE_INCLUDE_DIR AND SDL2IMAGE_INCLUDE_DIR) + set(SDL2_IMAGE_INCLUDE_DIR ${SDL2IMAGE_INCLUDE_DIR} CACHE PATH "directory cache entry initialized from old variable name") +endif() +find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h + HINTS + ENV SDL2IMAGEDIR + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + include/SDL2 include +) -if (CMAKE_SIZEOF_VOID_P EQUAL 8) - set(VC_LIB_PATH_SUFFIX lib/x64) -else () - set(VC_LIB_PATH_SUFFIX lib/x86) -endif () +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() -# cmake respects the order of extensions specified on {CMAKE_FIND_LIBRARY_SUFFIXES} when looking for libraries -SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) +if(NOT SDL2_IMAGE_LIBRARY AND SDL2IMAGE_LIBRARY) + set(SDL2_IMAGE_LIBRARY ${SDL2IMAGE_LIBRARY} CACHE FILEPATH "file cache entry initialized from old variable name") +endif() +find_library(SDL2_IMAGE_LIBRARY + NAMES SDL2_image + HINTS + ENV SDL2IMAGEDIR + ENV SDL2DIR + ${SDL2_DIR} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} +) + +if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}") + set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH}) + unset(SDL2_IMAGE_VERSION_MAJOR_LINE) + unset(SDL2_IMAGE_VERSION_MINOR_LINE) + unset(SDL2_IMAGE_VERSION_PATCH_LINE) + unset(SDL2_IMAGE_VERSION_MAJOR) + unset(SDL2_IMAGE_VERSION_MINOR) + unset(SDL2_IMAGE_VERSION_PATCH) +endif() + +set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY}) +set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR}) -find_library(SDL2_IMAGE_LIBRARY NAMES SDL2_image PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) +include(FindPackageHandleStandardArgs) -# SDL2_image intrinsic dependencies -find_library(PNGLIB png PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) -find_library(JPEG jpeg PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) -find_library(TIFF tiff PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) -find_library(WEBP webp PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) -find_library(ZLIB z PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image + REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS + VERSION_VAR SDL2_IMAGE_VERSION_STRING) -set(SDL2_IMAGE ${PNGLIB} ${JPEG} ${TIFF} ${WEBP} ${ZLIB} ${SDL2_IMAGE_LIBRARY}) +# for backward compatibility +set(SDL2IMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES}) +set(SDL2IMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS}) +set(SDL2IMAGE_FOUND ${SDL2_IMAGE_FOUND}) -include_directories(${SDL2_IMAGE_INCLUDE_DIRS}) \ No newline at end of file +mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR) diff --git a/cmake/FindSDL2_ttf.cmake b/cmake/FindSDL2_ttf.cmake index 7caf028..fea142e 100644 --- a/cmake/FindSDL2_ttf.cmake +++ b/cmake/FindSDL2_ttf.cmake @@ -1,5 +1,5 @@ # Find path to the include (header) files ######### -find_path(SDL2_TTF_INCLUDE_DIR SDL_TTF.h PATH_SUFFIXES SDL2 include/SDL2 include) +find_path(SDL2_TTF_INCLUDE_DIR SDL_ttf.h PATH_SUFFIXES SDL2 include/SDL2 include) set(SDL2_TTF_INCLUDE_DIRS ${SDL2_TTF_INCLUDE_DIR}) # Find path to the library (static) ############### @@ -15,7 +15,7 @@ endif () list(APPEND CMAKE_PREFIX_PATH "/usr/local/opt/bzip2/bin/") -find_library(SDL2_TTF_LIBRARY NAMES SDL2_TTF PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) +find_library(SDL2_TTF_LIBRARY NAMES SDL2_ttf PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) # SDL2_TTF intrinsic dependencies find_library(FREETYPE freetype PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) @@ -23,4 +23,4 @@ find_library(BZIP bz2 PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}) set(SDL2_TTF ${FREETYPE} ${BZIP} ${SDL2_TTF_LIBRARY}) -include_directories(${SDL2_TTF_INCLUDE_DIRS}) \ No newline at end of file +include_directories(${SDL2_TTF_INCLUDE_DIRS}) From 06390d9bab770a8e34d9ecc8c4373939528ee2d7 Mon Sep 17 00:00:00 2001 From: dayu521 <1357662066@qq.com> Date: Wed, 4 May 2022 12:42:41 +0800 Subject: [PATCH 2/2] xx --- include/Components.h | 3 ++- include/Constants.h | 6 ++++-- include/scenes/IntroScene.h | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/Components.h b/include/Components.h index 784c379..5a526d1 100644 --- a/include/Components.h +++ b/include/Components.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include "ecs/ecs.h" #include "SDL.h" @@ -385,4 +386,4 @@ struct CameraComponent : public Component { return y + height / 2; } -}; \ No newline at end of file +}; diff --git a/include/Constants.h b/include/Constants.h index 4e55260..1381cd9 100644 --- a/include/Constants.h +++ b/include/Constants.h @@ -1,6 +1,8 @@ #pragma once constexpr int FPS = 60; -constexpr int ZOOM = 4; +//constexpr int ZOOM = 4; +constexpr int ZOOM = 2; + constexpr int FRAME_DURATION = 1000 / FPS; constexpr int SNES_RESOLUTION_WIDTH = 256; @@ -32,4 +34,4 @@ constexpr float MARIO_BOUNCE = 4.0f; // when jumping on top of enemies constexpr int TILE_ROUNDNESS = 4; constexpr float MUSHROOM_GROW_SPEED = .25f; -constexpr float MUSHROOM_MOVE_SPEED = 0.8f; \ No newline at end of file +constexpr float MUSHROOM_MOVE_SPEED = 0.8f; diff --git a/include/scenes/IntroScene.h b/include/scenes/IntroScene.h index 657d1d3..18b8bf1 100644 --- a/include/scenes/IntroScene.h +++ b/include/scenes/IntroScene.h @@ -1,3 +1,6 @@ +#ifndef INTROSCENE_H_INCLUDED +#define INTROSCENE_H_INCLUDED + #include "scenes/Scene.h" class IntroScene : public Scene { @@ -11,4 +14,5 @@ class IntroScene : public Scene { private: int timer = 0; -}; \ No newline at end of file +}; +#endif // INTROSCENE_H_INCLUDED