OSDN Git Service

Revert "- implemented Cloneable instead of own methods - but particle value classes...
[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 update (float delta) {\r
54                 for (int i = 0, n = emitters.size; i < n; i++)\r
55                         emitters.get(i).update(delta);\r
56         }\r
57 \r
58         public void draw (SpriteBatch spriteBatch) {\r
59                 for (int i = 0, n = emitters.size; i < n; i++)\r
60                         emitters.get(i).draw(spriteBatch);\r
61         }\r
62 \r
63         public void draw (SpriteBatch spriteBatch, float delta) {\r
64                 for (int i = 0, n = emitters.size; i < n; i++)\r
65                         emitters.get(i).draw(spriteBatch, delta);\r
66         }\r
67 \r
68         public void allowCompletion () {\r
69                 for (int i = 0, n = emitters.size; i < n; i++)\r
70                         emitters.get(i).allowCompletion();\r
71         }\r
72 \r
73         public boolean isComplete () {\r
74                 for (int i = 0, n = emitters.size; i < n; i++) {\r
75                         ParticleEmitter emitter = emitters.get(i);\r
76                         if (emitter.isContinuous()) return false;\r
77                         if (!emitter.isComplete()) return false;\r
78                 }\r
79                 return true;\r
80         }\r
81 \r
82         public void setDuration (int duration) {\r
83                 for (int i = 0, n = emitters.size; i < n; i++) {\r
84                         ParticleEmitter emitter = emitters.get(i);\r
85                         emitter.setContinuous(false);\r
86                         emitter.duration = duration;\r
87                         emitter.durationTimer = 0;\r
88                 }\r
89         }\r
90 \r
91         public void setPosition (float x, float y) {\r
92                 for (int i = 0, n = emitters.size; i < n; i++)\r
93                         emitters.get(i).setPosition(x, y);\r
94         }\r
95 \r
96         public void setFlip (boolean flipX, boolean flipY) {\r
97                 for (int i = 0, n = emitters.size; i < n; i++)\r
98                         emitters.get(i).setFlip(flipX, flipY);\r
99         }\r
100 \r
101         public Array<ParticleEmitter> getEmitters () {\r
102                 return emitters;\r
103         }\r
104 \r
105         /** Returns the emitter with the specified name, or null. */\r
106         public ParticleEmitter findEmitter (String name) {\r
107                 for (int i = 0, n = emitters.size; i < n; i++) {\r
108                         ParticleEmitter emitter = emitters.get(i);\r
109                         if (emitter.getName().equals(name)) return emitter;\r
110                 }\r
111                 return null;\r
112         }\r
113 \r
114         public void save (File file) {\r
115                 Writer output = null;\r
116                 try {\r
117                         output = new FileWriter(file);\r
118                         int index = 0;\r
119                         for (int i = 0, n = emitters.size; i < n; i++) {\r
120                                 ParticleEmitter emitter = emitters.get(i);\r
121                                 if (index++ > 0) output.write("\n\n");\r
122                                 emitter.save(output);\r
123                                 output.write("- Image Path -\n");\r
124                                 output.write(emitter.getImagePath() + "\n");\r
125                         }\r
126                 } catch (IOException ex) {\r
127                         throw new GdxRuntimeException("Error saving effect: " + file, ex);\r
128                 } finally {\r
129                         try {\r
130                                 if (output != null) output.close();\r
131                         } catch (IOException ex) {\r
132                         }\r
133                 }\r
134         }\r
135 \r
136         public void load (FileHandle effectFile, FileHandle imagesDir) {\r
137                 loadEmitters(effectFile);\r
138                 loadEmitterImages(imagesDir);\r
139         }\r
140 \r
141         public void load (FileHandle effectFile, TextureAtlas atlas) {\r
142                 loadEmitters(effectFile);\r
143                 loadEmitterImages(atlas);\r
144         }\r
145 \r
146         public void loadEmitters (FileHandle effectFile) {\r
147                 InputStream input = effectFile.read();\r
148                 emitters.clear();\r
149                 BufferedReader reader = null;\r
150                 try {\r
151                         reader = new BufferedReader(new InputStreamReader(input), 512);\r
152                         while (true) {\r
153                                 ParticleEmitter emitter = new ParticleEmitter(reader);\r
154                                 reader.readLine();\r
155                                 emitter.setImagePath(reader.readLine());\r
156                                 emitters.add(emitter);\r
157                                 if (reader.readLine() == null) break;\r
158                                 if (reader.readLine() == null) break;\r
159                         }\r
160                 } catch (IOException ex) {\r
161                         throw new GdxRuntimeException("Error loading effect: " + effectFile, ex);\r
162                 } finally {\r
163                         try {\r
164                                 if (reader != null) reader.close();\r
165                         } catch (IOException ex) {\r
166                         }\r
167                 }\r
168         }\r
169 \r
170         public void loadEmitterImages (TextureAtlas atlas) {\r
171                 for (int i = 0, n = emitters.size; i < n; i++) {\r
172                         ParticleEmitter emitter = emitters.get(i);\r
173                         String imagePath = emitter.getImagePath();\r
174                         if (imagePath == null) continue;\r
175                         String imageName = new File(imagePath.replace('\\', '/')).getName();\r
176                         int lastDotIndex = imageName.lastIndexOf('.');\r
177                         if (lastDotIndex != -1) imageName = imageName.substring(0, lastDotIndex);\r
178                         Sprite sprite = atlas.createSprite(imageName);\r
179                         if (sprite == null) throw new IllegalArgumentException("SpriteSheet missing image: " + imageName);\r
180                         emitter.setSprite(sprite);\r
181                 }\r
182         }\r
183 \r
184         public void loadEmitterImages (FileHandle imagesDir) {\r
185                 for (int i = 0, n = emitters.size; i < n; i++) {\r
186                         ParticleEmitter emitter = emitters.get(i);\r
187                         String imagePath = emitter.getImagePath();\r
188                         if (imagePath == null) continue;\r
189                         String imageName = new File(imagePath.replace('\\', '/')).getName();\r
190                         emitter.setSprite(new Sprite(loadTexture(imagesDir.child(imageName))));\r
191                 }\r
192         }\r
193 \r
194         protected Texture loadTexture (FileHandle file) {\r
195                 return new Texture(file, false);\r
196         }\r
197 \r
198         /** Disposes the texture for each sprite for each ParticleEmitter. */\r
199         public void dispose () {\r
200                 for (int i = 0, n = emitters.size; i < n; i++) {\r
201                         ParticleEmitter emitter = emitters.get(i);\r
202                         emitter.getSprite().getTexture().dispose();\r
203                 }\r
204         }\r
205 }\r