فهرست منبع

Import SDL2 hello world

DricomDragon 4 سال پیش
والد
کامیت
1fe5383fbf

+ 1 - 0
sdl2/simpleRotation/.gitignore

@@ -0,0 +1 @@
+HelloSDL

+ 16 - 0
sdl2/simpleRotation/CMakeLists.txt

@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.7)
+project(HelloSDL)
+
+#set(CMAKE_MODULE_PATH "/Users/nathan/Programmation/ressources/CMake")
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR})
+
+find_package(SDL2)
+find_package(SDL2_image)
+include_directories(${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR})
+
+set(CMAKE_CXX_STANDARD 11)
+
+set(SOURCE_FILES main.cpp texturer.h texturer.cpp Input.h Input.cpp)
+add_executable(HelloSDL ${SOURCE_FILES})
+
+target_link_libraries(HelloSDL ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY})

+ 173 - 0
sdl2/simpleRotation/FindSDL2.cmake

@@ -0,0 +1,173 @@
+
+# This module defines
+# SDL2_LIBRARY, the name of the library to link against
+# SDL2_FOUND, if false, do not try to link to SDL2
+# SDL2_INCLUDE_DIR, where to find SDL.h
+#
+# This module responds to the the flag:
+# SDL2_BUILDING_LIBRARY
+# If this is defined, then no SDL2main 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 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 -lSDL2main 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 SDL2 library
+# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
+# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
+# Similarly, if you see an empty SDL2MAIN_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 SDL2.
+# 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 SDL2main 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 SDL2/SDL.h to just SDL.h
+# This needed to change because "proper" SDL convention
+# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
+# reasons because not all systems place things in SDL2/ (see FreeBSD).
+
+#=============================================================================
+# Copyright 2003-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+# message("<FindSDL2.cmake>")
+
+SET(SDL2_SEARCH_PATHS
+	~/Library/Frameworks
+	/Library/Frameworks
+	/usr/local
+	/usr
+	/sw # Fink
+	/opt/local # DarwinPorts
+	/opt/csw # Blastwave
+	/opt
+	${SDL2_PATH}
+)
+
+FIND_PATH(SDL2_INCLUDE_DIR SDL.h
+	HINTS
+	$ENV{SDL2DIR}
+	PATH_SUFFIXES include/SDL2 include
+	PATHS ${SDL2_SEARCH_PATHS}
+)
+
+if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
+	set(PATH_SUFFIXES lib64 lib/x64 lib)
+else() 
+	set(PATH_SUFFIXES lib/x86 lib)
+endif() 
+
+FIND_LIBRARY(SDL2_LIBRARY_TEMP
+	NAMES SDL2
+	HINTS
+	$ENV{SDL2DIR}
+	PATH_SUFFIXES ${PATH_SUFFIXES}
+	PATHS ${SDL2_SEARCH_PATHS}
+)
+
+IF(NOT SDL2_BUILDING_LIBRARY)
+	IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
+		# Non-OS X framework versions expect you to also dynamically link to
+		# SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
+		# seem to provide SDL2main for compatibility even though they don't
+		# necessarily need it.
+		FIND_LIBRARY(SDL2MAIN_LIBRARY
+			NAMES SDL2main
+			HINTS
+			$ENV{SDL2DIR}
+			PATH_SUFFIXES ${PATH_SUFFIXES}
+			PATHS ${SDL2_SEARCH_PATHS}
+		)
+	ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
+ENDIF(NOT SDL2_BUILDING_LIBRARY)
+
+# SDL2 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(NOT APPLE)
+
+# MinGW needs an additional link flag, -mwindows
+# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows
+IF(MINGW)
+	SET(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "mwindows for MinGW")
+ENDIF(MINGW)
+
+IF(SDL2_LIBRARY_TEMP)
+	# For SDL2main
+	IF(NOT SDL2_BUILDING_LIBRARY)
+		IF(SDL2MAIN_LIBRARY)
+			SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP})
+		ENDIF(SDL2MAIN_LIBRARY)
+	ENDIF(NOT SDL2_BUILDING_LIBRARY)
+
+	# For OS X, SDL2 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(APPLE)
+
+	# 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(NOT APPLE)
+
+	# For MinGW library
+	IF(MINGW)
+		SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
+	ENDIF(MINGW)
+
+	# Set the final string here so the GUI reflects the final state.
+	SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found")
+	# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
+	SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "")
+ENDIF(SDL2_LIBRARY_TEMP)
+
+# message("</FindSDL2.cmake>")
+
+INCLUDE(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)

+ 100 - 0
sdl2/simpleRotation/FindSDL2_image.cmake

@@ -0,0 +1,100 @@
+# Locate SDL_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 SDL_image
+#
+#
+#
+# For backward compatibility the following variables are also set:
+#
+# ::
+#
+#   SDLIMAGE_LIBRARY (same value as SDL2_IMAGE_LIBRARIES)
+#   SDLIMAGE_INCLUDE_DIR (same value as SDL2_IMAGE_INCLUDE_DIRS)
+#   SDLIMAGE_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).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h
+        HINTS
+        ENV SDL2IMAGEDIR
+        ENV SDL2DIR
+        PATH_SUFFIXES SDL2
+        # path suffixes to search inside ENV{SDLDIR}
+        include/SDL2 include
+        PATHS ${SDL2_IMAGE_PATH}
+        )
+
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+    set(VC_LIB_PATH_SUFFIX lib/x64)
+else()
+    set(VC_LIB_PATH_SUFFIX lib/x86)
+endif()
+
+find_library(SDL2_IMAGE_LIBRARY
+        NAMES SDL2_image
+        HINTS
+        ENV SDL2IMAGEDIR
+        ENV SDL2DIR
+        PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
+        PATHS ${SDL2_IMAGE_PATH}
+        )
+
+if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h")
+    file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$")
+    file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+[0-9]+$")
+    file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+[0-9]+$")
+    string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}")
+    string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}")
+    string(REGEX REPLACE "^#define[ \t]+SDL_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})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image
+        REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS
+        VERSION_VAR SDL2_IMAGE_VERSION_STRING)
+
+# for backward compatibility
+set(SDLIMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES})
+set(SDLIMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS})
+set(SDLIMAGE_FOUND ${SDL2_IMAGE_FOUND})
+
+mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR)

+ 98 - 0
sdl2/simpleRotation/FindSDL2_ttf.cmake

@@ -0,0 +1,98 @@
+# Locate SDL_ttf library
+#
+# This module defines:
+#
+# ::
+#
+#   SDL2_TTF_LIBRARIES, the name of the library to link against
+#   SDL2_TTF_INCLUDE_DIRS, where to find the headers
+#   SDL2_TTF_FOUND, if false, do not try to link against
+#   SDL2_TTF_VERSION_STRING - human-readable string containing the version of SDL_ttf
+#
+#
+#
+# For backward compatibility the following variables are also set:
+#
+# ::
+#
+#   SDLTTF_LIBRARY (same value as SDL2_TTF_LIBRARIES)
+#   SDLTTF_INCLUDE_DIR (same value as SDL2_TTF_INCLUDE_DIRS)
+#   SDLTTF_FOUND (same value as SDL2_TTF_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).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+#  License text for the above reference.)
+
+find_path(SDL2_TTF_INCLUDE_DIR SDL_ttf.h
+        HINTS
+        ENV SDL2TTFDIR
+        ENV SDL2DIR
+        PATH_SUFFIXES SDL2
+        # path suffixes to search inside ENV{SDLDIR}
+        include/SDL2 include
+        PATHS ${SDL2_TTF_PATH}
+        )
+
+if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+    set(VC_LIB_PATH_SUFFIX lib/x64)
+else ()
+    set(VC_LIB_PATH_SUFFIX lib/x86)
+endif ()
+
+find_library(SDL2_TTF_LIBRARY
+        NAMES SDL2_ttf
+        HINTS
+        ENV SDL2TTFDIR
+        ENV SDL2DIR
+        PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
+        PATHS ${SDL2_TTF_PATH}
+        )
+
+if (SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h")
+    file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+[0-9]+$")
+    file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+[0-9]+$")
+    file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+[0-9]+$")
+    string(REGEX REPLACE "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MAJOR "${SDL2_TTF_VERSION_MAJOR_LINE}")
+    string(REGEX REPLACE "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MINOR "${SDL2_TTF_VERSION_MINOR_LINE}")
+    string(REGEX REPLACE "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_PATCH "${SDL2_TTF_VERSION_PATCH_LINE}")
+    set(SDL2_TTF_VERSION_STRING ${SDL2_TTF_VERSION_MAJOR}.${SDL2_TTF_VERSION_MINOR}.${SDL2_TTF_VERSION_PATCH})
+    unset(SDL2_TTF_VERSION_MAJOR_LINE)
+    unset(SDL2_TTF_VERSION_MINOR_LINE)
+    unset(SDL2_TTF_VERSION_PATCH_LINE)
+    unset(SDL2_TTF_VERSION_MAJOR)
+    unset(SDL2_TTF_VERSION_MINOR)
+    unset(SDL2_TTF_VERSION_PATCH)
+endif ()
+
+set(SDL2_TTF_LIBRARIES ${SDL2_TTF_LIBRARY})
+set(SDL2_TTF_INCLUDE_DIRS ${SDL2_TTF_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_ttf
+        REQUIRED_VARS SDL2_TTF_LIBRARIES SDL2_TTF_INCLUDE_DIRS
+        VERSION_VAR SDL2_TTF_VERSION_STRING)
+
+# for backward compatibility
+set(SDLTTF_LIBRARY ${SDL2_TTF_LIBRARIES})
+set(SDLTTF_INCLUDE_DIR ${SDL2_TTF_INCLUDE_DIRS})
+set(SDLTTF_FOUND ${SDL2_TTF_FOUND})

+ 153 - 0
sdl2/simpleRotation/Input.cpp

@@ -0,0 +1,153 @@
+#include "Input.h"
+
+
+// Constructeur et Destructeur
+Input::Input()
+        : m_x(0), m_y(0), m_xRel(0), m_yRel(0),
+          m_finished(false), m_relativeMouse(false), m_window(0), m_windowHalfHeight(0), m_windowHalfWidth(0) {
+    // Initialisation du tableau m_keys[]
+    for (int i(0); i < SDL_NUM_SCANCODES; i++)
+        m_keys[i] = false;
+
+    // Initialisation du tableau m_mouseKeys[]
+    for (int i(0); i < 8; i++)
+        m_mouseKeys[i] = false;
+}
+
+
+Input::~Input() {}
+
+
+// Méthodes
+void Input::updateEvents() {
+    // Réinitialise les coordonnées relatives
+    m_xRel = 0;
+    m_yRel = 0;
+
+    // Boucle d'évènements
+    while (SDL_PollEvent(&m_events)) {
+        // Switch sur le type d'évènement
+        switch (m_events.type) {
+            // Cas d'une touche enfoncée
+            case SDL_KEYDOWN:
+                m_keys[m_events.key.keysym.scancode] = true;
+                break;
+
+                // Cas d'une touche relâchée
+            case SDL_KEYUP:
+                m_keys[m_events.key.keysym.scancode] = false;
+                break;
+
+                // Cas de pression sur un bouton de la souris
+            case SDL_MOUSEBUTTONDOWN:
+                m_mouseKeys[m_events.button.button] = true;
+                break;
+
+                // Cas du relâchement d'un bouton de la souris
+            case SDL_MOUSEBUTTONUP:
+                m_mouseKeys[m_events.button.button] = false;
+                break;
+
+                // Cas d'un mouvement de souris
+            case SDL_MOUSEMOTION:
+                if (m_relativeMouse) {
+                    m_xRel = m_events.motion.x - m_windowHalfWidth;
+                    m_yRel = m_events.motion.y - m_windowHalfHeight;
+                } else {
+                    m_x = m_events.motion.x;
+                    m_y = m_events.motion.y;
+                    m_xRel = m_events.motion.xrel;
+                    m_yRel = m_events.motion.yrel;
+                }
+
+                break;
+
+                // Cas de la fermeture de la fenêtre
+            case SDL_WINDOWEVENT:
+                if (m_events.window.event == SDL_WINDOWEVENT_CLOSE)
+                    m_finished = true;
+                break;
+
+
+            default:
+                break;
+        }
+    }
+
+    // Pour éviter que la souris se barre en mode relative, on la "warp"
+    if (m_relativeMouse)
+        SDL_WarpMouseInWindow(m_window, m_windowHalfWidth, m_windowHalfHeight);
+}
+
+
+bool Input::isFinished() const {
+    return m_finished;
+}
+
+
+void Input::showCursor(bool reponse) const {
+    if (reponse)
+        SDL_ShowCursor(SDL_ENABLE);
+
+    else
+        SDL_ShowCursor(SDL_DISABLE);
+}
+
+
+void Input::capPtr(bool reponse) {
+    m_relativeMouse = reponse;
+}
+
+
+
+// Getters
+
+bool Input::getKey(const SDL_Scancode key) const {
+    return m_keys[key];
+}
+
+bool Input::getMouseKey(const Uint8 key) const {
+    return m_mouseKeys[key];
+}
+
+
+bool Input::isMouseMoving() const {
+    return !(m_xRel == 0 && m_yRel == 0);
+}
+
+
+// Getters concernant la position du curseur
+
+int Input::getX() const {
+    return m_x;
+}
+
+int Input::getY() const {
+    return m_y;
+}
+
+int Input::getXRel() const {
+    return m_xRel;
+}
+
+int Input::getYRel() const {
+    return m_yRel;
+}
+
+void Input::setWindow(SDL_Window *activWindow) {
+    // Attributio directe
+    m_window = activWindow;
+
+    // Détermination de l'endroit de capture du pointeur
+    SDL_GetWindowSize(activWindow, &m_windowHalfWidth, &m_windowHalfHeight);
+    m_windowHalfWidth /= 2;
+    m_windowHalfHeight /= 2;
+}
+
+int Input::getMouseRelX() const {
+    return m_xRel;
+}
+
+int Input::getMouseRelY() const {
+    return m_yRel;
+}

+ 59 - 0
sdl2/simpleRotation/Input.h

@@ -0,0 +1,59 @@
+#ifndef DEF_INPUT
+#define DEF_INPUT
+
+///Jovian
+///Adaptation pour CMake
+
+// Include
+#include <SDL.h>
+
+
+class Input
+{
+    public:
+
+    Input();
+    ~Input();
+
+    virtual void updateEvents();
+    bool isFinished() const;
+    void showCursor(bool reponse) const;
+    void capPtr(bool reponse);
+
+    bool getKey(const SDL_Scancode key) const;
+    bool getMouseKey(const Uint8 key) const;
+    bool isMouseMoving() const;
+
+    int getX() const;
+    int getY() const;
+
+    int getXRel() const;
+    int getYRel() const;
+
+    void setWindow(SDL_Window* activWindow);
+
+    int getMouseRelX() const;
+    int getMouseRelY() const;
+
+
+    protected:
+
+    SDL_Event m_events;
+    bool m_keys[SDL_NUM_SCANCODES];
+    bool m_mouseKeys[8];
+
+    int m_x;
+    int m_y;
+    int m_xRel;
+    int m_yRel;
+
+    bool m_finished;
+    bool m_relativeMouse;
+
+    SDL_Window* m_window;
+    int m_windowHalfHeight;
+    int m_windowHalfWidth;
+};
+
+#endif
+

BIN
sdl2/simpleRotation/base.jpg


BIN
sdl2/simpleRotation/cruiser.png


BIN
sdl2/simpleRotation/cruiser_ftl.png


BIN
sdl2/simpleRotation/cruiser_on.png


+ 177 - 0
sdl2/simpleRotation/main.cpp

@@ -0,0 +1,177 @@
+#include <iostream>
+#include <SDL.h>
+#include <cmath>
+#include "texturer.h"
+#include "Input.h"
+
+using namespace std;
+
+int main() {
+    // Start
+    cout << "SDL2 app is loading..." << endl;
+
+    // Useful data
+    const int SCREEN_WIDTH = 1200;
+    const int SCREEN_HEIGHT = 700;
+
+    // Init video
+    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
+        logSDLError(cout, "SDL_Init(SDL_INIT_VIDEO)");
+        return 1;
+    }
+
+    // Opening window
+    SDL_Window *win = SDL_CreateWindow("Hello SDL!",
+                                       SDL_WINDOWPOS_UNDEFINED,
+                                       SDL_WINDOWPOS_UNDEFINED,
+                                       SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
+    if (win == nullptr) {
+        logSDLError(cout, "SDL_CreateWindow");
+        SDL_Quit();
+        return 1;
+    }
+
+    // Create a renderer
+    SDL_Renderer *ren = SDL_CreateRenderer(win, -1,
+                                           SDL_RENDERER_ACCELERATED |
+                                           SDL_RENDERER_PRESENTVSYNC);
+    if (ren == nullptr) {
+        SDL_DestroyWindow(win);
+        logSDLError(cout, "SDL_CreateRenderer");
+        SDL_Quit();
+        return 1;
+    }
+
+    // Loading
+    const string file0("cruiser_on.png");
+    const string file1("cruiser.png");
+    const string file2("cruiser_ftl.png");
+    const string file3("base.jpg");
+    const string file4("pierres.bmp");
+    SDL_Texture *cruiser_on(loadTexture(file0, ren));
+    SDL_Texture *cruiser_off(loadTexture(file1, ren));
+    SDL_Texture *cruiser_ftl(loadTexture(file2, ren));
+    SDL_Texture *background1(loadTexture(file3, ren));
+    SDL_Texture *background2(loadTexture(file4, ren));
+    if (cruiser_on == nullptr || cruiser_off == nullptr || cruiser_ftl == nullptr ||
+        background1 == nullptr || background2 == nullptr) {
+
+        SDL_DestroyTexture(cruiser_on);
+        SDL_DestroyTexture(cruiser_off);
+        SDL_DestroyTexture(cruiser_ftl);
+        SDL_DestroyTexture(background1);
+        SDL_DestroyTexture(background2);
+        SDL_DestroyRenderer(ren);
+        SDL_DestroyWindow(win);
+        SDL_Quit();
+        return 1;
+    }
+
+    //Set standard alpha blending
+    SDL_SetTextureBlendMode(background1, SDL_BLENDMODE_BLEND);
+    SDL_SetTextureBlendMode(background2, SDL_BLENDMODE_BLEND);
+
+    // Events
+    Input myInput;
+
+    // Time
+    Uint32 prevTime(0);
+    Uint32 waitTime(1000 / 60);
+
+    // Drawing
+    SDL_Texture *cruiser(cruiser_off);
+    SDL_Texture *background(background1);
+
+    int backW, backH;
+    SDL_QueryTexture(background, NULL, NULL, &backW, &backH);
+    double angle(0.0);
+    float bx(0), by(0);
+    float speed(0.0f);
+    Uint8 ftlLevel(0);
+    bool ftlTriggered(false);
+
+    while (!myInput.isFinished()) {
+        // Update events
+        myInput.updateEvents();
+
+        // Movement
+        if (myInput.getMouseKey(1)) {
+            cruiser = cruiser_on;
+            speed += 0.05f;
+
+            if (ftlLevel > 0)
+                ftlLevel--;
+        } else if (myInput.getMouseKey(3)) {
+            if (ftlLevel < 255) {
+                ftlLevel++;
+            } else if (!ftlTriggered) {
+                ftlTriggered = true;
+                if (background == background1)
+                    background = background2;
+                else
+                    background = background1;
+                SDL_QueryTexture(background, NULL, NULL, &backW, &backH);
+            }
+            cruiser = cruiser_ftl;
+        } else {
+            cruiser = cruiser_off;
+            speed *= 0.99f;
+
+            if (ftlLevel > 0)
+                ftlLevel--;
+            else
+                ftlTriggered = false;
+        }
+
+        by += speed * sin(-angle * M_PI_2 / 90.0);
+        bx -= speed * cos(-angle * M_PI_2 / 90.0);
+
+        if (by < -backH)
+            by += backH;
+
+        if (by > 0)
+            by -= backH;
+
+        if (bx < -backW)
+            bx += backW;
+
+        if (bx > 0)
+            bx -= backW;
+
+        // Reset renderer
+        SDL_RenderClear(ren);
+
+        // Background
+        SDL_SetTextureAlphaMod(background, (Uint8) 255 - ftlLevel);
+
+        for (int x((int) bx); x < SCREEN_WIDTH; x += backW) {
+            for (int y((int) by); y < SCREEN_HEIGHT; y += backH) {
+                renderTexture(background, ren, x, y);
+            }
+        }
+
+        // Foreground
+        SDL_SetTextureColorMod(cruiser, (Uint8) 255 - ftlLevel, (Uint8) 255 - ftlLevel, 255);
+        angle = myInput.getX() * 360.0 / SCREEN_WIDTH + 90.0;
+        renderTexture(cruiser, ren, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, angle, true);
+
+        // Render
+        SDL_RenderPresent(ren);
+
+        // Pause
+        if (SDL_GetTicks() < prevTime + waitTime)
+            SDL_Delay(waitTime + prevTime - SDL_GetTicks());
+        prevTime = SDL_GetTicks();
+    }
+
+    // End
+    SDL_DestroyTexture(background1);
+    SDL_DestroyTexture(background2);
+    SDL_DestroyTexture(cruiser_on);
+    SDL_DestroyTexture(cruiser_off);
+    SDL_DestroyTexture(cruiser_ftl);
+    SDL_DestroyRenderer(ren);
+    SDL_DestroyWindow(win);
+    SDL_Quit();
+    return 0;
+}

BIN
sdl2/simpleRotation/pierres.bmp


+ 59 - 0
sdl2/simpleRotation/texturer.cpp

@@ -0,0 +1,59 @@
+//
+// Created by jovian on 16/07/17.
+//
+#include "texturer.h"
+
+void logSDLError(std::ostream &os, const std::string &msg) {
+    os << msg << " error: " << SDL_GetError() << std::endl;
+}
+
+SDL_Texture *loadTexture(const std::string &file, SDL_Renderer *ren) {
+    SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
+    if (texture == nullptr) {
+        logSDLError(std::cout, "LoadTexture");
+    }
+    return texture;
+}
+
+void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, bool centered) {
+    int w, h;
+    SDL_QueryTexture(tex, NULL, NULL, &w, &h);
+    renderTexture(tex, ren, x, y, w, h, centered);
+}
+
+void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, int w, int h, bool centered) {
+    SDL_Rect dst;
+    dst.x = x;
+    dst.y = y;
+    dst.w = w;
+    dst.h = h;
+
+    if (centered) {
+        dst.x -= dst.w / 2;
+        dst.y -= dst.h / 2;
+    }
+
+    SDL_RenderCopy(ren, tex, NULL, &dst);
+}
+
+void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, double angle, bool centered) {
+    int w, h;
+    SDL_QueryTexture(tex, NULL, NULL, &w, &h);
+    renderTexture(tex, ren, x, y, angle, w, h, centered);
+}
+
+void
+renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, double angle, int w, int h, bool centered) {
+    SDL_Rect dst;
+    dst.x = x;
+    dst.y = y;
+    dst.w = w;
+    dst.h = h;
+
+    if (centered) {
+        dst.x -= dst.w / 2;
+        dst.y -= dst.h / 2;
+    }
+
+    SDL_RenderCopyEx(ren, tex, NULL, &dst, angle, NULL, SDL_FLIP_NONE);
+}

+ 22 - 0
sdl2/simpleRotation/texturer.h

@@ -0,0 +1,22 @@
+//
+// Created by jovian on 16/07/17.
+//
+
+#ifndef HELLOSDL_TEXTURER_H
+#define HELLOSDL_TEXTURER_H
+
+#include <iostream>
+#include <SDL.h>
+#include <SDL_image.h>
+
+
+void logSDLError(std::ostream &os, const std::string &msg);
+
+SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren);
+
+void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, bool centered = false);
+void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, int w, int h, bool centered = false);
+void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, double angle, bool centered = false);
+void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, double angle, int w, int h, bool centered = false);
+
+#endif //HELLOSDL_TEXTURER_H