diff --git a/.github/workflows/doxygen.yaml b/.github/workflows/doxygen.yaml new file mode 100644 index 0000000..da162ff --- /dev/null +++ b/.github/workflows/doxygen.yaml @@ -0,0 +1,23 @@ +on: + push: + branches: [ main ] + +permissions: + contents: write + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: 'true' # might need recursive, tbd + - name: Doxygen Action + uses: mattnotmitt/doxygen-action@v1.1.0 + # defaults to ./Doxygen + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./docs/html diff --git a/.gitignore b/.gitignore index 31d3def..f50581f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,6 @@ build/ *.app # Generated by Visual Studio -.vscode/ .vs/ *.suo *.user @@ -56,7 +55,22 @@ build/ # Sublime Text *.sublime-workspace -*.sublime-project + +# Created by https://www.gitignore.io/api/visualstudiocode +# Edit at https://www.gitignore.io/?templates=visualstudiocode + +### VisualStudioCode ### +.vscode/* # Maybe .vscode/**/* instead - see comments +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### VisualStudioCode Patch ### +# Ignore all local history of files +**/.history + +# End of https://www.gitignore.io/api/visualstudiocode # macOS .DS_Store @@ -75,3 +89,7 @@ Desktop.ini compile_commands.json *.puml + +docs/latex/ +docs/html/ +docs/diagrams/ diff --git a/.gitmodules b/.gitmodules index bfa520c..a0c91fc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,6 @@ path = extern/SDL_ttf url = https://github.com/libsdl-org/SDL_ttf.git branch = release-2.22.x +[submodule "docs/doxygen-awesome-css"] + path = docs/doxygen-awesome-css + url = https://github.com/jothepro/doxygen-awesome-css.git diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..4de5278 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "debug", + "type": "cppdbg", + "miDebuggerPath": "c:\\mingw64\\bin\\gdb.exe", + "request": "launch", + "program": "${workspaceFolder}/build/SDL_Minigame.exe", + "cwd": "${workspaceFolder}", + "preLaunchTask": "build-debug" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..10708b6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cmake.configureOnOpen": true, + "editor.tabSize": 4, + "editor.insertSpaces": true, +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..6647c0b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,67 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "shell", + "label": "build-engine-debug", + "command": "cd build; cmake -DCMAKE_BUILD_TYPE=Debug; cmake --build .", + "problemMatcher": [], + "group": "build" + }, + { + "type": "shell", + "label": "build-engine", + "command": "cd build; cmake -DCMAKE_BUILD_TYPE=Release; cmake --build .", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "docker-build", + "label": "build-doxygen", + "dockerBuild": { + "context": "${workspaceRoot}/docs/docker", + "tag": "vego_doxygen-docker", + }, + "problemMatcher": [], + }, + { + "type": "docker-run", + "label": "gen-doxygen", + "dockerRun": { + "image": "vego_doxygen-docker", + "remove": true, + "volumes": [ + { + "localPath": "${workspaceFolder}", + "containerPath": "/source" + }, + { + "localPath": "${workspaceFolder}/docs", + "containerPath": "/output" + }, + { + "localPath": "${workspaceFolder}/docs/Doxyfile", + "containerPath": "/Doxyfile" + }, + ] + }, + "problemMatcher": [], + }, + { + "type": "process", + "label": "open-doxygen", + "command": "explorer", + "windows": { + "command": "explorer.exe" + }, + "args": ["${workspaceFolder}\\docs\\html\\index.html"], + "problemMatcher": [], + "dependsOn": "gen-doxygen", + } + ] +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 1905143..08e3c8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,8 +34,8 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ) if(CMAKE_BUILD_TYPE MATCHES "Debug") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -fno-omit-frame-pointer") - target_link_libraries(${PROJECT_NAME} PRIVATE "-fsanitize=address") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") # -fsanitize=address -fno-omit-frame-pointer") + #target_link_libraries(${PROJECT_NAME} PRIVATE "-fsanitize=address") endif() diff --git a/Doxyfile b/docs/Doxyfile similarity index 98% rename from Doxyfile rename to docs/Doxyfile index f3a09ee..a1de95c 100644 --- a/Doxyfile +++ b/docs/Doxyfile @@ -42,13 +42,13 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "My Project" +PROJECT_NAME = "VEGO-Engine" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = +PROJECT_NUMBER = 0.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -67,14 +67,14 @@ PROJECT_LOGO = # when the HTML document is shown. Doxygen will copy the logo to the output # directory. -PROJECT_ICON = +PROJECT_ICON = assets/chicken_neutral_knight.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = +OUTPUT_DIRECTORY = docs # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format @@ -396,7 +396,7 @@ AUTOLINK_SUPPORT = YES # diagrams that involve STL classes more complete and accurate. # The default value is: NO. -BUILTIN_STL_SUPPORT = NO +BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. @@ -842,7 +842,7 @@ CITE_BIB_FILES = # messages are off. # The default value is: NO. -QUIET = NO +QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES @@ -949,7 +949,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = +INPUT = ./include ./src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -989,63 +989,15 @@ INPUT_FILE_ENCODING = # be provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, # *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cxxm \ - *.cpp \ - *.cppm \ - *.ccm \ - *.c++ \ - *.c++m \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.idl \ - *.ddl \ - *.odl \ +FILE_PATTERNS = *.cpp \ *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.ixx \ - *.l \ - *.cs \ - *.d \ - *.php \ - *.php4 \ - *.php5 \ - *.phtml \ - *.inc \ - *.m \ - *.markdown \ - *.md \ - *.mm \ - *.dox \ - *.py \ - *.pyw \ - *.f90 \ - *.f95 \ - *.f03 \ - *.f08 \ - *.f18 \ - *.f \ - *.for \ - *.vhd \ - *.vhdl \ - *.ucf \ - *.qsf \ - *.ice + *.hpp # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a @@ -1084,14 +1036,17 @@ EXCLUDE_SYMBOLS = # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = ./include \ + ./src # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. -EXAMPLE_PATTERNS = * +EXAMPLE_PATTERNS = *.cpp \ + *.h \ + *.hpp # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands @@ -1325,7 +1280,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = docs/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1365,7 +1320,10 @@ HTML_STYLESHEET = # documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = docs/doxygen-awesome-css/doxygen-awesome.css \ + docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css \ + docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css \ + docs/custom.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1375,7 +1333,10 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js \ + docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js \ + docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js \ + docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. @@ -1388,7 +1349,7 @@ HTML_EXTRA_FILES = # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE = AUTO_LIGHT +HTML_COLORSTYLE = LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to @@ -1716,7 +1677,7 @@ DISABLE_INDEX = NO # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_TREEVIEW = NO +GENERATE_TREEVIEW = YES # When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the # FULL_SIDEBAR option determines if the side bar is limited to only the treeview @@ -2502,7 +2463,7 @@ HIDE_UNDOC_RELATIONS = YES # set to NO # The default value is: NO. -HAVE_DOT = NO +HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed # to run in parallel. When set to 0 doxygen will base this on the number of @@ -2639,7 +2600,7 @@ DOT_WRAP_THRESHOLD = 17 # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -TEMPLATE_RELATIONS = NO +TEMPLATE_RELATIONS = YES # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # YES then doxygen will generate a graph for each documented file showing the @@ -2727,7 +2688,7 @@ DIR_GRAPH_MAX_DEPTH = 1 # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_IMAGE_FORMAT = png +DOT_IMAGE_FORMAT = SVG # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. @@ -2739,13 +2700,13 @@ DOT_IMAGE_FORMAT = png # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -INTERACTIVE_SVG = NO +INTERACTIVE_SVG = YES # The DOT_PATH tag can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = +DOT_PATH = /usr/bin/dot # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile diff --git a/docs/Doxyfile.bak b/docs/Doxyfile.bak new file mode 100644 index 0000000..cf23eae --- /dev/null +++ b/docs/Doxyfile.bak @@ -0,0 +1,63 @@ +# Doxyfile + +# Project information +PROJECT_NAME = "SDL Minigame" +PROJECT_NUMBER = "1.0" +PROJECT_ICON = assets/chicken_neutral_knight.png +OUTPUT_DIRECTORY = docs + +OPTIMIZE_OUTPUT_FOR_C = YES +EXTRACT_ALL = NO +EXTRACT_LOCAL_CLASSES = YES + +CLASS_DIAGRAMS = YES + +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +DOT_PATH = /usr/bin/dot + +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +UML_LOOK = YES +UML_LIMIT_NUM_FIELDS = 50 +TEMPLATE_RELATIONS = YES +DOT_TRANSPARENT = YES + +# Source files +INPUT = ./include ./src +FILE_PATTERNS = *.cpp *.h *.hpp +EXAMPLE_PATH = ./include ./src +EXAMPLE_PATTERNS = *.cpp *.h *.hpp + +# Output formats +GENERATE_XML = YES +GENERATE_HTML = YES +DOT_IMAGE_FORMAT = SVG +COLLABORATION_GRAPH = YES +GENERATE_LATEX = NO + +# Extra settings +USE_MATHJAX = YES +CALL_GRAPH = YES +CALLER_GRAPH = YES +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = YES +EXTRACT_ANON_NSPACES = YES +SHOW_FILES = YES +SHOW_INCLUDE_FILES = YES +SHOW_USED_FILES = YES +RECURSIVE = YES + +# Class diagram options +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DISABLE_INDEX = YES +GENERATE_TREEVIEW = YES +HTML_COLLABORATION = YES + +# idk everything else +TAB_SIZE = 4 \ No newline at end of file diff --git a/docs/custom.css b/docs/custom.css new file mode 100644 index 0000000..720b3bd --- /dev/null +++ b/docs/custom.css @@ -0,0 +1,54 @@ +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #bd93f9; + --primary-dark-color: #9270e4; + --primary-light-color: #9270e4; + + /* page base colors */ + --page-background-color: #ffffff; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #6f7e8e; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #bd93f965; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 22px; + --border-radius-small: 9px; + --border-radius-medium: 14px; + + /* default spacings. Most components reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 8px; + --spacing-medium: 14px; + --spacing-large: 19px; + + --top-height: 125px; + + ... +} + +html.dark-mode { + color-scheme: dark; + + --primary-color: #bd93f9; + --primary-dark-color: #9270e4; + --primary-light-color: #9270e4; + --primary-lighter-color: #191e21; + --primary-lightest-color: #191a1c; + + --page-background-color: #21222c; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #3a3246; + --side-nav-background: #282a36; + --side-nav-foreground: #f8f8f2; + --toc-background: #282A36; + --searchbar-background: var(--page-background-color); + + ... +} + +.paramname em { + font-weight: 600; + color: var(--primary-dark-color); +} \ No newline at end of file diff --git a/docs/diagrams/.clang-uml b/docs/diagrams/.clang-uml deleted file mode 100644 index f987536..0000000 --- a/docs/diagrams/.clang-uml +++ /dev/null @@ -1,62 +0,0 @@ -compilation_database_dir: ../.. -output_directory: . -diagrams: - - includes: - type: include - relative_to: ../.. - glob: - - src/*.cpp - - include/*.h - generate_system_headers: true - include: - paths: - - src - - include - plantuml: - before: - - 'skinparam linetype ortho' - - includes_no_external: - type: include - relative_to: ../.. - glob: - - src/*.cpp - - include/*.h - include: - paths: - - src - - include - plantuml: - before: - - 'skinparam linetype ortho' - - classes: - type: class - relative_to: ../.. - glob: - - src/*.cpp - - include/*.h - include: - paths: - - src - - include - plantuml: - before: - - 'skinparam linetype ortho' - - load_map_example_sequence: - type: sequence - relative_to: ../.. - glob: - - src/*.cpp - - include/*.h - include: - paths: - - src - - include - start_from: - - function: "Map::loadMap(const char *,int,int)" - plantuml: - before: - - 'skinparam linetype ortho' \ No newline at end of file diff --git a/docs/diagrams/classes.svg b/docs/diagrams/classes.svg deleted file mode 100644 index df3320a..0000000 --- a/docs/diagrams/classes.svg +++ /dev/null @@ -1 +0,0 @@ -Component~Component() constexpr = default : voiddraw() : voidinit() : voidupdate() : voidentity : Entity *Vector2DVector2D() : voidVector2D(float x, float y) : voidoperator*(const int & i) : Vector2D &zero() : Vector2D &x : floaty : floatColliderComponentColliderComponent(const char * tag) : voidColliderComponent(const char * tag, float hitboxScale) : voidhandleCollision(Vector2D & characterPos, SDL_Rect & characterCollider, SDL_Rect & componentCollider) : voidinit() : voidremoveCollision() : voidupdate() : voidcollider : SDL_RecthasCollision : boolhitboxScale : floatisProjectile : booltag : const char *transform : TransformComponent *GroupLabelMAPTILESPLAYERSENEMIESCOLLIDERSPROJECTILEHEARTSPOWERUPSTeamLabelNONEBLUEREDEntityEntity(Manager & mManager) : voidaddComponent<T,TArgs...>(TArgs &&... mArgs) : T &addGroup(Group mGroup) : voiddelGroup(Group mGroup) : voiddestroy() : voiddraw() const : voidgetComponent<T>() const : T &getGroupBitSet() : std::bitset<MAX_GROUPS>getManager() : Manager &getTeam() : TeamLabelhasComponent<T>() const : _BoolhasGroup(Group mGroup) : boolisActive() const : boolsetTeam(TeamLabel teamLabel) : voidupdate() const : voidactive : boolcomponentArray : ComponentArraycomponentBitSet : ComponentBitSetcomponents : std::vector<std::unique_ptr<Component>>groupBitSet : GroupBitSetmanager : Manager &teamLabel : TeamLabelPowerupTypeHEARTWALKINGSPEEDSHOOTINGSPEEDAssetManagerAssetManager(Manager * manager) : void~AssetManager() : voidaddSoundEffect(std::string id, const char * path) : voidaddTexture(std::string id, const char * path) : voidcalculateSpawnPosition() : Vector2DcalculateType() : PowerupTypecreatePowerup(Vector2D pos, PowerupType type) : voidcreateProjectile(Vector2D pos, Vector2D velocity, int scale, int range, int speed, const char * texturePath, TeamLabel teamLabel) : voidgetSound(std::string id) : Mix_Chunk *getTexture(std::string id) : SDL_Texture *man : Manager *soundEffects : std::map<std::string,Mix_Chunk *>textures : std::map<std::string,SDL_Texture *>TextureDictpowerupDictionary : std::map<PowerupType,std::string>tileDictionary : const std::map<int,std::string>TileComponentTileComponent() = default : voidTileComponent(int x, int y, int w, int h, int id) : void~TileComponent() = default : voidinit() : voidpath : const char *sprite : SpriteComponent *textureDict : TextureDicttileID : inttileRect : SDL_Recttransform : TransformComponent *TransformComponentTransformComponent() : voidTransformComponent(int scale) : voidTransformComponent(float x, float y) : voidTransformComponent(float x, float y, int scale) : voidTransformComponent(float x, float y, int w, int h, int scale) : voidinit() : voidmodifySpeed(int8_t modifier) : voidupdate() : voiddirection : Vector2Dheight : intposition : Vector2Dscale : intspeed : intwidth : intAnimationAnimation() : voidAnimation(uint8_t index, uint8_t frames, uint8_t speed) : voidframes : uint8_tindex : uint8_tspeed : uint8_tAnimationTypeIDLEWALKDirectionLEFTRIGHTSpriteComponentSpriteComponent() = default : voidSpriteComponent(const char * path) : voidSpriteComponent(const char * path, bool isAnimated) : void~SpriteComponent() : voiddraw() : voidinit() : voidplayAnimation(AnimationType type) : voidsetDirection(Direction direction) : voidsetTexture(const char * path) : voidupdate() : voidanimated : boolanimationIndex : intanimations : std::map<AnimationType,std::unique_ptr<Animation>>destRect : SDL_Rectflipped : boolframes : uint8_tspeed : uint8_tsrcRect : SDL_Recttexture : SDL_Texture *transform : TransformComponent *ManageraddEntity() : Entity &addToGroup(Entity * mEntity, Group mGroup) : voidaddToTeam(Entity * mEntity, Team mTeam) : voiddraw() : voidgetAll() : std::vector<Entity *>getGroup(Group mGroup) : std::vector<Entity *> &getTeam(Team mTeam) : std::vector<Entity *> &refresh() : voidupdate() : voidentities : std::vector<std::unique_ptr<Entity>>entitiesByGroup : std::array<std::vector<Entity *>,MAX_GROUPS>entitiesByTeam : std::array<std::vector<Entity *>,MAX_TEAMS>TextureManagerTextureManager() : void~TextureManager() : voiddraw(SDL_Texture * texture, SDL_Rect src, SDL_Rect dest, bool flipped = false) : voidloadTexture(const char * fileName) : SDL_Texture *splitSpriteSheet(SDL_Texture * spriteSheet, int width, int height, int spritesOnSheet) : std::vector<SDL_Rect>texture_cache : std::map<std::string,SDL_Texture *>SoundTypesSTEPSTHROW_EGGSoundManagerSoundManager() : voidSoundManager(const SoundManager &) = deleted : void~SoundManager() : voidoperator=(const SoundManager &) = deleted : voidloadSound(const char * fileName) : Mix_Chunk *playSound(SoundTypes sound) : voidsound_cache : std::map<const char *,Mix_Chunk *>KeyboardControllerKeyboardController() = default : voidKeyboardController(SDL_Scancode up, SDL_Scancode down, SDL_Scancode left, SDL_Scancode right, SDL_Scancode fire, Vector2D fireVelocity) : void~KeyboardController() constexpr = default : voidinit() : voidmodifyAtkSpeed(int8_t modifier) : voidupdate() : voiddown : SDL_Scancodefire : SDL_ScancodefireCooldown : uint32_tfireVelocity : Vector2Dkeystates : const uint8_t *lastFireTime : uint32_tleft : SDL_Scancodeplayer : TransformComponent *right : SDL_Scancodesprite : SpriteComponent *transform : TransformComponent *up : SDL_ScancodeProjectileComponentProjectileComponent(int range, int speed, Vector2D direction) : void~ProjectileComponent() : voidinit() : voidupdate() : voiddirection : Vector2Ddistance : intrange : intspeed : inttransformComponent : TransformComponent *HealthComponentHealthComponent(int health, Direction side) : void~HealthComponent() : voidcreateHeartComponents(int x) : voidgetHealth() : intinit() : voidmodifyHealth(int health = -1) : voidrefreshHearts() : voidsetHealth(int health) : voidhealth : intside : DirectionGameGame() : void~Game() : voidaddTile(unsigned long id, int x, int y) : voidclean() : voidgetWinner() const : TeamLabelhandleEvents() : voidinit(const char * title, int xpos, int ypos, int width, int height, bool fullscreen) : voidrefreshPlayers() : voidrender() : voidrunning() const : boolselectCharacters(const char *& playerSprite, const char *& enemySprite) : voidsetWinner(TeamLabel winningTeam) : voidupdate() : voidassets : AssetManager *collisionHandler : CollisionHandler *counter : intevent : SDL_EventisRunning : boolrenderer : SDL_Renderer *soundManager : SoundManager *textureManager : TextureManager *window : SDL_Window *winner : TeamLabeldirectionLEFTRIGHTUPDOWNCollisionHandlerCollisionHandler(Manager & mManager) : void~CollisionHandler() : voidgetAnyIntersection<T>(Entity * entity, Vector2D posMod = = {}, const std::initializer_list<GroupLabel> & groupLabels = = {}, const std::initializer_list<TeamLabel> & teamLabels = = {}, bool negateTeam = false) : TgetColliders(const std::initializer_list<GroupLabel> & groupLabels, const std::initializer_list<TeamLabel> & teamLabels = = {}, bool negateTeam = false) : std::vector<ColliderComponent *>getIntersection(Entity * entityA, Entity * entityB, Vector2D posModA = Vector2D(0,0), Vector2D posModB = Vector2D(0,0)) : IntersectionBitSetgetIntersectionWithBounds(Entity * entity, Vector2D posMod = Vector2D(0,0)) : IntersectionBitSetupdate() : voidmanager : Manager &PowerupComponentPowerupComponent(PowerupType type) : void~PowerupComponent() : voidatkSpeedEffect(Entity * player) : voidheartEffect(Entity * player) : voidmovementSpeedEffect(Entity * player) : voidupdate() : voidpickupFunc : void (PowerupComponent::*)(Entity *)PlayerComponentMapMap() = default : void~Map() constexpr = default : voidloadMap(const char * path, int sizeX, int sizeY) : boolStatsMOVEMENT_SPEEDATTACK_SPEEDStatEffectsComponentStatEffectsComponent() : void~StatEffectsComponent() : voidinit() : voidmodifyStatDur(Stats stat, int duration) : voidmodifyStatValue(Stats stat, int modifier) : voidupdate() : voidbuffs : std::array<int,MAX_STATS>PopupWindowPopupWindow(const char * title, const std::string & message) : void~PopupWindow() : voidhandleWinnerEvents() : voidrenderWinnerPopup(TeamLabel winner) : voidshouldContinue() const : boolcontinueGame : boolinteracted : boolrenderer : SDL_Renderer *texture : SDL_Texture *window : SDL_Window *GameObjectGameObject(const char * texturesheet, int x, int y) : void~GameObject() constexpr = default : voidrender() : voidupdate() : voiddestRect : SDL_RectobjTexture : SDL_Texture *srcRect : SDL_RectxPos : intyPos : intentitytransformmanagerteamLabelmantransformspritetextureDictpositiondirectiontransformtransformplayerspritefireVelocitytransformComponentdirectionsidewinnercollisionHandlerassetstextureManagersoundManagermanager \ No newline at end of file diff --git a/docs/diagrams/howto.md b/docs/diagrams/howto.md deleted file mode 100644 index 01260b8..0000000 --- a/docs/diagrams/howto.md +++ /dev/null @@ -1,12 +0,0 @@ -Need [clang-uml](https://clang-uml.github.io/index.html) - -```sh -clang-uml -clang-uml --add-compile-flag -I/usr/lib/clang/16/include # might need additional flags, example for my machine -clang-uml --print-from -n load_map_example_sequence # to get availabel commands for sequence diagram -``` - -then use plant uml to generate an actual `.svg` vector graphic -```sh -plantuml -tsvg *.puml -``` \ No newline at end of file diff --git a/docs/diagrams/includes.svg b/docs/diagrams/includes.svg deleted file mode 100644 index 288e1de..0000000 --- a/docs/diagrams/includes.svg +++ /dev/null @@ -1 +0,0 @@ -srcincludeTileComponent.cppManager.cppAssetManager.cppProjectileComponent.cppPlayerComponent.cppCollisionHandler.cppEntity.cppMap.cppSpriteComponent.cppStatEffectsComponent.cppHealthComponent.cppVector2D.cppColliderComponent.cppECS.cppTransformComponent.cppSoundManager.cppTextureManager.cppPowerupComponent.cppmain.cppKeyboardController.cppGame.cppPopupWindow.cppGameObject.cppTileComponent.hComponent.hTextureDict.hAssetManager.hEntity.hColliderComponent.hVector2D.hECS.hConstants.hTransformComponent.hSpriteComponent.hAnimationHandler.hDirection.hManager.hTextureManager.hSoundManager.hComponents.hKeyboardController.hProjectileComponent.hHealthComponent.hGame.hCollisionHandler.hPowerupComponent.hPlayerComponent.hMap.hStatEffectsComponent.hPopupWindow.hGameObject.hSDL.hmapstringSDL_render.hSDL_mixer.harraymemorybitsetvectorSDL_rect.hcstddefiostreamcstdintalgorithmSDL_image.hinitializer_listtupleutilitycassertcstdiocctypefstreamSDL_timer.hstdexceptctimeSDL_ttf.hSDL_error.h \ No newline at end of file diff --git a/docs/diagrams/includes_no_external.svg b/docs/diagrams/includes_no_external.svg deleted file mode 100644 index 6bb4891..0000000 --- a/docs/diagrams/includes_no_external.svg +++ /dev/null @@ -1 +0,0 @@ -srcincludeTileComponent.cppManager.cppAssetManager.cppProjectileComponent.cppPlayerComponent.cppCollisionHandler.cppEntity.cppMap.cppSpriteComponent.cppStatEffectsComponent.cppHealthComponent.cppVector2D.cppColliderComponent.cppECS.cppTransformComponent.cppSoundManager.cppTextureManager.cppPowerupComponent.cppmain.cppKeyboardController.cppGame.cppPopupWindow.cppGameObject.cppTileComponent.hComponent.hTextureDict.hAssetManager.hEntity.hColliderComponent.hVector2D.hECS.hConstants.hTransformComponent.hSpriteComponent.hAnimationHandler.hDirection.hManager.hTextureManager.hSoundManager.hComponents.hKeyboardController.hProjectileComponent.hHealthComponent.hGame.hCollisionHandler.hPowerupComponent.hPlayerComponent.hMap.hStatEffectsComponent.hPopupWindow.hGameObject.h \ No newline at end of file diff --git a/docs/diagrams/load_map_example_sequence.svg b/docs/diagrams/load_map_example_sequence.svg deleted file mode 100644 index 797ac13..0000000 --- a/docs/diagrams/load_map_example_sequence.svg +++ /dev/null @@ -1 +0,0 @@ -MapMapGameGameManagerManagerEntityEntityTileComponentTileComponentgetComponentTypeID<TileComponent>()getComponentTypeID<TileComponent>()getNewComponentTypeID()getNewComponentTypeID()TransformComponentTransformComponentgetComponentTypeID<TransformComponent>()getComponentTypeID<TransformComponent>()Vector2DVector2DgetComponentTypeID<T>()getComponentTypeID<T>()getComponentTypeID<ColliderComponent>()getComponentTypeID<ColliderComponent>()getComponentTypeID<SpriteComponent>()getComponentTypeID<SpriteComponent>()getComponentTypeID<HealthComponent>()getComponentTypeID<HealthComponent>()getComponentTypeID<KeyboardController>()getComponentTypeID<KeyboardController>()getComponentTypeID<StatEffectsComponent>()getComponentTypeID<StatEffectsComponent>()SpriteComponentSpriteComponentTextureManagerTextureManagerColliderComponentColliderComponentStatEffectsComponentStatEffectsComponentloadMap(const char *,int,int)loopaltaddTile(unsigned long,int,int)addEntity()Entity(Manager &)addComponent(int &,int &,const int &,const int &,unsigned long &)TileComponent(int,int,int,int,int)init()addComponent(int &,int &,int &,int &,int &&)TransformComponent(float,float,int,int,int)init()zero()getComponent() constaddComponent(const char *&)SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()getComponent() constaltaddComponent(const char (&)[6])ColliderComponent(const char *)init()alt[hasComponent() const]addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group) \ No newline at end of file diff --git a/docs/diagrams/sequence.svg b/docs/diagrams/sequence.svg deleted file mode 100644 index d0b5207..0000000 --- a/docs/diagrams/sequence.svg +++ /dev/null @@ -1 +0,0 @@ -main(int,char **)main(int,char **)GameGameTextureManagerTextureManagerManagerManagerMapMapEntityEntityTileComponentTileComponentgetComponentTypeID<TileComponent>()getComponentTypeID<TileComponent>()getNewComponentTypeID()getNewComponentTypeID()TransformComponentTransformComponentgetComponentTypeID<TransformComponent>()getComponentTypeID<TransformComponent>()Vector2DVector2DgetComponentTypeID<T>()getComponentTypeID<T>()getComponentTypeID<ColliderComponent>()getComponentTypeID<ColliderComponent>()getComponentTypeID<SpriteComponent>()getComponentTypeID<SpriteComponent>()getComponentTypeID<HealthComponent>()getComponentTypeID<HealthComponent>()getComponentTypeID<KeyboardController>()getComponentTypeID<KeyboardController>()getComponentTypeID<StatEffectsComponent>()getComponentTypeID<StatEffectsComponent>()SpriteComponentSpriteComponentColliderComponentColliderComponentStatEffectsComponentStatEffectsComponentAssetManagerAssetManagerSoundManagerSoundManagerKeyboardControllerKeyboardControllerHealthComponentHealthComponentComponentComponentCollisionHandlerCollisionHandlerPowerupComponentPowerupComponentgetComponentTypeID<PowerupComponent>()getComponentTypeID<PowerupComponent>()PopupWindowPopupWindowGame()init(const char *,int,int,int,int,bool)loadTexture(const char *)selectCharacters(const char *&,const char *&)looploadTexture(const char *)getGroup(Group)getGroup(Group)getGroup(Group)getGroup(Group)getGroup(Group)Map()alt[loadMap(const char *,int,int)]loopaltaddTile(unsigned long,int,int)addEntity()Entity(Manager &)addComponent(int &,int &,const int &,const int &,unsigned long &)TileComponent(int,int,int,int,int)init()addComponent(int &,int &,int &,int &,int &&)TransformComponent(float,float,int,int,int)init()zero()getComponent() constaddComponent(const char *&)SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()getComponent() constaltaddComponent(const char (&)[6])ColliderComponent(const char *)init()alt[hasComponent() const]addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)addSoundEffect(std::string,const char *)loadSound(const char *)addSoundEffect(std::string,const char *)loadSound(const char *)setTeam(TeamLabel)addToTeam(Entity *,Team)addComponent(int &&,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char *&,bool &&)SpriteComponent(const char *,bool)playAnimation(AnimationType)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()Vector2D(float,float)addComponent(SDL_Scancode &&,SDL_Scancode &&,SDL_Scancode &&,SDL_Scancode &&,SDL_Scancode &&,Vector2D &&)KeyboardController(SDL_Scancode,SDL_Scancode,SDL_Scancode,SDL_Scancode,SDL_Scancode,Vector2D)init()getComponent() constgetComponent() constaddComponent(const char (&)[7],float &&)ColliderComponent(const char *,float)init()alt[hasComponent() const]addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()getComponent() constupdate()addComponent(int &&,Direction &&)HealthComponent(int,Direction)init()refreshHearts()loop[getManager()][getGroup(Group)]alt[getTeam()][getTeam()]destroy()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()loopaltcreateHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)createHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()addGroup(Group)addToGroup(Entity *,Group)setTeam(TeamLabel)addToTeam(Entity *,Team)addComponent(int &&,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char *&,bool &&)SpriteComponent(const char *,bool)playAnimation(AnimationType)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()Vector2D(float,float)addComponent(SDL_Scancode &&,SDL_Scancode &&,SDL_Scancode &&,SDL_Scancode &&,SDL_Scancode &&,Vector2D &&)KeyboardController(SDL_Scancode,SDL_Scancode,SDL_Scancode,SDL_Scancode,SDL_Scancode,Vector2D)init()getComponent() constgetComponent() constaddComponent(const char (&)[6],float &&)ColliderComponent(const char *,float)init()alt[hasComponent() const]addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()getComponent() constupdate()addComponent(int &&,Direction &&)HealthComponent(int,Direction)init()refreshHearts()loop[getManager()][getGroup(Group)]alt[getTeam()][getTeam()]destroy()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()loopaltcreateHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)createHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()addGroup(Group)addToGroup(Entity *,Group)looploop[running() const]handleEvents()update()getComponent() constgetComponent() constrefresh()update()loopupdate() constloopupdate()altcalculateSpawnPosition()Vector2D(float,float)looploop[getColliders(const std::initializer_list<GroupLabel> &,const std::initializer_list<TeamLabel> &,bool)]loop[getAll()]alt[getGroupBitSet()]alt[getTeam()]alt[hasComponent() const]getComponent() constVector2D(float,float)calculateType()createPowerup(Vector2D,PowerupType)addEntity()Entity(Manager &)addComponent(float &,float &,int &&,int &&,int &&)TransformComponent(float,float,int,int,int)init()zero()tryaddComponent(char *&&)SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()[std::runtime_error]addComponent(const char (&)[8],float &&)ColliderComponent(const char *,float)init()alt[hasComponent() const]addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()getComponent() constupdate()addComponent(PowerupType &)PowerupComponent(PowerupType)init()addGroup(Group)addToGroup(Entity *,Group)loop[getGroup(Group)]alt[getComponent() const][getHealth()]getTeam()setWinner(TeamLabel)render()loopdraw() constloopdraw()loopdraw() constloopdraw()loopdraw() constloopdraw()loopdraw() constloopdraw()loopdraw() constloopdraw()getWinner() constPopupWindow(const char *,const std::string &)renderWinnerPopup(TeamLabel)loophandleWinnerEvents()shouldContinue() constrefreshPlayers()loopdestroy()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()getComponent() constVector2D(float,float)getComponent() constVector2D(float,float)getComponent() constsetHealth(int)refreshHearts()loop[getManager()][getGroup(Group)]alt[getTeam()][getTeam()]destroy()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()loopaltcreateHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)createHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)getComponent() constsetHealth(int)refreshHearts()loop[getManager()][getGroup(Group)]alt[getTeam()][getTeam()]destroy()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()alt[hasComponent() const]getComponent() constremoveCollision()loopaltcreateHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)createHeartComponents(int)getManager()addEntity()Entity(Manager &)addComponent(int &,int &&,int &&)TransformComponent(float,float,int)init()zero()addComponent(const char (&)[17])SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()addGroup(Group)addToGroup(Entity *,Group)getTeam()setTeam(TeamLabel)addToTeam(Entity *,Team)update()getComponent() constgetComponent() constrefresh()update()loopupdate() constloopupdate()altcalculateSpawnPosition()Vector2D(float,float)looploop[getColliders(const std::initializer_list<GroupLabel> &,const std::initializer_list<TeamLabel> &,bool)]loop[getAll()]alt[getGroupBitSet()]alt[getTeam()]alt[hasComponent() const]getComponent() constVector2D(float,float)calculateType()createPowerup(Vector2D,PowerupType)addEntity()Entity(Manager &)addComponent(float &,float &,int &&,int &&,int &&)TransformComponent(float,float,int,int,int)init()zero()tryaddComponent(char *&&)SpriteComponent(const char *)setTexture(const char *)loadTexture(const char *)init()getComponent() constupdate()[std::runtime_error]addComponent(const char (&)[8],float &&)ColliderComponent(const char *,float)init()alt[hasComponent() const]addComponent()TransformComponent()zero()init()zero()StatEffectsComponent()init()getComponent() constupdate()addComponent(PowerupType &)PowerupComponent(PowerupType)init()addGroup(Group)addToGroup(Entity *,Group)loop[getGroup(Group)]alt[getComponent() const][getHealth()]getTeam()setWinner(TeamLabel)clean() \ No newline at end of file diff --git a/docs/docker/Dockerfile b/docs/docker/Dockerfile new file mode 100644 index 0000000..69b7c81 --- /dev/null +++ b/docs/docker/Dockerfile @@ -0,0 +1,13 @@ +FROM alpine:latest + +RUN apk --update --no-cache add doxygen graphviz git + +COPY entrypoint.sh /entrypoint.sh + +RUN chmod +x /entrypoint.sh + +WORKDIR /source + +ENTRYPOINT ["/entrypoint.sh"] + +CMD ["doxygen", "/Doxyfile_copy"] \ No newline at end of file diff --git a/docs/docker/entrypoint.sh b/docs/docker/entrypoint.sh new file mode 100644 index 0000000..748948e --- /dev/null +++ b/docs/docker/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +cp /Doxyfile /Doxyfile_copy +echo "OUTPUT_DIRECTORY = /output" >> /Doxyfile_copy + +exec "$@" \ No newline at end of file diff --git a/docs/doxygen-awesome-css b/docs/doxygen-awesome-css new file mode 160000 index 0000000..df88fe4 --- /dev/null +++ b/docs/doxygen-awesome-css @@ -0,0 +1 @@ +Subproject commit df88fe4fdd97714fadfd3ef17de0b4401f804052 diff --git a/docs/header.html b/docs/header.html new file mode 100644 index 0000000..c342193 --- /dev/null +++ b/docs/header.html @@ -0,0 +1,110 @@ + + + + + + + + + + + $projectname: $title + + + $title + + + + + + + + + + + + + + + + + + + + + + + + $treeview + $search + $mathjax + $darkmode + + $extrastylesheet + + + + + +
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
$projectname +  $projectnumber + +
+ +
$projectbrief
+ +
+
$projectbrief
+
$searchbox
$searchbox
+
+ + \ No newline at end of file diff --git a/engine.sublime-project b/engine.sublime-project new file mode 100644 index 0000000..1466f8e --- /dev/null +++ b/engine.sublime-project @@ -0,0 +1,49 @@ +{ + "folders": + [ + { + "path": "." + } + ], + "settings": + { + "tab_size": 4 + }, + "build_systems": [ + { + "name": "Build engine", + "shell_cmd": "cmake --build build", + "working_dir": "$project_path", + "variants": [ + { + "name": "Debug", + "shell_cmd": "cmake -DCMAKE_BUILD_TYPE=Debug build && cmake --build build", + }, + { + "name": "Release", + "shell_cmd": "cmake -DCMAKE_BUILD_TYPE=Release build && cmake --build build", + }, + ] + }, + { + "name": "Generate CMake", + "shell_cmd": "cmake -S . -B build", + "working_dir": "$project_path", + }, + { + "name": "Doxygen", + "shell_cmd": "xdg-open $project_path/docs/html/index.html", + "working_dir": "$project_path", + "variants": [ + { + "name": "Build image", + "shell_cmd": "docker build -t vego_engine-docker $project_path/docs/docker", + }, + { + "name": "Generate documentation", + "shell_cmd": "docker run --rm -v \"$project_path:/source\" -v \"$project_path/docs:/output\" -v \"$project_path/docs/Doxyfile:/Doxyfile\" vego_engine-docker", + }, + ] + } + ] +} diff --git a/include/CollisionHandler.h b/include/CollisionHandler.h index 1fdba31..04aafbf 100644 --- a/include/CollisionHandler.h +++ b/include/CollisionHandler.h @@ -1,5 +1,9 @@ #pragma once +//! \file CollisionHandler.h +//! \file CollisionHandler.cpp +//! \file TransformComponent.cpp + #include "ColliderComponent.h" #include "Constants.h" #include "Entity.h" @@ -17,9 +21,11 @@ class ColliderComponent; class Entity; +// [IntersectionBitSet] constexpr uint8_t DIRECTION_C = 4; using IntersectionBitSet = std::bitset; +// [IntersectionBitSet] class CollisionHandler { @@ -47,6 +53,20 @@ public: std::initializer_list const& teamLabels = {}, bool negateTeam = false); + /*! + * + * \brief Tests entity against all entities with the specified labels for a collision + * \details Tests the given entity against every other entity with the specified labels for intersections between their collison boxes. + * If the primary entity has no ColliderComponent, the equivalent of no collision is returned immediately, other entities are skipped + * if they don't have a ColliderComponent + * \param entity The primary entity to check against. Return values will be relative to this entity + * \param posMod Modifier to apply toposition before checking collisions. + * \param groupLabels Entities need to have at least one listed GroupLabels to get checked against + * \param teamLabels Entities need to have one of the specified TeamLabels to get checked against + * \param negateTeam If set to true, entities will only be checked against if they **don't** have one of the specified TeamLabels + * \see ColliderComponent + * + */ template T getAnyIntersection( Entity* entity, diff --git a/include/Entity.h b/include/Entity.h index 82ed6a5..3b9536e 100644 --- a/include/Entity.h +++ b/include/Entity.h @@ -16,36 +16,61 @@ using ComponentBitSet = std::bitset; using GroupBitSet = std::bitset; using ComponentArray = std::array; +/*! + * + * \brief Main class for any object in game, stores associations, labeling and components + * \details The entity class is the primary class each object in the game needs to use. Add components to assign functionality. + * + * \todo More detailed description + * \todo Some functions in entity class are only supposed to be called in specific context, which might be valid uses for `friend` keyword. Example: Entity() should only be called from Manager::addEntity(). Verify each functions intended use/scope. + * + */ class Entity { public: -/*! TODO */ + /*! + * \brief Used for rendering order (last is highest) or retrieving entities of group + * \todo Label used in singular entity shouldn't use plural + * \todo HEARTS are rendered above POWERUPS, missleading order + * \todo PROJECTILE are rendered above POWERUPS, missleading order + * \todo Generalize HEARTS as UI or similar + */ enum class GroupLabel { - MAPTILES, - PLAYERS, - ENEMIES, - COLLIDERS, - PROJECTILE, - HEARTS, - POWERUPS + MAPTILES, //!< Entity using TileComponent + PLAYERS, //!< Primary entity in player controll + ENEMIES, //!< \deprecated All players now grouped as Entity::PLAYERS + COLLIDERS, //!< Fixed collider entity, e.g. a wall + PROJECTILE, //!< \todo Document + HEARTS, //!< \todo Document + POWERUPS //!< \todo Document }; + /*! + * \brief Allows grouping entities by team association for hits, win conditions, etc. + */ enum class TeamLabel { - NONE, //!< No team + NONE, //!< No team, should be skipped in any checks BLUE, //!< Team blue RED //!< Team red }; + /*! + * \todo Document + */ explicit Entity(Manager& mManager) : manager(mManager) { }; - void update() const; + void update() const; //!< Call each frame to update all components + //! Call after update to render components. + //! \sa SpriteComponent::draw() void draw() const; - bool isActive() const { return this->active; } + bool isActive() const { return this->active; } //!< \sa destroy() + //! Mark for destruction for Manager::refresh() and disables collision + //! \sa ColliderComponent void destroy() { this->active = false; if (this->hasComponent()) { @@ -53,21 +78,26 @@ public: } } - bool hasGroup(Group mGroup); - void addGroup(Group mGroup); - void delGroup(Group mGroup); + bool hasGroup(Group mGroup); //!< \sa GroupLabel + void addGroup(Group mGroup); //!< \sa GroupLabel + void delGroup(Group mGroup); //!< \sa GroupLabel + //! \returns bitset with true on position GroupLabel if the entity belongs to group + //! \sa GroupLabel std::bitset getGroupBitSet(); - void setTeam(TeamLabel teamLabel); - TeamLabel getTeam(); + void setTeam(TeamLabel teamLabel); //!< \sa TeamLabel + TeamLabel getTeam(); //!< \sa TeamLabel + //! \sa Manager Manager& getManager() { return manager; }; - template bool hasComponent() const + template bool hasComponent() const //! \sa Component { return componentBitSet[getComponentTypeID()]; } + //! \brief Adds specified type as component and calls Component::init() + //! \param mArgs Constructor arguments of component template T& addComponent(TArgs&&...mArgs) { T* c(new T(std::forward(mArgs)...)); @@ -82,7 +112,7 @@ public: return *c; }; - template T& getComponent() const + template T& getComponent() const //! \returns Component of type T { auto ptr(componentArray[getComponentTypeID()]); return *static_cast(ptr); diff --git a/include/Manager.h b/include/Manager.h index 61a1c45..1e2fff7 100644 --- a/include/Manager.h +++ b/include/Manager.h @@ -7,22 +7,33 @@ #include "Constants.h" #include "Entity.h" +/*! + * + * \brief Is responsible for managing all entities + * \details The manager class handles update and draw calls collectively for all entities, and provides functionality to get all or a subset of all entities + * \sa Entity + * \sa Entity::GroupLabel + * \sa Entity::TeamLabel + * + */ class Manager { public: - void update(); - void draw(); + void update(); //!< \sa Entity::update() + void draw(); //!< \sa Entity::draw() + //! Disables all functionality of entities marked for destruction + //! \sa Entity::destroy() void refresh(); - void addToGroup(Entity* mEntity, Group mGroup); - std::vector& getGroup(Group mGroup); + void addToGroup(Entity* mEntity, Group mGroup); //!< \todo `friend` to Entity + std::vector& getGroup(Group mGroup); //!< \returns std::vector containing all entities in group Entity::GroupLabel - void addToTeam(Entity* mEntity, Team mTeam); - std::vector& getTeam(Team mTeam); + void addToTeam(Entity* mEntity, Team mTeam); //!< \todo `friend` to Entity + std::vector& getTeam(Team mTeam); //!< \returns std::vector containing all entities in team Entity::TeamLabel - std::vector getAll(); + std::vector getAll(); //!< \returns std::vector containing all entities - Entity& addEntity(); + Entity& addEntity(); //!< Creates and returns a new, empty entity private: std::vector> entities; diff --git a/include/TransformComponent.h b/include/TransformComponent.h index e57d747..43e6cdc 100644 --- a/include/TransformComponent.h +++ b/include/TransformComponent.h @@ -23,6 +23,7 @@ public: TransformComponent(float x, float y, int w, int h, int scale); void init() override; + /*! TODO: document usage of collision handler */ void update() override; void modifySpeed(int8_t modifier); }; diff --git a/src/CollisionHandler.cpp b/src/CollisionHandler.cpp index 2ca742a..07c5f2c 100644 --- a/src/CollisionHandler.cpp +++ b/src/CollisionHandler.cpp @@ -115,6 +115,17 @@ std::vector CollisionHandler::getColliders( return colliders; } +/*! + * + * \details Refer to getAnyIntersection() for more details + * \return A bitset of intersections, describing the directions of intersection. Position `Direction` in bitset true if edge in that direction collides + * \see Direction + * \see IntersectionBitSet + * \snippet CollisionHandler.h IntersectionBitSet + * \details Example usage for IntersectionBitSet (TransformComponent::update()): + * \snippet{trimleft} TransformComponent.cpp getAnyIntersection example code + * + */ template<> IntersectionBitSet CollisionHandler::getAnyIntersection( Entity* entity, @@ -123,6 +134,7 @@ IntersectionBitSet CollisionHandler::getAnyIntersection( std::initializer_list const& teamLabels, bool negateTeam) { + if (!entity->hasComponent()) return std::bitset(); IntersectionBitSet intersections; for (auto& collider : getColliders(groupLabels, teamLabels)) { intersections |= getIntersection(entity, collider->entity, posMod); @@ -130,6 +142,13 @@ IntersectionBitSet CollisionHandler::getAnyIntersection( return intersections; }; +/*! + * + * \details Refer to getAnyIntersection() for more details + * \return The first entity with collision found + * \see Entity + * + */ template<> Entity* CollisionHandler::getAnyIntersection( Entity* entity, @@ -138,6 +157,7 @@ Entity* CollisionHandler::getAnyIntersection( std::initializer_list const& teamLabels, bool negateTeam) { + if (!entity->hasComponent()) return nullptr; for (auto& collider : getColliders(groupLabels, teamLabels)) { SDL_Rect rect = entity->getComponent().collider + posMod; if (SDL_HasIntersection(&rect, &collider->collider)) { @@ -145,4 +165,28 @@ Entity* CollisionHandler::getAnyIntersection( } } return nullptr; +}; + +/*! + * + * \details Refer to getAnyIntersection() for more details + * \return True if any collision was found, otherwise false + * + */ +template<> +bool CollisionHandler::getAnyIntersection( + Entity* entity, + Vector2D posMod, + std::initializer_list const& groupLabels, + std::initializer_list const& teamLabels, + bool negateTeam) +{ + if (!entity->hasComponent()) return false; + for (auto& collider : getColliders(groupLabels, teamLabels)) { + SDL_Rect rect = entity->getComponent().collider + posMod; + if (SDL_HasIntersection(&rect, &collider->collider)) { + return true; + } + } + return false; }; \ No newline at end of file diff --git a/src/TransformComponent.cpp b/src/TransformComponent.cpp index 0556ca2..43407fa 100644 --- a/src/TransformComponent.cpp +++ b/src/TransformComponent.cpp @@ -63,6 +63,8 @@ void TransformComponent::update() // TODO: move to separate functions if (this->entity->hasGroup((size_t)Entity::GroupLabel::PLAYERS)) { + + // [getAnyIntersection example code] IntersectionBitSet intersections = (CollisionHandler::getIntersectionWithBounds(entity, Vector2D(positionChange.x, 0)) | (Game::collisionHandler->getAnyIntersection(entity, Vector2D(positionChange.x, 0), { Entity::GroupLabel::MAPTILES, Entity::GroupLabel::COLLIDERS })) & @@ -76,6 +78,7 @@ void TransformComponent::update() if (intersections.test((size_t)Direction::UP) || intersections.test((size_t)Direction::DOWN)) positionChange.y = 0; + // [getAnyIntersection example code] } position += positionChange;