shirokuro 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +0 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +21 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +21 -0
  8. data/Rakefile +8 -0
  9. data/examples/audio/main.rb +40 -0
  10. data/examples/audio/run.sh +2 -0
  11. data/examples/layers_and_sorting/main.rb +62 -0
  12. data/examples/layers_and_sorting/run.sh +2 -0
  13. data/examples/physx/main.rb +114 -0
  14. data/examples/physx/run.sh +2 -0
  15. data/examples/shared/content/audio/boing.ogg +0 -0
  16. data/examples/shared/content/audio/song_1.ogg +0 -0
  17. data/examples/shared/content/gfx/character_sprite.png +0 -0
  18. data/examples/shared/content/gfx/tileset.png +0 -0
  19. data/examples/shared/content/maps/stage2.json +299 -0
  20. data/examples/sprite/main.rb +43 -0
  21. data/examples/sprite/run.sh +2 -0
  22. data/examples/sprite_animation/main.rb +45 -0
  23. data/examples/sprite_animation/run.sh +2 -0
  24. data/examples/tmx_map/main.rb +70 -0
  25. data/examples/tmx_map/run.sh +2 -0
  26. data/lib/shirokuro.rb +42 -0
  27. data/lib/shirokuro/audio/audio_manager.rb +80 -0
  28. data/lib/shirokuro/content/content_manager.rb +58 -0
  29. data/lib/shirokuro/ecs/component.rb +37 -0
  30. data/lib/shirokuro/ecs/game_object.rb +58 -0
  31. data/lib/shirokuro/ecs/game_object_manager.rb +51 -0
  32. data/lib/shirokuro/ecs/id_generator.rb +10 -0
  33. data/lib/shirokuro/math/matrix.rb +72 -0
  34. data/lib/shirokuro/math/transform.rb +16 -0
  35. data/lib/shirokuro/math/vec2.rb +38 -0
  36. data/lib/shirokuro/physics/physics.rb +22 -0
  37. data/lib/shirokuro/standard_components/animations/animation.rb +30 -0
  38. data/lib/shirokuro/standard_components/animations/animation_component.rb +28 -0
  39. data/lib/shirokuro/standard_components/cameras/camera.rb +59 -0
  40. data/lib/shirokuro/standard_components/maps/map_component.rb +10 -0
  41. data/lib/shirokuro/standard_components/physics/box_collider.rb +40 -0
  42. data/lib/shirokuro/standard_components/physics/circle_collider.rb +29 -0
  43. data/lib/shirokuro/standard_components/physics/polygon_collider.rb +35 -0
  44. data/lib/shirokuro/standard_components/physics/rigid_body.rb +57 -0
  45. data/lib/shirokuro/standard_components/rendering/animation_sprite_renderer.rb +26 -0
  46. data/lib/shirokuro/standard_components/rendering/map_renderer.rb +36 -0
  47. data/lib/shirokuro/standard_components/rendering/shape_renderer.rb +95 -0
  48. data/lib/shirokuro/standard_components/rendering/sprite_renderer.rb +21 -0
  49. data/lib/shirokuro/standard_components/tmx/tmx_map.rb +20 -0
  50. data/lib/shirokuro/standard_components/tmx/tmx_map_layer.rb +38 -0
  51. data/lib/shirokuro/standard_components/tmx/tmx_map_layer_object.rb +17 -0
  52. data/lib/shirokuro/standard_components/transformation/rotation.rb +14 -0
  53. data/lib/shirokuro/version.rb +3 -0
  54. data/shirokuro.gemspec +30 -0
  55. data/spec/shirokuro/ecs/component_spec.rb +78 -0
  56. data/spec/shirokuro/ecs/game_object_manager_spec.rb +113 -0
  57. data/spec/shirokuro/ecs/game_object_spec.rb +110 -0
  58. data/spec/shirokuro/math/matrix_spec.rb +49 -0
  59. data/spec/shirokuro/math/transform_spec.rb +28 -0
  60. data/spec/shirokuro/math/vec2_spec.rb +49 -0
  61. data/spec/spec_helper.rb +12 -0
  62. metadata +223 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 532cac01b7c823debab6b91ac81d494289578edd
4
+ data.tar.gz: 3952eaea9d1dd48d8cb1fb4553ba7b6bde91b2fd
5
+ SHA512:
6
+ metadata.gz: 3d6a594fafb79c0fb351f52d888c72ad94fc0416cf36f146889fd4f731fd9227f3a0359898d7e6e09c9fed751452e1ae0d47802c913197498b83878a55292003
7
+ data.tar.gz: 80ef90f53f0b969554a4e8c24c23dd515ecb7ed8d8e36fe9d23e20f482a40d153210a2accc1aec9e544d0cdc2b1adf9e116e7e8e5c86f50b781e55ae48e080b6
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ .DS_Store
data/.rspec ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in shirokuro.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,21 @@
1
+ guard :rspec, cmd: "bundle exec rspec" do
2
+ require "guard/rspec/dsl"
3
+ dsl = Guard::RSpec::Dsl.new(self)
4
+
5
+ # RSpec files
6
+ rspec = dsl.rspec
7
+ watch(rspec.spec_helper) { rspec.spec_dir }
8
+ watch(rspec.spec_support) { rspec.spec_dir }
9
+ watch(rspec.spec_files)
10
+
11
+ # lib reloads
12
+ watch(%r{^lib/(.+)\.rb$}) { |m|
13
+ puts "spec/#{m[1]}_spec.rb"
14
+ "spec/#{m[1]}_spec.rb"
15
+ }
16
+
17
+ # Ruby files
18
+ ruby = dsl.ruby
19
+
20
+ dsl.watch_spec_files_for(ruby.lib_files)
21
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 erikskogl
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # Shirokuro
2
+
3
+ Gosu helper lib
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'shirokuro'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install shirokuro
18
+
19
+ ## Usage
20
+
21
+ A very personal gem, most likely you won't have any use for it
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new
6
+
7
+ task :default => :spec
8
+ task :test => :spec
@@ -0,0 +1,40 @@
1
+ require 'gosu'
2
+ require_relative '../../lib/shirokuro'
3
+
4
+ class Window < Gosu::Window
5
+ def initialize width, height
6
+ super(width, height, false)
7
+ self.caption = "SK Audio Example"
8
+
9
+ @audio = SK::AudioManager.new(self, "../shared/content/audio")
10
+
11
+ @audio.register_song("song_1")
12
+ @audio.register_sound("boing")
13
+ @audio.load
14
+
15
+ @audio.play_song "song_1"
16
+
17
+ end
18
+
19
+ def button_down(id)
20
+ case id
21
+ when Gosu::KbEscape
22
+ self.close
23
+ when Gosu::KbSpace
24
+ @audio.play "boing"
25
+ end
26
+ end
27
+
28
+ def update
29
+ dt = 16.0 #fake it
30
+
31
+ # cleans up audio
32
+ @audio.update dt
33
+ end
34
+
35
+ def draw
36
+ end
37
+ end
38
+
39
+ window = Window.new(512, 512)
40
+ window.show
@@ -0,0 +1,2 @@
1
+ clear
2
+ bundle exec ruby main.rb
@@ -0,0 +1,62 @@
1
+ require 'gosu'
2
+ require_relative '../../lib/shirokuro'
3
+
4
+ class Window < Gosu::Window
5
+ def initialize width, height
6
+ super(width, height, false)
7
+ self.caption = "SK Layer and Order sorting Example"
8
+
9
+ @content = SK::ContentManager.new(self, "../shared/content/", true)
10
+
11
+ @manager = SK::GameObjectManager.new
12
+
13
+ sprite1 = @manager.create("sprite")
14
+ sprite1.transform.position = SK::Vec2.new(256, 256)
15
+ sprite1.transform.scale = SK::Vec2.new(1, 1) * 2.0
16
+ renderer1 = SK::SpriteRenderer.new(@content.load_tiles("gfx/character_sprite.png", 32, 32).first)
17
+ renderer1.layer = 0
18
+ renderer1.order_in_layer = 0
19
+ sprite1.add_component(renderer1)
20
+ sprite1.get_component(SK::SpriteRenderer).origin.y = 1.0
21
+
22
+ sprite2 = @manager.create("sprite")
23
+ sprite2.transform.position = SK::Vec2.new(266, 256)
24
+ sprite2.transform.scale = SK::Vec2.new(1, 1) * 2.0
25
+ renderer2 = SK::SpriteRenderer.new(@content.load_tiles("gfx/character_sprite.png", 32, 32).first)
26
+ renderer2.layer = 0
27
+ renderer2.order_in_layer = -1 # behind the other
28
+ sprite2.add_component(renderer2)
29
+ sprite2.get_component(SK::SpriteRenderer).origin.y = 1.0
30
+
31
+
32
+ bg = @manager.create("sprite")
33
+ bg.transform.position = SK::Vec2.new(266, 256)
34
+ bg.transform.scale = SK::Vec2.new(1, 1) * 12.0
35
+ renderer3 = SK::SpriteRenderer.new(@content.load_tiles("gfx/character_sprite.png", 32, 32).first)
36
+ renderer3.layer = -1 # background
37
+ renderer3.order_in_layer = 0
38
+ bg.add_component(renderer3)
39
+
40
+ @manager.start
41
+ end
42
+
43
+ def button_down(id)
44
+ case id
45
+ when Gosu::KbEscape
46
+ self.close
47
+ end
48
+ end
49
+
50
+ def update
51
+ delta = 16.0 #fake it
52
+
53
+ @manager.update delta
54
+ end
55
+
56
+ def draw
57
+ @manager.draw self
58
+ end
59
+ end
60
+
61
+ window = Window.new(512, 512)
62
+ window.show
@@ -0,0 +1,2 @@
1
+ clear
2
+ bundle exec ruby main.rb
@@ -0,0 +1,114 @@
1
+ require 'gosu'
2
+ require_relative '../../lib/shirokuro'
3
+
4
+ class Window < Gosu::Window
5
+ def initialize width, height
6
+ super(width, height, false)
7
+ self.caption = "SK Physics Example"
8
+
9
+ @content = SK::ContentManager.new(self, "../shared/content/", true)
10
+ @manager = SK::GameObjectManager.new
11
+
12
+ @cam = SK::Camera.new(SK::Vec2.new(width, height))
13
+ cam = @manager.create("cam")
14
+ cam.add_component(@cam)
15
+ @cam.set_zoom(1.0)
16
+
17
+ floor = @manager.create("floor")
18
+ floor.add_component(SK::RigidBody.new())
19
+ floor.add_component(SK::BoxCollider.new(256, 32))
20
+ floor.add_component(SK::ShapeRenderer.new)
21
+ floor.get_component(SK::RigidBody).static = true
22
+
23
+ (0..6).each do |i|
24
+ ((-i)..(i - 1)).each do |j|
25
+ box = @manager.create("box")
26
+ box.add_component(SK::RigidBody.new)
27
+ box.add_component(SK::BoxCollider.new(6, 6))
28
+ box.add_component(SK::ShapeRenderer.new)
29
+ box.get_component(SK::BoxCollider).restitution = 0.95 # make balls really bouncy
30
+ box.transform.position.x = (j * 8) - 48
31
+ box.transform.position.y = -(9*8) + 4 + (i * 8)
32
+ end
33
+ end
34
+
35
+ (0..6).each do |i|
36
+ ((-i)..(i - 1)).each do |j|
37
+ box = @manager.create("box")
38
+ box.add_component(SK::RigidBody.new)
39
+ box.add_component(SK::CircleCollider.new(3))
40
+ box.add_component(SK::ShapeRenderer.new)
41
+ box.get_component(SK::CircleCollider).restitution = 0.95 # make boxes really bouncy
42
+ box.transform.position.x = (j * 8) + 48
43
+ box.transform.position.y = -(9*8) + 4 + (i * 8)
44
+ end
45
+ end
46
+
47
+ # big heavy box
48
+ box = @manager.create("large_box")
49
+ box.add_component(SK::RigidBody.new)
50
+ box.add_component(SK::BoxCollider.new(32, 16))
51
+ box.add_component(SK::ShapeRenderer.new)
52
+ box.get_component(SK::RigidBody).mass = 10.0
53
+ box.transform.position.y = -300
54
+
55
+ # free form polygon
56
+ poly = @manager.create("polygon")
57
+ poly.add_component(SK::RigidBody.new)
58
+ poly.add_component(SK::PolygonCollider.new([
59
+ CP::Vec2.new(-13, -12),
60
+ CP::Vec2.new(-23, 14),
61
+ CP::Vec2.new(0, 32),
62
+ CP::Vec2.new(14, 0),
63
+ CP::Vec2.new(20, -18)
64
+
65
+ ]))
66
+ poly.add_component(SK::ShapeRenderer.new)
67
+ poly.get_component(SK::RigidBody).mass = 10.0
68
+ poly.transform.position.y = -400
69
+
70
+ @manager.start
71
+ end
72
+
73
+ def button_down(id)
74
+ case id
75
+ when Gosu::KbEscape
76
+ self.close
77
+ end
78
+ end
79
+
80
+ def update
81
+ dt = 16.0 #fake it
82
+
83
+ if button_down?(Gosu::KbLeft)
84
+ @cam.move_by(-1.0 * dt, 0)
85
+ end
86
+ if button_down?(Gosu::KbRight)
87
+ @cam.move_by(1.0 * dt, 0)
88
+ end
89
+ if button_down?(Gosu::KbUp)
90
+ @cam.move_by(0, -1.0 * dt)
91
+ end
92
+ if button_down?(Gosu::KbDown)
93
+ @cam.move_by(0, 1.0 * dt)
94
+ end
95
+
96
+ if button_down?(Gosu::KbW)
97
+ @cam.zoom_by(0.01)
98
+ end
99
+ if button_down?(Gosu::KbS)
100
+ @cam.zoom_by(-0.01)
101
+ end
102
+
103
+ @manager.update dt
104
+ end
105
+
106
+ def draw
107
+ @cam.view(self) do
108
+ @manager.draw self
109
+ end
110
+ end
111
+ end
112
+
113
+ window = Window.new(512, 512)
114
+ window.show
@@ -0,0 +1,2 @@
1
+ clear
2
+ bundle exec ruby main.rb
@@ -0,0 +1,299 @@
1
+ { "height":16,
2
+ "layers":[
3
+ {
4
+ "data":[39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39],
5
+ "height":16,
6
+ "name":"Background",
7
+ "opacity":0.389999985694885,
8
+ "type":"tilelayer",
9
+ "visible":true,
10
+ "width":16,
11
+ "x":0,
12
+ "y":0
13
+ },
14
+ {
15
+ "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
16
+ "height":16,
17
+ "name":"Detail",
18
+ "opacity":0.180000007152557,
19
+ "type":"tilelayer",
20
+ "visible":true,
21
+ "width":16,
22
+ "x":0,
23
+ "y":0
24
+ },
25
+ {
26
+ "data":[0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 9, 10, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 1, 2, 3, 18, 19, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 9, 10, 11, 0, 36, 37, 35, 36, 37, 0, 0, 17, 18, 19, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19],
27
+ "height":16,
28
+ "name":"Near",
29
+ "opacity":0.239999994635582,
30
+ "type":"tilelayer",
31
+ "visible":true,
32
+ "width":16,
33
+ "x":0,
34
+ "y":0
35
+ },
36
+ {
37
+ "data":[9, 10, 11, 0, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 17, 18, 19, 0, 17, 18, 18, 18, 18, 28, 18, 18, 18, 18, 18, 19, 11, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 11, 25, 26, 26, 26, 26, 26, 26, 26, 27, 0, 0, 0, 0, 0, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 11, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 34, 34, 0, 0, 9, 11, 0, 0, 0, 0, 0, 0, 25, 26, 26, 26, 26, 26, 26, 26, 27, 11, 34, 34, 34, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 9, 11, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 0, 0, 0, 9, 11, 25, 26, 26, 26, 26, 26, 17, 18, 19, 0, 0, 0, 0, 0, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 9, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 17, 18, 19, 0, 9, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 17, 18, 19, 0, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27],
38
+ "height":16,
39
+ "name":"Main",
40
+ "opacity":1,
41
+ "properties":
42
+ {
43
+ "collision":"true"
44
+ },
45
+ "type":"tilelayer",
46
+ "visible":true,
47
+ "width":16,
48
+ "x":0,
49
+ "y":0
50
+ },
51
+ {
52
+ "draworder":"topdown",
53
+ "height":16,
54
+ "name":"enemies",
55
+ "objects":[
56
+ {
57
+ "height":10,
58
+ "name":"t1",
59
+ "properties":
60
+ {
61
+
62
+ },
63
+ "rotation":90,
64
+ "type":"turret",
65
+ "visible":true,
66
+ "width":14.6666666666667,
67
+ "x":335.333333333333,
68
+ "y":262.666666666667
69
+ },
70
+ {
71
+ "height":12,
72
+ "name":"t2",
73
+ "properties":
74
+ {
75
+
76
+ },
77
+ "rotation":90,
78
+ "type":"turret",
79
+ "visible":true,
80
+ "width":16.6667,
81
+ "x":306.333316666666,
82
+ "y":165.333333333333
83
+ },
84
+ {
85
+ "height":11.3333333333333,
86
+ "name":"m1",
87
+ "properties":
88
+ {
89
+
90
+ },
91
+ "rotation":0,
92
+ "type":"mine",
93
+ "visible":true,
94
+ "width":21.3333666666667,
95
+ "x":179.66665,
96
+ "y":467.333333333333
97
+ },
98
+ {
99
+ "height":10,
100
+ "name":"t1",
101
+ "properties":
102
+ {
103
+
104
+ },
105
+ "rotation":90,
106
+ "type":"turret",
107
+ "visible":true,
108
+ "width":14.6667,
109
+ "x":468.66665,
110
+ "y":264.333333333333
111
+ },
112
+ {
113
+ "height":11.3333,
114
+ "name":"m1",
115
+ "properties":
116
+ {
117
+
118
+ },
119
+ "rotation":0,
120
+ "type":"mine",
121
+ "visible":true,
122
+ "width":21.3334,
123
+ "x":249.3333,
124
+ "y":468.33335
125
+ },
126
+ {
127
+ "height":11.3333,
128
+ "name":"m1",
129
+ "properties":
130
+ {
131
+
132
+ },
133
+ "rotation":0,
134
+ "type":"mine",
135
+ "visible":true,
136
+ "width":21.3334,
137
+ "x":317.999966666667,
138
+ "y":469.666683333333
139
+ },
140
+ {
141
+ "height":11.3333,
142
+ "name":"m1",
143
+ "properties":
144
+ {
145
+
146
+ },
147
+ "rotation":0,
148
+ "type":"mine",
149
+ "visible":true,
150
+ "width":21.3334,
151
+ "x":384.666633333333,
152
+ "y":469.666683333333
153
+ },
154
+ {
155
+ "height":12,
156
+ "name":"t2",
157
+ "properties":
158
+ {
159
+
160
+ },
161
+ "rotation":90,
162
+ "type":"turret",
163
+ "visible":true,
164
+ "width":16.6667,
165
+ "x":65.66665,
166
+ "y":166.666666666667
167
+ },
168
+ {
169
+ "height":12,
170
+ "name":"t2",
171
+ "properties":
172
+ {
173
+
174
+ },
175
+ "rotation":90,
176
+ "type":"turret",
177
+ "visible":true,
178
+ "width":16.6667,
179
+ "x":86.9999833333333,
180
+ "y":68
181
+ },
182
+ {
183
+ "height":12,
184
+ "name":"t2",
185
+ "properties":
186
+ {
187
+
188
+ },
189
+ "rotation":90,
190
+ "type":"turret",
191
+ "visible":true,
192
+ "width":16.6667,
193
+ "x":470.333316666667,
194
+ "y":70
195
+ },
196
+ {
197
+ "height":11.3333,
198
+ "name":"m1",
199
+ "properties":
200
+ {
201
+
202
+ },
203
+ "rotation":0,
204
+ "type":"mine",
205
+ "visible":true,
206
+ "width":21.3334,
207
+ "x":135.3333,
208
+ "y":116.33335
209
+ },
210
+ {
211
+ "height":11.3333,
212
+ "name":"m1",
213
+ "properties":
214
+ {
215
+
216
+ },
217
+ "rotation":0,
218
+ "type":"mine",
219
+ "visible":true,
220
+ "width":21.3334,
221
+ "x":295.999966666667,
222
+ "y":119.000016666667
223
+ },
224
+ {
225
+ "height":11.3333,
226
+ "name":"m1",
227
+ "properties":
228
+ {
229
+
230
+ },
231
+ "rotation":0,
232
+ "type":"mine",
233
+ "visible":true,
234
+ "width":21.3334,
235
+ "x":296.666633333333,
236
+ "y":216.33335
237
+ },
238
+ {
239
+ "height":11.3333,
240
+ "name":"m1",
241
+ "properties":
242
+ {
243
+
244
+ },
245
+ "rotation":0,
246
+ "type":"mine",
247
+ "visible":true,
248
+ "width":21.3334,
249
+ "x":448.666633333333,
250
+ "y":212.33335
251
+ },
252
+ {
253
+ "height":11.3333,
254
+ "name":"S",
255
+ "properties":
256
+ {
257
+
258
+ },
259
+ "rotation":0,
260
+ "type":"start",
261
+ "visible":true,
262
+ "width":21.3334,
263
+ "x":53.3333,
264
+ "y":403.000016666667
265
+ }],
266
+ "opacity":1,
267
+ "type":"objectgroup",
268
+ "visible":true,
269
+ "width":16,
270
+ "x":0,
271
+ "y":0
272
+ }],
273
+ "orientation":"orthogonal",
274
+ "properties":
275
+ {
276
+
277
+ },
278
+ "renderorder":"right-down",
279
+ "tileheight":32,
280
+ "tilesets":[
281
+ {
282
+ "firstgid":1,
283
+ "image":"..\/tileset.png",
284
+ "imageheight":256,
285
+ "imagewidth":256,
286
+ "margin":0,
287
+ "name":"tileset",
288
+ "properties":
289
+ {
290
+
291
+ },
292
+ "spacing":0,
293
+ "tileheight":32,
294
+ "tilewidth":32
295
+ }],
296
+ "tilewidth":32,
297
+ "version":1,
298
+ "width":16
299
+ }