OSDN Git Service

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