OSDN Git Service

Merge pull request #112 from ttencate/master
[mikumikustudio/libgdx-mikumikustudio.git] / gdx / src / com / badlogic / gdx / graphics / g2d / ParticleEffect.java
1 /*******************************************************************************\r
2  * Copyright 2011 See AUTHORS file.\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  * \r
8  *   http://www.apache.org/licenses/LICENSE-2.0\r
9  * \r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  ******************************************************************************/\r
16 \r
17 package com.badlogic.gdx.graphics.g2d;\r
18 \r
19 import java.io.BufferedReader;\r
20 import java.io.File;\r
21 import java.io.FileWriter;\r
22 import java.io.IOException;\r
23 import java.io.InputStream;\r
24 import java.io.InputStreamReader;\r
25 import java.io.Writer;\r
26 \r
27 import com.badlogic.gdx.files.FileHandle;\r
28 import com.badlogic.gdx.graphics.Texture;\r
29 import com.badlogic.gdx.utils.Array;\r
30 import com.badlogic.gdx.utils.Disposable;\r
31 import com.badlogic.gdx.utils.GdxRuntimeException;\r
32 \r
33 /** See <a href="http://www.badlogicgames.com/wordpress/?p=1255">http://www.badlogicgames.com/wordpress/?p=1255</a>\r
34  * @author mzechner */\r
35 public class ParticleEffect implements Disposable {\r
36         private final Array<ParticleEmitter> emitters;\r
37 \r
38         public ParticleEffect () {\r
39                 emitters = new Array(8);\r
40         }\r
41 \r
42         public ParticleEffect (ParticleEffect effect) {\r
43                 emitters = new Array(true, effect.emitters.size);\r
44                 for (int i = 0, n = effect.emitters.size; i < n; i++)\r
45                         emitters.add(new ParticleEmitter(effect.emitters.get(i)));\r
46         }\r
47 \r
48         public void start () {\r
49                 for (int i = 0, n = emitters.size; i < n; i++)\r
50                         emitters.get(i).start();\r
51         }\r
52 \r
53         public void reset () {\r
54                 for (int i = 0, n = emitters.size; i < n; i++)\r
55                         emitters.get(i).reset();\r
56         }\r
57 \r
58         public void update (float delta) {\r
59                 for (int i = 0, n = emitters.size; i < n; i++)\r
60                         emitters.get(i).update(delta);\r
61         }\r
62 \r
63         public void draw (SpriteBatch spriteBatch) {\r
64                 for (int i = 0, n = emitters.size; i < n; i++)\r
65                         emitters.get(i).draw(spriteBatch);\r
66         }\r
67 \r
68         public void draw (SpriteBatch spriteBatch, float delta) {\r
69                 for (int i = 0, n = emitters.size; i < n; i++)\r
70                         emitters.get(i).draw(spriteBatch, delta);\r
71         }\r
72 \r
73         public void allowCompletion () {\r
74                 for (int i = 0, n = emitters.size; i < n; i++)\r
75                         emitters.get(i).allowCompletion();\r
76         }\r
77 \r
78         public boolean isComplete () {\r
79                 for (int i = 0, n = emitters.size; i < n; i++) {\r
80                         ParticleEmitter emitter = emitters.get(i);\r
81                         if (emitter.isContinuous()) return false;\r
82                         if (!emitter.isComplete()) return false;\r
83                 }\r
84                 return true;\r
85         }\r
86 \r
87         public void setDuration (int duration) {\r
88                 for (int i = 0, n = emitters.size; i < n; i++) {\r
89                         ParticleEmitter emitter = emitters.get(i);\r
90                         emitter.setContinuous(false);\r
91                         emitter.duration = duration;\r
92                         emitter.durationTimer = 0;\r
93                 }\r
94         }\r
95 \r
96         public void setPosition (float x, float y) {\r
97                 for (int i = 0, n = emitters.size; i < n; i++)\r
98                         emitters.get(i).setPosition(x, y);\r
99         }\r
100 \r
101         public void setFlip (boolean flipX, boolean flipY) {\r
102                 for (int i = 0, n = emitters.size; i < n; i++)\r
103                         emitters.get(i).setFlip(flipX, flipY);\r
104         }\r
105 \r
106         public void flipY () {\r
107                 for (int i = 0, n = emitters.size; i < n; i++)\r
108                         emitters.get(i).flipY();\r
109         }\r
110 \r
111         public Array<ParticleEmitter> getEmitters () {\r
112                 return emitters;\r
113         }\r
114 \r
115         /** Returns the emitter with the specified name, or null. */\r
116         public ParticleEmitter findEmitter (String name) {\r
117                 for (int i = 0, n = emitters.size; i < n; i++) {\r
118                         ParticleEmitter emitter = emitters.get(i);\r
119                         if (emitter.getName().equals(name)) return emitter;\r
120                 }\r
121                 return null;\r
122         }\r
123 \r
124         public void save (File file) {\r
125                 Writer output = null;\r
126                 try {\r
127                         output = new FileWriter(file);\r
128                         int index = 0;\r
129                         for (int i = 0, n = emitters.size; i < n; i++) {\r
130                                 ParticleEmitter emitter = emitters.get(i);\r
131                                 if (index++ > 0) output.write("\n\n");\r
132                                 emitter.save(output);\r
133                                 output.write("- Image Path -\n");\r
134                                 output.write(emitter.getImagePath() + "\n");\r
135                         }\r
136                 } catch (IOException ex) {\r
137                         throw new GdxRuntimeException("Error saving effect: " + file, ex);\r
138                 } finally {\r
139                         try {\r
140                                 if (output != null) output.close();\r
141                         } catch (IOException ex) {\r
142                         }\r
143                 }\r
144         }\r
145 \r
146         public void load (FileHandle effectFile, FileHandle imagesDir) {\r
147                 loadEmitters(effectFile);\r
148                 loadEmitterImages(imagesDir);\r
149         }\r
150 \r
151         public void load (FileHandle effectFile, TextureAtlas atlas) {\r
152                 loadEmitters(effectFile);\r
153                 loadEmitterImages(atlas);\r
154         }\r
155 \r
156         public void loadEmitters (FileHandle effectFile) {\r
157                 InputStream input = effectFile.read();\r
158                 emitters.clear();\r
159                 BufferedReader reader = null;\r
160                 try {\r
161                         reader = new BufferedReader(new InputStreamReader(input), 512);\r
162                         while (true) {\r
163                                 ParticleEmitter emitter = new ParticleEmitter(reader);\r
164                                 reader.readLine();\r
165                                 emitter.setImagePath(reader.readLine());\r
166                                 emitters.add(emitter);\r
167                                 if (reader.readLine() == null) break;\r
168                                 if (reader.readLine() == null) break;\r
169                         }\r
170                 } catch (IOException ex) {\r
171                         throw new GdxRuntimeException("Error loading effect: " + effectFile, ex);\r
172                 } finally {\r
173                         try {\r
174                                 if (reader != null) reader.close();\r
175                         } catch (IOException ex) {\r
176                         }\r
177                 }\r
178         }\r
179 \r
180         public void loadEmitterImages (TextureAtlas atlas) {\r
181                 for (int i = 0, n = emitters.size; i < n; i++) {\r
182                         ParticleEmitter emitter = emitters.get(i);\r
183                         String imagePath = emitter.getImagePath();\r
184                         if (imagePath == null) continue;\r
185                         String imageName = new File(imagePath.replace('\\', '/')).getName();\r
186                         int lastDotIndex = imageName.lastIndexOf('.');\r
187                         if (lastDotIndex != -1) imageName = imageName.substring(0, lastDotIndex);\r
188                         Sprite sprite = atlas.createSprite(imageName);\r
189                         if (sprite == null) throw new IllegalArgumentException("SpriteSheet missing image: " + imageName);\r
190                         emitter.setSprite(sprite);\r
191                 }\r
192         }\r
193 \r
194         public void loadEmitterImages (FileHandle imagesDir) {\r
195                 for (int i = 0, n = emitters.size; i < n; i++) {\r
196                         ParticleEmitter emitter = emitters.get(i);\r
197                         String imagePath = emitter.getImagePath();\r
198                         if (imagePath == null) continue;\r
199                         String imageName = new File(imagePath.replace('\\', '/')).getName();\r
200                         emitter.setSprite(new Sprite(loadTexture(imagesDir.child(imageName))));\r
201                 }\r
202         }\r
203 \r
204         protected Texture loadTexture (FileHandle file) {\r
205                 return new Texture(file, false);\r
206         }\r
207 \r
208         /** Disposes the texture for each sprite for each ParticleEmitter. */\r
209         public void dispose () {\r
210                 for (int i = 0, n = emitters.size; i < n; i++) {\r
211                         ParticleEmitter emitter = emitters.get(i);\r
212                         emitter.getSprite().getTexture().dispose();\r
213                 }\r
214         }\r
215 }\r