瀏覽代碼

feat(initial): Initial commit with SDL basic structure

Douglas A 2 年之前
當前提交
da076d99ab
共有 6 個文件被更改,包括 331 次插入0 次删除
  1. 191 0
      .clang-format
  2. 1 0
      .gitignore
  3. 12 0
      CMakeLists.txt
  4. 67 0
      game.cpp
  5. 41 0
      game.h
  6. 19 0
      main.cpp

+ 191 - 0
.clang-format

@@ -0,0 +1,191 @@
+---
+Language:        Cpp
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignArrayOfStructures: None
+AlignConsecutiveMacros: None
+AlignConsecutiveAssignments: None
+AlignConsecutiveBitFields: None
+AlignConsecutiveDeclarations: None
+AlignEscapedNewlines: Right
+AlignOperands:   Align
+AlignTrailingComments: true
+AllowAllArgumentsOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortEnumsOnASingleLine: true
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: All
+AllowShortLambdasOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: Never
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: All
+AlwaysBreakAfterReturnType: AllDefinitions
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: MultiLine
+AttributeMacros:
+  - __capability
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:
+  AfterCaseLabel:  true
+  AfterClass:      true
+  AfterControlStatement: Always
+  AfterEnum:       true
+  AfterFunction:   true
+  AfterNamespace:  true
+  AfterObjCDeclaration: true
+  AfterStruct:     true
+  AfterUnion:      true
+  AfterExternBlock: true
+  BeforeCatch:     true
+  BeforeElse:      true
+  BeforeLambdaBody: false
+  BeforeWhile:     true
+  IndentBraces:    true
+  SplitEmptyFunction: true
+  SplitEmptyRecord: true
+  SplitEmptyNamespace: true
+BreakBeforeBinaryOperators: All
+BreakBeforeConceptDeclarations: true
+BreakBeforeBraces: GNU
+BreakBeforeInheritanceComma: false
+BreakInheritanceList: BeforeColon
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeColon
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: true
+ColumnLimit:     79
+CommentPragmas:  '^ IWYU pragma:'
+QualifierAlignment: Leave
+CompactNamespaces: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: false
+DeriveLineEnding: true
+DerivePointerAlignment: false
+DisableFormat:   false
+EmptyLineAfterAccessModifier: Never
+EmptyLineBeforeAccessModifier: LogicalBlock
+ExperimentalAutoDetectBinPacking: false
+PackConstructorInitializers: BinPack
+BasedOnStyle:    ''
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+AllowAllConstructorInitializersOnNextLine: true
+FixNamespaceComments: false
+ForEachMacros:
+  - foreach
+  - Q_FOREACH
+  - BOOST_FOREACH
+IfMacros:
+  - KJ_IF_MAYBE
+IncludeBlocks:   Preserve
+IncludeCategories:
+  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
+    Priority:        2
+    SortPriority:    0
+    CaseSensitive:   false
+  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
+    Priority:        3
+    SortPriority:    0
+    CaseSensitive:   false
+  - Regex:           '.*'
+    Priority:        1
+    SortPriority:    0
+    CaseSensitive:   false
+IncludeIsMainRegex: '(Test)?$'
+IncludeIsMainSourceRegex: ''
+IndentAccessModifiers: false
+IndentCaseLabels: false
+IndentCaseBlocks: false
+IndentGotoLabels: true
+IndentPPDirectives: None
+IndentExternBlock: AfterExternBlock
+IndentRequires:  false
+IndentWidth:     2
+IndentWrappedFunctionNames: false
+InsertTrailingCommas: None
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: true
+LambdaBodyIndentation: Signature
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 2
+ObjCBreakBeforeNestedBlockParam: true
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 2
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakOpenParenthesis: 0
+PenaltyBreakString: 1000
+PenaltyBreakTemplateDeclaration: 10
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyIndentedWhitespace: 0
+PointerAlignment: Right
+PPIndentWidth:   -1
+ReferenceAlignment: Pointer
+ReflowComments:  true
+RemoveBracesLLVM: false
+SeparateDefinitionBlocks: Leave
+ShortNamespaceLines: 1
+SortIncludes:    CaseSensitive
+SortJavaStaticImport: Before
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCaseColon: false
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: Always
+SpaceBeforeParensOptions:
+  AfterControlStatements: false
+  AfterForeachMacros: false
+  AfterFunctionDefinitionName: false
+  AfterFunctionDeclarationName: false
+  AfterIfMacros:   false
+  AfterOverloadedOperator: false
+  BeforeNonEmptyParentheses: false
+SpaceAroundPointerQualifiers: Default
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyBlock: false
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  Never
+SpacesInConditionalStatement: false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInLineCommentPrefix:
+  Minimum:         1
+  Maximum:         -1
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+SpaceBeforeSquareBrackets: false
+BitFieldColonSpacing: Both
+Standard:        c++03
+StatementAttributeLikeMacros:
+  - Q_EMIT
+StatementMacros:
+  - Q_UNUSED
+  - QT_REQUIRE_VERSION
+TabWidth:        8
+UseCRLF:         false
+UseTab:          Never
+WhitespaceSensitiveMacros:
+  - STRINGIZE
+  - PP_STRINGIZE
+  - BOOST_PP_STRINGIZE
+  - NS_SWIFT_NAME
+  - CF_SWIFT_NAME
+...
+

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+build/

+ 12 - 0
CMakeLists.txt

@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.0)
+
+project(breakout CXX)
+set(CMAKE_CXX_STANDARD 17)
+find_package(SDL2 REQUIRED)
+find_package(fmt REQUIRED)
+
+include_directories(${SDL_INCLUDE_DIRS})
+add_executable(breakout main.cpp game.cpp)
+
+
+target_link_libraries(breakout PUBLIC fmt::fmt ${SDL2_LIBRARIES})

+ 67 - 0
game.cpp

@@ -0,0 +1,67 @@
+#include "game.h"
+#include <SDL2/SDL_render.h>
+#include <SDL2/SDL_video.h>
+#include <fmt/core.h>
+#include <memory>
+namespace Game
+{
+
+App::App (const char *window_name, int width, int height)
+{
+  m_window = std::make_unique<SDLWindow> (
+      SDL_CreateWindow (window_name, SDL_WINDOWPOS_UNDEFINED,
+                        SDL_WINDOWPOS_UNDEFINED, width, height, 0));
+  if (m_window.get ()->_window == NULL)
+    {
+      fmt::print ("Could not intialize window");
+      return;
+    }
+
+  m_renderer = std::make_unique<SDLRenderer> (SDL_CreateRenderer (
+      m_window.get ()->_window, -1, SDL_RENDERER_ACCELERATED));
+
+  if (!m_renderer.get ()->_renderer)
+    {
+      fmt::print ("Could not initialize renderer");
+      return;
+    }
+
+  initialized = true;
+}
+
+void
+App::run ()
+{
+  if (!initialized)
+    {
+      fmt::print ("Game not initialized properly. Quitting");
+      return;
+    }
+
+  SDL_Event event;
+  for (;;)
+    {
+      while (SDL_PollEvent (&event))
+        {
+          switch (event.type)
+            {
+            case SDL_QUIT:
+              can_quit = true;
+              break;
+            default:
+              break;
+            }
+        }
+
+      SDL_SetRenderDrawColor (m_renderer.get ()->_renderer, 51, 51, 51, 255);
+      SDL_RenderClear (m_renderer.get ()->_renderer);
+      SDL_RenderPresent (m_renderer.get ()->_renderer);
+      SDL_Delay (16);
+
+      if (can_quit)
+        {
+          return;
+        }
+    }
+}
+} // namespace Game

+ 41 - 0
game.h

@@ -0,0 +1,41 @@
+#pragma once
+
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_video.h>
+#include <memory>
+
+namespace Game
+{
+
+struct SDLWindow
+{
+  SDL_Window *_window;
+
+  SDLWindow (SDL_Window *window) { _window = window; }
+
+  ~SDLWindow () { SDL_DestroyWindow (_window); }
+};
+
+struct SDLRenderer
+{
+  SDL_Renderer *_renderer;
+
+  SDLRenderer (SDL_Renderer *renderer) { _renderer = renderer; }
+
+  ~SDLRenderer () { SDL_DestroyRenderer (_renderer); }
+};
+
+class App
+{
+public:
+  App (const char *window_name, int width, int height);
+  void run ();
+
+private:
+  std::unique_ptr<SDLWindow> m_window;
+  std::unique_ptr<SDLRenderer> m_renderer;
+
+  bool can_quit = false;
+  bool initialized = false;
+};
+}; // namespace Game

+ 19 - 0
main.cpp

@@ -0,0 +1,19 @@
+#include "game.h"
+#include <SDL2/SDL.h>
+#include <fmt/core.h>
+
+int
+main (int, char **)
+{
+  if (SDL_Init (SDL_INIT_VIDEO) < 0)
+    {
+      fmt::print ("could not init SDL.");
+      return (EXIT_FAILURE);
+    }
+
+  Game::App app = Game::App ("SDL Game", 800, 600);
+
+  app.run ();
+
+  return 0;
+}