tank_island 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +22 -0
  6. data/README.md +58 -0
  7. data/Rakefile +2 -0
  8. data/bin/tank_island +30 -0
  9. data/lib/entities/box.rb +28 -0
  10. data/lib/entities/bullet.rb +26 -0
  11. data/lib/entities/camera.rb +113 -0
  12. data/lib/entities/components/ai/gun.rb +114 -0
  13. data/lib/entities/components/ai/tank_chasing_state.rb +30 -0
  14. data/lib/entities/components/ai/tank_fighting_state.rb +47 -0
  15. data/lib/entities/components/ai/tank_fleeing_state.rb +50 -0
  16. data/lib/entities/components/ai/tank_motion_fsm.rb +102 -0
  17. data/lib/entities/components/ai/tank_motion_state.rb +84 -0
  18. data/lib/entities/components/ai/tank_navigating_state.rb +34 -0
  19. data/lib/entities/components/ai/tank_roaming_state.rb +83 -0
  20. data/lib/entities/components/ai/tank_stuck_state.rb +45 -0
  21. data/lib/entities/components/ai/vision.rb +109 -0
  22. data/lib/entities/components/ai_input.rb +70 -0
  23. data/lib/entities/components/box_graphics.rb +39 -0
  24. data/lib/entities/components/bullet_graphics.rb +13 -0
  25. data/lib/entities/components/bullet_physics.rb +65 -0
  26. data/lib/entities/components/bullet_sounds.rb +15 -0
  27. data/lib/entities/components/component.rb +32 -0
  28. data/lib/entities/components/damage_graphics.rb +20 -0
  29. data/lib/entities/components/explosion_graphics.rb +43 -0
  30. data/lib/entities/components/explosion_sounds.rb +16 -0
  31. data/lib/entities/components/health.rb +87 -0
  32. data/lib/entities/components/player_input.rb +100 -0
  33. data/lib/entities/components/player_sounds.rb +16 -0
  34. data/lib/entities/components/powerup_graphics.rb +22 -0
  35. data/lib/entities/components/powerup_sounds.rb +15 -0
  36. data/lib/entities/components/tank_graphics.rb +46 -0
  37. data/lib/entities/components/tank_health.rb +32 -0
  38. data/lib/entities/components/tank_physics.rb +179 -0
  39. data/lib/entities/components/tank_sounds.rb +43 -0
  40. data/lib/entities/components/tree_graphics.rb +69 -0
  41. data/lib/entities/damage.rb +26 -0
  42. data/lib/entities/explosion.rb +34 -0
  43. data/lib/entities/game_object.rb +54 -0
  44. data/lib/entities/hud.rb +79 -0
  45. data/lib/entities/map.rb +183 -0
  46. data/lib/entities/object_pool.rb +59 -0
  47. data/lib/entities/powerups/fire_rate_powerup.rb +14 -0
  48. data/lib/entities/powerups/health_powerup.rb +12 -0
  49. data/lib/entities/powerups/powerup.rb +35 -0
  50. data/lib/entities/powerups/powerup_respawn_queue.rb +23 -0
  51. data/lib/entities/powerups/repair_powerup.rb +14 -0
  52. data/lib/entities/powerups/tank_speed_powerup.rb +14 -0
  53. data/lib/entities/radar.rb +62 -0
  54. data/lib/entities/score_display.rb +35 -0
  55. data/lib/entities/tank.rb +64 -0
  56. data/lib/entities/tree.rb +18 -0
  57. data/lib/game_states/demo_state.rb +49 -0
  58. data/lib/game_states/game_state.rb +27 -0
  59. data/lib/game_states/menu_state.rb +60 -0
  60. data/lib/game_states/pause_state.rb +61 -0
  61. data/lib/game_states/play_state.rb +119 -0
  62. data/lib/misc/axis_aligned_bounding_box.rb +33 -0
  63. data/lib/misc/game_window.rb +30 -0
  64. data/lib/misc/names.rb +13 -0
  65. data/lib/misc/quad_tree.rb +91 -0
  66. data/lib/misc/stats.rb +55 -0
  67. data/lib/misc/stereo_sample.rb +96 -0
  68. data/lib/misc/utils.rb +145 -0
  69. data/media/armalite_rifle.ttf +0 -0
  70. data/media/boxes_barrels.json +60 -0
  71. data/media/boxes_barrels.png +0 -0
  72. data/media/bullet.png +0 -0
  73. data/media/c_dot.png +0 -0
  74. data/media/country_field.png +0 -0
  75. data/media/crash.ogg +0 -0
  76. data/media/damage1.png +0 -0
  77. data/media/damage2.png +0 -0
  78. data/media/damage3.png +0 -0
  79. data/media/damage4.png +0 -0
  80. data/media/decor.json +516 -0
  81. data/media/decor.png +0 -0
  82. data/media/decor.psd +0 -0
  83. data/media/explosion.mp3 +0 -0
  84. data/media/explosion.png +0 -0
  85. data/media/fire.mp3 +0 -0
  86. data/media/ground.json +492 -0
  87. data/media/ground.png +0 -0
  88. data/media/ground_units.json +900 -0
  89. data/media/ground_units.png +0 -0
  90. data/media/menu_music.mp3 +0 -0
  91. data/media/metal_interaction2.wav +0 -0
  92. data/media/names.txt +279 -0
  93. data/media/pickups.json +68 -0
  94. data/media/pickups.png +0 -0
  95. data/media/powerup.mp3 +0 -0
  96. data/media/respawn.wav +0 -0
  97. data/media/tank_driving.mp3 +0 -0
  98. data/media/top_secret.ttf +0 -0
  99. data/media/trees.png +0 -0
  100. data/media/trees_packed.json +388 -0
  101. data/media/trees_packed.png +0 -0
  102. data/media/water.png +0 -0
  103. data/spec/misc/aabb_spec.rb +85 -0
  104. data/spec/misc/quad_tree_spec.rb +137 -0
  105. data/tank_island.gemspec +29 -0
  106. metadata +223 -0
@@ -0,0 +1,145 @@
1
+ module Utils
2
+ HEARING_DISTANCE = 1000.0
3
+ DEBUG_COLORS = [
4
+ Gosu::Color::RED,
5
+ Gosu::Color::BLUE,
6
+ Gosu::Color::YELLOW,
7
+ Gosu::Color::WHITE
8
+ ]
9
+ def self.media_path(file)
10
+ File.join(File.dirname(File.dirname(File.dirname(
11
+ __FILE__))), 'media', file)
12
+ end
13
+
14
+ def self.track_update_interval
15
+ now = Gosu.milliseconds
16
+ @update_interval = (now - (@last_update ||= 0)).to_f
17
+ @last_update = now
18
+ end
19
+
20
+ def self.title_font
21
+ media_path('top_secret.ttf')
22
+ end
23
+
24
+ def self.main_font
25
+ media_path('armalite_rifle.ttf')
26
+ end
27
+
28
+ def self.update_interval
29
+ @update_interval ||= $window.update_interval
30
+ end
31
+
32
+ def self.adjust_speed(speed)
33
+ speed * update_interval / 33.33
34
+ end
35
+
36
+ def self.button_down?(button)
37
+ @buttons ||= {}
38
+ now = Gosu.milliseconds
39
+ now = now - (now % 150)
40
+ if $window.button_down?(button)
41
+ @buttons[button] = now
42
+ true
43
+ elsif @buttons[button]
44
+ if now == @buttons[button]
45
+ true
46
+ else
47
+ @buttons.delete(button)
48
+ false
49
+ end
50
+ end
51
+ end
52
+
53
+ def self.rotate(angle, around_x, around_y, *points)
54
+ result = []
55
+ angle = angle * Math::PI / 180.0
56
+ points.each_slice(2) do |x, y|
57
+ r_x = Math.cos(angle) * (around_x - x) -
58
+ Math.sin(angle) * (around_y - y) + around_x
59
+ r_y = Math.sin(angle) * (around_x - x) +
60
+ Math.cos(angle) * (around_y - y) + around_y
61
+ result << r_x
62
+ result << r_y
63
+ end
64
+ result
65
+ end
66
+
67
+ # http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
68
+ def self.point_in_poly(testx, testy, *poly)
69
+ nvert = poly.size / 2 # Number of vertices in poly
70
+ vertx = []
71
+ verty = []
72
+ poly.each_slice(2) do |x, y|
73
+ vertx << x
74
+ verty << y
75
+ end
76
+ inside = false
77
+ j = nvert - 1
78
+ (0..nvert - 1).each do |i|
79
+ if (((verty[i] > testy) != (verty[j] > testy)) &&
80
+ (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) /
81
+ (verty[j] - verty[i]) + vertx[i]))
82
+ inside = !inside
83
+ end
84
+ j = i
85
+ end
86
+ inside
87
+ end
88
+
89
+ def self.distance_between(x1, y1, x2, y2)
90
+ dx = x1 - x2
91
+ dy = y1 - y2
92
+ Math.sqrt(dx * dx + dy * dy)
93
+ end
94
+
95
+ def self.angle_between(x, y, target_x, target_y)
96
+ dx = target_x - x
97
+ dy = target_y - y
98
+ (180 - Math.atan2(dx, dy) * 180 / Math::PI) + 360 % 360
99
+ end
100
+
101
+ def self.point_at_distance(source_x, source_y, angle, distance)
102
+ angle = (90 - angle) * Math::PI / 180
103
+ x = source_x + Math.cos(angle) * distance
104
+ y = source_y - Math.sin(angle) * distance
105
+ [x, y]
106
+ end
107
+
108
+ def self.mark_corners(box)
109
+ i = 0
110
+ box.each_slice(2) do |x, y|
111
+ color = DEBUG_COLORS[i]
112
+ $window.draw_triangle(
113
+ x - 3, y - 3, color,
114
+ x, y, color,
115
+ x + 3, y - 3, color,
116
+ 100)
117
+ i = (i + 1) % 4
118
+ end
119
+ end
120
+
121
+ def self.volume(object, camera)
122
+ return 1 if object == camera.target
123
+ distance = Utils.distance_between(
124
+ camera.target.x, camera.target.y,
125
+ object.x, object.y)
126
+ distance = [(HEARING_DISTANCE - distance), 0].max
127
+ distance / HEARING_DISTANCE
128
+ end
129
+
130
+ def self.pan(object, camera)
131
+ return 0 if object == camera.target
132
+ pan = object.x - camera.target.x
133
+ sig = pan > 0 ? 1 : -1
134
+ pan = (pan % HEARING_DISTANCE) / HEARING_DISTANCE
135
+ if sig > 0
136
+ pan
137
+ else
138
+ -1 + pan
139
+ end
140
+ end
141
+
142
+ def self.volume_and_pan(object, camera)
143
+ [volume(object, camera), pan(object, camera)]
144
+ end
145
+ end
Binary file
@@ -0,0 +1,60 @@
1
+ {"frames": {
2
+
3
+ "barrel_side.png":
4
+ {
5
+ "frame": {"x":2,"y":2,"w":30,"h":36},
6
+ "rotated": false,
7
+ "trimmed": false,
8
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":36},
9
+ "sourceSize": {"w":30,"h":36}
10
+ },
11
+ "barrel_top.png":
12
+ {
13
+ "frame": {"x":34,"y":2,"w":30,"h":32},
14
+ "rotated": false,
15
+ "trimmed": false,
16
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":32},
17
+ "sourceSize": {"w":30,"h":32}
18
+ },
19
+ "box.png":
20
+ {
21
+ "frame": {"x":42,"y":40,"w":50,"h":50},
22
+ "rotated": false,
23
+ "trimmed": false,
24
+ "spriteSourceSize": {"x":0,"y":0,"w":50,"h":50},
25
+ "sourceSize": {"w":50,"h":50}
26
+ },
27
+ "box_2x1.png":
28
+ {
29
+ "frame": {"x":2,"y":176,"w":80,"h":53},
30
+ "rotated": false,
31
+ "trimmed": false,
32
+ "spriteSourceSize": {"x":0,"y":0,"w":80,"h":53},
33
+ "sourceSize": {"w":80,"h":53}
34
+ },
35
+ "box_2x2.png":
36
+ {
37
+ "frame": {"x":2,"y":92,"w":80,"h":82},
38
+ "rotated": false,
39
+ "trimmed": false,
40
+ "spriteSourceSize": {"x":0,"y":0,"w":80,"h":82},
41
+ "sourceSize": {"w":80,"h":82}
42
+ },
43
+ "box_small.png":
44
+ {
45
+ "frame": {"x":2,"y":40,"w":38,"h":40},
46
+ "rotated": false,
47
+ "trimmed": false,
48
+ "spriteSourceSize": {"x":0,"y":0,"w":38,"h":40},
49
+ "sourceSize": {"w":38,"h":40}
50
+ }},
51
+ "meta": {
52
+ "app": "http://www.codeandweb.com/texturepacker ",
53
+ "version": "1.0",
54
+ "image": "boxes_barrels.png",
55
+ "format": "RGBA8888",
56
+ "size": {"w":94,"h":231},
57
+ "scale": "1",
58
+ "smartupdate": "$TexturePacker:SmartUpdate:e1f8dd3e75d56379964832e4e1fe08fd:ca59b503f7b878a09d84d41cbeb53a15:d01cf1bf6125b2a1524959777ff4451f$"
59
+ }
60
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,516 @@
1
+ {"frames": {
2
+
3
+ "aircraft_1d_destroyed.png":
4
+ {
5
+ "frame": {"x":451,"y":102,"w":57,"h":42},
6
+ "rotated": false,
7
+ "trimmed": false,
8
+ "spriteSourceSize": {"x":0,"y":0,"w":57,"h":42},
9
+ "sourceSize": {"w":57,"h":42}
10
+ },
11
+ "aircraft_2d_destroyed.png":
12
+ {
13
+ "frame": {"x":2,"y":680,"w":63,"h":47},
14
+ "rotated": false,
15
+ "trimmed": false,
16
+ "spriteSourceSize": {"x":0,"y":0,"w":63,"h":47},
17
+ "sourceSize": {"w":63,"h":47}
18
+ },
19
+ "aircraft_3d_destroyed.png":
20
+ {
21
+ "frame": {"x":368,"y":125,"w":81,"h":55},
22
+ "rotated": false,
23
+ "trimmed": false,
24
+ "spriteSourceSize": {"x":0,"y":0,"w":81,"h":55},
25
+ "sourceSize": {"w":81,"h":55}
26
+ },
27
+ "aircraft_3e_destroyed.png":
28
+ {
29
+ "frame": {"x":368,"y":68,"w":81,"h":55},
30
+ "rotated": false,
31
+ "trimmed": false,
32
+ "spriteSourceSize": {"x":0,"y":0,"w":81,"h":55},
33
+ "sourceSize": {"w":81,"h":55}
34
+ },
35
+ "barrels_1.png":
36
+ {
37
+ "frame": {"x":430,"y":738,"w":64,"h":64},
38
+ "rotated": false,
39
+ "trimmed": false,
40
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
41
+ "sourceSize": {"w":64,"h":64}
42
+ },
43
+ "barrels_2.png":
44
+ {
45
+ "frame": {"x":364,"y":680,"w":64,"h":64},
46
+ "rotated": false,
47
+ "trimmed": false,
48
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
49
+ "sourceSize": {"w":64,"h":64}
50
+ },
51
+ "bush_1.png":
52
+ {
53
+ "frame": {"x":102,"y":820,"w":64,"h":64},
54
+ "rotated": false,
55
+ "trimmed": false,
56
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
57
+ "sourceSize": {"w":64,"h":64}
58
+ },
59
+ "bush_big.png":
60
+ {
61
+ "frame": {"x":368,"y":182,"w":128,"h":128},
62
+ "rotated": false,
63
+ "trimmed": false,
64
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
65
+ "sourceSize": {"w":128,"h":128}
66
+ },
67
+ "crates_1.png":
68
+ {
69
+ "frame": {"x":168,"y":794,"w":64,"h":64},
70
+ "rotated": false,
71
+ "trimmed": false,
72
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
73
+ "sourceSize": {"w":64,"h":64}
74
+ },
75
+ "crates_2.png":
76
+ {
77
+ "frame": {"x":102,"y":754,"w":64,"h":64},
78
+ "rotated": false,
79
+ "trimmed": false,
80
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
81
+ "sourceSize": {"w":64,"h":64}
82
+ },
83
+ "crates_3.png":
84
+ {
85
+ "frame": {"x":331,"y":812,"w":64,"h":64},
86
+ "rotated": false,
87
+ "trimmed": false,
88
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
89
+ "sourceSize": {"w":64,"h":64}
90
+ },
91
+ "crates_4.png":
92
+ {
93
+ "frame": {"x":265,"y":760,"w":64,"h":64},
94
+ "rotated": false,
95
+ "trimmed": false,
96
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
97
+ "sourceSize": {"w":64,"h":64}
98
+ },
99
+ "dirt_001.png":
100
+ {
101
+ "frame": {"x":2,"y":480,"w":88,"h":68},
102
+ "rotated": false,
103
+ "trimmed": false,
104
+ "spriteSourceSize": {"x":0,"y":0,"w":88,"h":68},
105
+ "sourceSize": {"w":88,"h":68}
106
+ },
107
+ "dirt_002.png":
108
+ {
109
+ "frame": {"x":2,"y":550,"w":88,"h":64},
110
+ "rotated": false,
111
+ "trimmed": false,
112
+ "spriteSourceSize": {"x":0,"y":0,"w":88,"h":64},
113
+ "sourceSize": {"w":88,"h":64}
114
+ },
115
+ "dirt_grass_hor_01.png":
116
+ {
117
+ "frame": {"x":2,"y":272,"w":128,"h":104},
118
+ "rotated": false,
119
+ "trimmed": false,
120
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":104},
121
+ "sourceSize": {"w":128,"h":104}
122
+ },
123
+ "dirt_grass_hor_02.png":
124
+ {
125
+ "frame": {"x":2,"y":166,"w":128,"h":104},
126
+ "rotated": false,
127
+ "trimmed": false,
128
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":104},
129
+ "sourceSize": {"w":128,"h":104}
130
+ },
131
+ "dirt_grass_vert.png":
132
+ {
133
+ "frame": {"x":132,"y":36,"w":104,"h":128},
134
+ "rotated": false,
135
+ "trimmed": false,
136
+ "spriteSourceSize": {"x":0,"y":0,"w":104,"h":128},
137
+ "sourceSize": {"w":104,"h":128}
138
+ },
139
+ "dirt_road_hor.png":
140
+ {
141
+ "frame": {"x":2,"y":2,"w":256,"h":32},
142
+ "rotated": false,
143
+ "trimmed": false,
144
+ "spriteSourceSize": {"x":0,"y":0,"w":256,"h":32},
145
+ "sourceSize": {"w":256,"h":32}
146
+ },
147
+ "dirt_road_vert.png":
148
+ {
149
+ "frame": {"x":2,"y":738,"w":32,"h":256},
150
+ "rotated": false,
151
+ "trimmed": false,
152
+ "spriteSourceSize": {"x":0,"y":0,"w":32,"h":256},
153
+ "sourceSize": {"w":32,"h":256}
154
+ },
155
+ "grass_01.png":
156
+ {
157
+ "frame": {"x":238,"y":68,"w":128,"h":128},
158
+ "rotated": false,
159
+ "trimmed": false,
160
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
161
+ "sourceSize": {"w":128,"h":128}
162
+ },
163
+ "grass_02.png":
164
+ {
165
+ "frame": {"x":2,"y":36,"w":128,"h":128},
166
+ "rotated": false,
167
+ "trimmed": false,
168
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
169
+ "sourceSize": {"w":128,"h":128}
170
+ },
171
+ "road_1.png":
172
+ {
173
+ "frame": {"x":234,"y":532,"w":64,"h":128},
174
+ "rotated": false,
175
+ "trimmed": false,
176
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":128},
177
+ "sourceSize": {"w":64,"h":128}
178
+ },
179
+ "road_2.png":
180
+ {
181
+ "frame": {"x":430,"y":608,"w":64,"h":128},
182
+ "rotated": false,
183
+ "trimmed": false,
184
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":128},
185
+ "sourceSize": {"w":64,"h":128}
186
+ },
187
+ "road_3.png":
188
+ {
189
+ "frame": {"x":364,"y":486,"w":64,"h":192},
190
+ "rotated": false,
191
+ "trimmed": false,
192
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":192},
193
+ "sourceSize": {"w":64,"h":192}
194
+ },
195
+ "road_4.png":
196
+ {
197
+ "frame": {"x":432,"y":414,"w":64,"h":192},
198
+ "rotated": false,
199
+ "trimmed": false,
200
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":192},
201
+ "sourceSize": {"w":64,"h":192}
202
+ },
203
+ "road_5.png":
204
+ {
205
+ "frame": {"x":260,"y":2,"w":192,"h":64},
206
+ "rotated": false,
207
+ "trimmed": false,
208
+ "spriteSourceSize": {"x":0,"y":0,"w":192,"h":64},
209
+ "sourceSize": {"w":192,"h":64}
210
+ },
211
+ "road_asphalt_clean_hor.png":
212
+ {
213
+ "frame": {"x":364,"y":312,"w":128,"h":100},
214
+ "rotated": false,
215
+ "trimmed": false,
216
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":100},
217
+ "sourceSize": {"w":128,"h":100}
218
+ },
219
+ "road_asphalt_clean_to_damaged_hor.png":
220
+ {
221
+ "frame": {"x":234,"y":300,"w":128,"h":100},
222
+ "rotated": false,
223
+ "trimmed": false,
224
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":100},
225
+ "sourceSize": {"w":128,"h":100}
226
+ },
227
+ "road_asphalt_clean_to_damaged_vert.png":
228
+ {
229
+ "frame": {"x":132,"y":426,"w":100,"h":128},
230
+ "rotated": false,
231
+ "trimmed": false,
232
+ "spriteSourceSize": {"x":0,"y":0,"w":100,"h":128},
233
+ "sourceSize": {"w":100,"h":128}
234
+ },
235
+ "road_asphalt_clean_vert.png":
236
+ {
237
+ "frame": {"x":234,"y":402,"w":100,"h":128},
238
+ "rotated": false,
239
+ "trimmed": false,
240
+ "spriteSourceSize": {"x":0,"y":0,"w":100,"h":128},
241
+ "sourceSize": {"w":100,"h":128}
242
+ },
243
+ "road_asphalt_damaged_hor.png":
244
+ {
245
+ "frame": {"x":2,"y":378,"w":128,"h":100},
246
+ "rotated": false,
247
+ "trimmed": false,
248
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":100},
249
+ "sourceSize": {"w":128,"h":100}
250
+ },
251
+ "road_asphalt_damaged_to_clean_hor.png":
252
+ {
253
+ "frame": {"x":234,"y":198,"w":128,"h":100},
254
+ "rotated": false,
255
+ "trimmed": false,
256
+ "spriteSourceSize": {"x":0,"y":0,"w":128,"h":100},
257
+ "sourceSize": {"w":128,"h":100}
258
+ },
259
+ "road_asphalt_damaged_to_clean_vert.png":
260
+ {
261
+ "frame": {"x":132,"y":296,"w":100,"h":128},
262
+ "rotated": false,
263
+ "trimmed": false,
264
+ "spriteSourceSize": {"x":0,"y":0,"w":100,"h":128},
265
+ "sourceSize": {"w":100,"h":128}
266
+ },
267
+ "road_asphalt_damaged_vert.png":
268
+ {
269
+ "frame": {"x":132,"y":166,"w":100,"h":128},
270
+ "rotated": false,
271
+ "trimmed": false,
272
+ "spriteSourceSize": {"x":0,"y":0,"w":100,"h":128},
273
+ "sourceSize": {"w":100,"h":128}
274
+ },
275
+ "road_corner_1.png":
276
+ {
277
+ "frame": {"x":199,"y":728,"w":64,"h":64},
278
+ "rotated": false,
279
+ "trimmed": false,
280
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
281
+ "sourceSize": {"w":64,"h":64}
282
+ },
283
+ "road_corner_2.png":
284
+ {
285
+ "frame": {"x":133,"y":688,"w":64,"h":64},
286
+ "rotated": false,
287
+ "trimmed": false,
288
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
289
+ "sourceSize": {"w":64,"h":64}
290
+ },
291
+ "road_corner_3.png":
292
+ {
293
+ "frame": {"x":67,"y":688,"w":64,"h":64},
294
+ "rotated": false,
295
+ "trimmed": false,
296
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
297
+ "sourceSize": {"w":64,"h":64}
298
+ },
299
+ "road_corner_4.png":
300
+ {
301
+ "frame": {"x":36,"y":760,"w":64,"h":64},
302
+ "rotated": false,
303
+ "trimmed": false,
304
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
305
+ "sourceSize": {"w":64,"h":64}
306
+ },
307
+ "rock_010.png":
308
+ {
309
+ "frame": {"x":364,"y":414,"w":66,"h":70},
310
+ "rotated": false,
311
+ "trimmed": false,
312
+ "spriteSourceSize": {"x":0,"y":0,"w":66,"h":70},
313
+ "sourceSize": {"w":66,"h":70}
314
+ },
315
+ "rock_1.png":
316
+ {
317
+ "frame": {"x":36,"y":936,"w":64,"h":64},
318
+ "rotated": false,
319
+ "trimmed": false,
320
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
321
+ "sourceSize": {"w":64,"h":64}
322
+ },
323
+ "rock_2.png":
324
+ {
325
+ "frame": {"x":36,"y":870,"w":64,"h":64},
326
+ "rotated": false,
327
+ "trimmed": false,
328
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
329
+ "sourceSize": {"w":64,"h":64}
330
+ },
331
+ "rock_3.png":
332
+ {
333
+ "frame": {"x":428,"y":804,"w":64,"h":64},
334
+ "rotated": false,
335
+ "trimmed": false,
336
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
337
+ "sourceSize": {"w":64,"h":64}
338
+ },
339
+ "rock_4.png":
340
+ {
341
+ "frame": {"x":362,"y":746,"w":64,"h":64},
342
+ "rotated": false,
343
+ "trimmed": false,
344
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
345
+ "sourceSize": {"w":64,"h":64}
346
+ },
347
+ "rock_5.png":
348
+ {
349
+ "frame": {"x":296,"y":694,"w":64,"h":64},
350
+ "rotated": false,
351
+ "trimmed": false,
352
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
353
+ "sourceSize": {"w":64,"h":64}
354
+ },
355
+ "rock_6.png":
356
+ {
357
+ "frame": {"x":230,"y":662,"w":64,"h":64},
358
+ "rotated": false,
359
+ "trimmed": false,
360
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
361
+ "sourceSize": {"w":64,"h":64}
362
+ },
363
+ "rock_7.png":
364
+ {
365
+ "frame": {"x":164,"y":622,"w":64,"h":64},
366
+ "rotated": false,
367
+ "trimmed": false,
368
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
369
+ "sourceSize": {"w":64,"h":64}
370
+ },
371
+ "rock_8.png":
372
+ {
373
+ "frame": {"x":98,"y":622,"w":64,"h":64},
374
+ "rotated": false,
375
+ "trimmed": false,
376
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
377
+ "sourceSize": {"w":64,"h":64}
378
+ },
379
+ "rock_9.png":
380
+ {
381
+ "frame": {"x":128,"y":556,"w":64,"h":64},
382
+ "rotated": false,
383
+ "trimmed": false,
384
+ "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64},
385
+ "sourceSize": {"w":64,"h":64}
386
+ },
387
+ "tank1_body_destroyed.png":
388
+ {
389
+ "frame": {"x":92,"y":480,"w":34,"h":48},
390
+ "rotated": false,
391
+ "trimmed": false,
392
+ "spriteSourceSize": {"x":0,"y":0,"w":34,"h":48},
393
+ "sourceSize": {"w":34,"h":48}
394
+ },
395
+ "tank1b_body_destroyed.png":
396
+ {
397
+ "frame": {"x":92,"y":530,"w":34,"h":48},
398
+ "rotated": false,
399
+ "trimmed": false,
400
+ "spriteSourceSize": {"x":0,"y":0,"w":34,"h":48},
401
+ "sourceSize": {"w":34,"h":48}
402
+ },
403
+ "tank2_body_destroyed.png":
404
+ {
405
+ "frame": {"x":454,"y":2,"w":42,"h":48},
406
+ "rotated": false,
407
+ "trimmed": false,
408
+ "spriteSourceSize": {"x":0,"y":0,"w":42,"h":48},
409
+ "sourceSize": {"w":42,"h":48}
410
+ },
411
+ "tank2b_body_destroyed.png":
412
+ {
413
+ "frame": {"x":454,"y":52,"w":42,"h":48},
414
+ "rotated": false,
415
+ "trimmed": false,
416
+ "spriteSourceSize": {"x":0,"y":0,"w":42,"h":48},
417
+ "sourceSize": {"w":42,"h":48}
418
+ },
419
+ "tank3_body_destroyed.png":
420
+ {
421
+ "frame": {"x":336,"y":525,"w":26,"h":39},
422
+ "rotated": false,
423
+ "trimmed": false,
424
+ "spriteSourceSize": {"x":0,"y":0,"w":26,"h":39},
425
+ "sourceSize": {"w":26,"h":39}
426
+ },
427
+ "tank3b_body_destroyed.png":
428
+ {
429
+ "frame": {"x":336,"y":484,"w":26,"h":39},
430
+ "rotated": false,
431
+ "trimmed": false,
432
+ "spriteSourceSize": {"x":0,"y":0,"w":26,"h":39},
433
+ "sourceSize": {"w":26,"h":39}
434
+ },
435
+ "tank3c_body_destroyed.png":
436
+ {
437
+ "frame": {"x":336,"y":443,"w":26,"h":39},
438
+ "rotated": false,
439
+ "trimmed": false,
440
+ "spriteSourceSize": {"x":0,"y":0,"w":26,"h":39},
441
+ "sourceSize": {"w":26,"h":39}
442
+ },
443
+ "tank3d_body_destroyed.png":
444
+ {
445
+ "frame": {"x":336,"y":402,"w":26,"h":39},
446
+ "rotated": false,
447
+ "trimmed": false,
448
+ "spriteSourceSize": {"x":0,"y":0,"w":26,"h":39},
449
+ "sourceSize": {"w":26,"h":39}
450
+ },
451
+ "truck1_destroyed.png":
452
+ {
453
+ "frame": {"x":2,"y":616,"w":30,"h":62},
454
+ "rotated": false,
455
+ "trimmed": false,
456
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":62},
457
+ "sourceSize": {"w":30,"h":62}
458
+ },
459
+ "truck1b_destroyed.png":
460
+ {
461
+ "frame": {"x":332,"y":630,"w":30,"h":62},
462
+ "rotated": false,
463
+ "trimmed": false,
464
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":62},
465
+ "sourceSize": {"w":30,"h":62}
466
+ },
467
+ "truck1c_destroyed.png":
468
+ {
469
+ "frame": {"x":300,"y":596,"w":30,"h":62},
470
+ "rotated": false,
471
+ "trimmed": false,
472
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":62},
473
+ "sourceSize": {"w":30,"h":62}
474
+ },
475
+ "truck2_destroyed.png":
476
+ {
477
+ "frame": {"x":332,"y":566,"w":30,"h":62},
478
+ "rotated": false,
479
+ "trimmed": false,
480
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":62},
481
+ "sourceSize": {"w":30,"h":62}
482
+ },
483
+ "truck2b_destroyed.png":
484
+ {
485
+ "frame": {"x":300,"y":532,"w":30,"h":62},
486
+ "rotated": false,
487
+ "trimmed": false,
488
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":62},
489
+ "sourceSize": {"w":30,"h":62}
490
+ },
491
+ "truck2c_destroyed.png":
492
+ {
493
+ "frame": {"x":66,"y":616,"w":30,"h":62},
494
+ "rotated": false,
495
+ "trimmed": false,
496
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":62},
497
+ "sourceSize": {"w":30,"h":62}
498
+ },
499
+ "truck3_destroyed.png":
500
+ {
501
+ "frame": {"x":34,"y":616,"w":30,"h":62},
502
+ "rotated": false,
503
+ "trimmed": false,
504
+ "spriteSourceSize": {"x":0,"y":0,"w":30,"h":62},
505
+ "sourceSize": {"w":30,"h":62}
506
+ }},
507
+ "meta": {
508
+ "app": "http://www.texturepacker.com",
509
+ "version": "1.0",
510
+ "image": "decor.png",
511
+ "format": "RGBA8888",
512
+ "size": {"w":512,"h":1024},
513
+ "scale": "1",
514
+ "smartupdate": "$TexturePacker:SmartUpdate:2e6b6964f24c7abfaa85a804e2dc1b05$"
515
+ }
516
+ }