hemi 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3840aa088a24e90ff6a1e10d139624c38ecced3a7676aa2f4f11fb46fc433854
4
+ data.tar.gz: 3c36fcc6e2eb00cdee1fad4c188c4c3ee3c1ea685ff35a6143daa2d2a565d00c
5
+ SHA512:
6
+ metadata.gz: 6c67aee68830d5607901848659891a56330b6dbecc8c2a5ed06ac83bf911359735635b3e7a9aed1a260898ff0a654e0bbc45ee3d3c5c228cc49c34d982c25494
7
+ data.tar.gz: 4c2687fb05a4d4ac2f22c3378fb991494c36ad5fb64b46f6d769ac22dc0683bd62efac113d07cf8bb8e65dec0f0a0810eea542f2b8dedd8ee5a4469ce700083c
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ *.gem
2
+ .DS_store
3
+ .bundle/
4
+ .yardoc/
5
+
6
+ vendor/bundle/
7
+ examples/
8
+
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper --format doc -I src
2
+ --color
3
+ --order random
data/.rubocop.yml ADDED
@@ -0,0 +1,50 @@
1
+ require:
2
+ - rubocop-performance
3
+ - rubocop-rspec
4
+
5
+ # METRICS
6
+ MethodLength:
7
+ CountComments: false
8
+ Max: 15
9
+ Exclude:
10
+ - 'spec/**/*'
11
+ Metrics/LineLength:
12
+ Enabled: false
13
+ Metrics/AbcSize:
14
+ Max: 25
15
+ Exclude:
16
+ - 'spec/**/*'
17
+ Metrics/BlockLength:
18
+ Exclude:
19
+ - 'spec/**/*'
20
+
21
+ # LAYOUT
22
+ Layout/DotPosition:
23
+ EnforcedStyle: leading
24
+ Enabled: true
25
+ Layout/ExtraSpacing:
26
+ Enabled: false
27
+ Layout/SpaceAroundOperators:
28
+ Enabled: false
29
+ Layout/EmptyLinesAroundClassBody:
30
+ Enabled: false
31
+ Layout/AccessModifierIndentation:
32
+ EnforcedStyle: outdent
33
+
34
+ # STYLE
35
+ Style/StringLiterals:
36
+ EnforcedStyle: double_quotes
37
+ Style/FrozenStringLiteralComment:
38
+ Enabled: false
39
+ Style/ClassAndModuleChildren:
40
+ Enabled: false
41
+ Style/Documentation:
42
+ Enabled: false
43
+
44
+ # RSPEC
45
+ RSpec/ContextWording:
46
+ Enabled: false
47
+ RSpec/NamedSubject:
48
+ Enabled: false
49
+ RSpec/NestedGroups:
50
+ Max: 5
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.6.6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,62 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ hemi (0.0.1)
5
+ ruby-sdl2 (= 0.3.5)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.0)
11
+ coderay (1.1.2)
12
+ diff-lcs (1.3)
13
+ jaro_winkler (1.5.4)
14
+ method_source (0.9.2)
15
+ parallel (1.19.1)
16
+ parser (2.6.5.0)
17
+ ast (~> 2.4.0)
18
+ pry (0.12.2)
19
+ coderay (~> 1.1.0)
20
+ method_source (~> 0.9.0)
21
+ rainbow (3.0.0)
22
+ rspec (3.9.0)
23
+ rspec-core (~> 3.9.0)
24
+ rspec-expectations (~> 3.9.0)
25
+ rspec-mocks (~> 3.9.0)
26
+ rspec-core (3.9.0)
27
+ rspec-support (~> 3.9.0)
28
+ rspec-expectations (3.9.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.9.0)
31
+ rspec-mocks (3.9.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.9.0)
34
+ rspec-support (3.9.0)
35
+ rubocop (0.77.0)
36
+ jaro_winkler (~> 1.5.1)
37
+ parallel (~> 1.10)
38
+ parser (>= 2.6)
39
+ rainbow (>= 2.2.2, < 4.0)
40
+ ruby-progressbar (~> 1.7)
41
+ unicode-display_width (>= 1.4.0, < 1.7)
42
+ rubocop-performance (1.5.1)
43
+ rubocop (>= 0.71.0)
44
+ rubocop-rspec (1.37.0)
45
+ rubocop (>= 0.68.1)
46
+ ruby-progressbar (1.10.1)
47
+ ruby-sdl2 (0.3.5)
48
+ unicode-display_width (1.6.0)
49
+
50
+ PLATFORMS
51
+ ruby
52
+
53
+ DEPENDENCIES
54
+ hemi!
55
+ pry (~> 0.12)
56
+ rspec (~> 3.9)
57
+ rubocop (~> 0.77)
58
+ rubocop-performance (~> 1.5)
59
+ rubocop-rspec (~> 1.37)
60
+
61
+ BUNDLED WITH
62
+ 2.1.4
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # Hemi
2
+
3
+ ## Whatshisface
4
+ This is a _Work In Progress_ simplistic game engine based on SDL2.
5
+
6
+ Made for self-educational purposes.
7
+
8
+ ## Setup
9
+
10
+ #### 1. Required libraries
11
+
12
+ Install `sdl2`, `sdl2_image`, `sdl2_mixer` and `sdl2_ttf` libraries. For MacOS you can simply `brew install` all of them.
13
+
14
+ #### 2. Install Ruby and gems
15
+
16
+ Install specific ruby version using Rbenv (`rbenv install`) or RVM (yuck)
17
+
18
+ Make sure you have Bundler gem installed for this revsion (`gem install bundler -v=1.17.3`)
19
+
20
+ And `bundle install` away.
data/hemi.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "hemi/version"
4
+
5
+ ERR_RG_2_REQUIRED = "RubyGems 2.0 or newer is required to protect against public gem pushes.".freeze
6
+
7
+ Gem::Specification.new do |spec|
8
+ # RubyGems < 2.0 does not allow to specify metadata. We do not want to use RubyGems < 2.0
9
+ raise ERR_RG_2_REQUIRED unless spec.respond_to?(:metadata)
10
+
11
+ spec.name = "hemi"
12
+ spec.version = Hemi::VERSION.dup
13
+ spec.date = "2020-12-21"
14
+ spec.summary = "A simplistic game engine based on SDL2. Because I can."
15
+ spec.authors = ["Jakub Żuchowski"]
16
+ spec.email = "ellmo@ellmo.net"
17
+ spec.homepage = "https://github.com/ellmo/hemi"
18
+ spec.license = "MIT"
19
+ # Fetch all git-versioned files, excluding all vendor, test, demo and example locations.
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.match(%r{^(.bundle|demo|examples|spec|features|vendor|assets)/})
22
+ end
23
+
24
+ spec.required_ruby_version = ">= 2.6.0"
25
+
26
+ spec.add_dependency "pry", "~> 0.12"
27
+ spec.add_dependency "ruby-sdl2", "0.3.5"
28
+
29
+ spec.add_development_dependency "rspec", "~> 3.9"
30
+ spec.add_development_dependency "rubocop", "~> 0.77"
31
+ spec.add_development_dependency "rubocop-performance", "~> 1.5"
32
+ spec.add_development_dependency "rubocop-rspec", "~> 1.37"
33
+ end
@@ -0,0 +1,58 @@
1
+ require "singleton"
2
+ require "sdl2"
3
+
4
+ require_relative "loader"
5
+
6
+ module Hemi
7
+ module Engine
8
+ @debug = false
9
+
10
+ def initialize
11
+ sdl_init
12
+ super
13
+ end
14
+
15
+ attr_reader :window
16
+
17
+ def sdl_init
18
+ SDL2.init(SDL2::INIT_EVERYTHING)
19
+ end
20
+
21
+ class << self
22
+ attr_reader :debug
23
+
24
+ def prepended(klass)
25
+ klass.include Singleton
26
+
27
+ Loader.load_tree "helpers"
28
+ Loader.load_tree "render"
29
+ Loader.load_tree "input"
30
+ Loader.load_tree "event"
31
+ end
32
+
33
+ def debug_on!
34
+ @debug = true
35
+ end
36
+
37
+ def debug_off!
38
+ @debug = false
39
+ end
40
+ end
41
+
42
+ def run
43
+ super if defined?(super)
44
+ init_window
45
+ start_loop
46
+ end
47
+
48
+ private
49
+
50
+ def init_window
51
+ @window = Hemi::Render::Window.instance
52
+ end
53
+
54
+ def start_loop
55
+ Hemi::Event::LoopMachine.instance.call
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,52 @@
1
+ module Hemi::Event
2
+ class EventLoop
3
+
4
+ def initialize(logic, events)
5
+ @logic = logic
6
+ @events = events.each_with_object({}) do |(key, action), hsh|
7
+ hsh[SDL2::Key::Scan.const_get(key.upcase)] = action
8
+ end
9
+ end
10
+
11
+ attr_reader :logic, :events, :event
12
+
13
+ def handle(event)
14
+ @event = event
15
+
16
+ case event
17
+ when SDL2::Event::KeyDown
18
+ handle_key
19
+ end
20
+
21
+ @event = nil
22
+ end
23
+
24
+ def process
25
+ logic.call
26
+ end
27
+
28
+ private
29
+
30
+ def handle_key
31
+ if (action = events[event.scancode]).is_a? Symbol
32
+ instance_eval action.to_s
33
+ else
34
+ action.call
35
+ end
36
+ end
37
+
38
+ def key_event?
39
+ event.is_a?
40
+ end
41
+
42
+ def key_down
43
+ return unless key_event?
44
+
45
+ SDL2::Key::Scan.const_get(event.scancode).downcase
46
+ end
47
+
48
+ def debug!
49
+ Hemi::Engine.debug_on!
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,62 @@
1
+ module Hemi::Event
2
+ class LoopMachine
3
+ include Singleton
4
+
5
+ @loops = {}
6
+ @current = nil
7
+
8
+ attr_reader :event
9
+
10
+ def call
11
+ loop do
12
+ Hemi::Render::Window.wipe_screen
13
+
14
+ handle_events while poll_event
15
+ process_logic
16
+
17
+ Hemi::Render::Window.renderer.present
18
+ debug!
19
+ sleep 0.1
20
+ end
21
+ end
22
+
23
+ class << self
24
+ attr_reader :loops, :current
25
+
26
+ def register(name, logic, events)
27
+ event_loop = EventLoop.new(logic, events)
28
+ @current = event_loop if loops.empty?
29
+ @loops[name] = event_loop
30
+
31
+ event_loop
32
+ end
33
+
34
+ def [](name)
35
+ @loops[name]
36
+ end
37
+
38
+ def switch(name)
39
+ @current = LoopMachine[name]
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def handle_events
46
+ LoopMachine.current.handle event
47
+ end
48
+
49
+ def process_logic
50
+ LoopMachine.current.process
51
+ end
52
+
53
+ def poll_event
54
+ @event = SDL2::Event.poll
55
+ end
56
+
57
+ def debug!
58
+ binding.pry if Hemi::Engine.debug # rubocop:disable Lint/Debugger
59
+ Hemi::Engine.debug_off!
60
+ end
61
+ end
62
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ Size = Struct.new(:width, :height, keyword_init: true)
2
+ Position = Struct.new(:x, :y, keyword_init: true)
@@ -0,0 +1,13 @@
1
+ module Hemi
2
+ module Loader
3
+ def self.load_tree(tree_dir)
4
+ if File.exist?(manifest_file = File.join(__dir__, tree_dir, "_manifest.rb"))
5
+ require manifest_file
6
+ else
7
+ Dir[File.join(__dir__, tree_dir, "**", "*.rb")].sort.each do |file|
8
+ require file
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ require_relative "window"
2
+ require_relative "texture"
3
+ require_relative "sprite"
4
+ require_relative "font"
@@ -0,0 +1,55 @@
1
+ module Hemi::Render
2
+ class Font < Texture
3
+ SDL2::TTF.init
4
+
5
+ ALLOWED_MODES = %i[solid blended shaded].freeze
6
+ FONT_FILE_PATTERN = /([\w-]*)_([\d]*)/.freeze
7
+
8
+ # ERR__INVALID_FONT_NAME = "Invalid font name format. :font_name_size expected".freeze
9
+ # ERR__INVALID_TEXTURE_SIZE = "Invalid texture size.".freeze
10
+ # ERR__INVALID_POSITION = "Ivalid position.".freeze
11
+
12
+ @fonts = {}
13
+
14
+ def initialize(name_size)
15
+ name, size = *name_size.to_s.scan(FONT_FILE_PATTERN).flatten
16
+ @font_path = "assets/fonts/#{name}.ttf"
17
+ @font = SDL2::TTF.open(font_path, size.to_i)
18
+
19
+ Font.register(name_size, self)
20
+ rescue SDL2::Error => _e
21
+ raise ArgumentError, format(ERR__FONT_NOT_FOUND, font_path)
22
+ end
23
+
24
+ attr_reader :font_path, :size, :font
25
+
26
+ def render(text, position: nil, mode: :blended)
27
+ @texture = Hemi::Render::Window
28
+ .renderer
29
+ .create_texture_from(surface(text, mode: mode))
30
+ Hemi::Render::Window.renderer.copy(texture, nil, rectangle(position: position))
31
+ end
32
+
33
+ class << self
34
+ attr_reader :fonts
35
+
36
+ def bucket
37
+ :fonts
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def surface(text, color: [255, 255, 255], mode: :blended, shade: [0, 0, 0])
44
+ raise(ERR__INVALID_MODE) unless ALLOWED_MODES.include? mode
45
+
46
+ case mode
47
+ when :blended, :solid
48
+ font.send("render_#{mode}", text, color)
49
+ when :shaded
50
+ font.render_shaded(text, color, shade)
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ module Hemi::Render
2
+ class Sprite < Texture
3
+ ERR__IMAGE_NOT_FOUND = "Image %s not found.".freeze
4
+
5
+ @sprites = {}
6
+
7
+ def initialize(name)
8
+ @texture = Hemi::Render::Window.renderer.load_texture("assets/img/#{name}.bmp")
9
+ Sprite.register(name, self)
10
+ rescue SDL2::Error => _e
11
+ raise ArgumentError, format(ERR__IMAGE_NOT_FOUND, font_path)
12
+ end
13
+
14
+ def render(position: nil, size: nil)
15
+ Hemi::Render::Window.renderer.copy(texture, nil, rectangle(position: position, size: size))
16
+ end
17
+
18
+ class << self
19
+ attr_reader :sprites
20
+
21
+ def bucket
22
+ :sprites
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,75 @@
1
+ module Hemi::Render
2
+ class Texture
3
+ ERR__INVALID_POSITION = "Ivalid position.".freeze
4
+
5
+ def initialize(name)
6
+ raise NotImplementedError
7
+ end
8
+
9
+ attr_reader :texture
10
+
11
+ def render
12
+ raise NotImplementedError
13
+ end
14
+
15
+ class << self
16
+ def register(name, texture)
17
+ public_send(bucket)[name] ||= texture
18
+ end
19
+
20
+ def [](name)
21
+ public_send(bucket)[name] || new(name)
22
+ end
23
+
24
+ def purge!
25
+ instance_variable_set "@#{bucket}", {}
26
+ end
27
+
28
+ def bucket
29
+ raise NotImplementedError
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def rectangle(size: nil, position: nil)
36
+ SDL2::Rect.new(*calculate_position(position), *calculate_size(size))
37
+ end
38
+
39
+ def calculate_size(size = nil)
40
+ size_obj = Size.new(height: nil, width: nil)
41
+
42
+ if size.is_a? Array
43
+ size_obj.height = size[0]
44
+ size_obj.width = size[1]
45
+ elsif size.is_a? Hash
46
+ size_obj.height = size[:height]
47
+ size_obj.width = size[:width]
48
+ else
49
+ size_obj.height = texture.h
50
+ size_obj.width = texture.w
51
+ end
52
+
53
+ size_obj
54
+ end
55
+
56
+ def calculate_position(position = nil)
57
+ position_obj = Position.new(x: nil, y: nil)
58
+
59
+ if position.nil?
60
+ position_obj.x = 0
61
+ position_obj.y = 0
62
+ elsif position.is_a? Array
63
+ position_obj.x = position[0]
64
+ position_obj.y = position[1]
65
+ elsif position.is_a? Hash
66
+ position_obj.x = position[:x]
67
+ position_obj.y = position[:y]
68
+ else
69
+ raise ArgumentError(ERR__INVALID_POSITION)
70
+ end
71
+
72
+ position_obj
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,37 @@
1
+ module Hemi::Render
2
+ class Window
3
+ include Singleton
4
+
5
+ DEFAULT_WINDOW_WIDTH = 640
6
+ DEFAULT_WINDOW_HEIGHT = 480
7
+
8
+ def initialize(width = DEFAULT_WINDOW_WIDTH, height = DEFAULT_WINDOW_HEIGHT)
9
+ @size = Size.new(width: width, height: height)
10
+ end
11
+
12
+ attr_reader :size
13
+
14
+ def renderer
15
+ @renderer ||= sdl_window.create_renderer(-1, 0)
16
+ end
17
+
18
+ def sdl_window
19
+ @sdl_window ||= SDL2::Window.create(
20
+ "Hemi",
21
+ SDL2::Window::POS_CENTERED,
22
+ SDL2::Window::POS_CENTERED,
23
+ *size,
24
+ 0
25
+ )
26
+ end
27
+
28
+ def self.wipe_screen
29
+ instance.renderer.draw_color = [0, 0, 0]
30
+ instance.renderer.fill_rect(SDL2::Rect.new(0, 0, *instance.size))
31
+ end
32
+
33
+ def self.renderer
34
+ instance.renderer
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Hemi
2
+ VERSION = "0.0.2".freeze
3
+ end
data/lib/hemi.rb ADDED
@@ -0,0 +1,4 @@
1
+ require "sdl2"
2
+ require "pry"
3
+ require "hemi/version"
4
+ require "hemi/engine"
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hemi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Jakub Żuchowski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.12'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-sdl2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.5
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.77'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.77'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-performance
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.37'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.37'
97
+ description:
98
+ email: ellmo@ellmo.net
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - ".gitignore"
104
+ - ".rspec"
105
+ - ".rubocop.yml"
106
+ - ".ruby-version"
107
+ - Gemfile
108
+ - Gemfile.lock
109
+ - README.md
110
+ - hemi.gemspec
111
+ - lib/hemi.rb
112
+ - lib/hemi/engine.rb
113
+ - lib/hemi/event/event_loop.rb
114
+ - lib/hemi/event/loop_machine.rb
115
+ - lib/hemi/helpers/self_manager.rb
116
+ - lib/hemi/helpers/simple.rb
117
+ - lib/hemi/loader.rb
118
+ - lib/hemi/render/_manifest.rb
119
+ - lib/hemi/render/font.rb
120
+ - lib/hemi/render/sprite.rb
121
+ - lib/hemi/render/texture.rb
122
+ - lib/hemi/render/window.rb
123
+ - lib/hemi/version.rb
124
+ homepage: https://github.com/ellmo/hemi
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 2.6.0
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubygems_version: 3.0.3
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: A simplistic game engine based on SDL2. Because I can.
147
+ test_files: []