package loon.action.sprite.effect; import loon.LSystem; import loon.LTexture; import loon.action.sprite.Entity; import loon.action.sprite.SpriteBatch; import loon.canvas.LColor; import loon.geom.Vector2f; import loon.opengl.BlendState; import loon.opengl.GLEx; import loon.opengl.LTexturePack; import loon.utils.TArray; public class LightningEffect extends Entity { private LTexture lightningSegment, halfCircle, pixel; private LTexturePack pack; private static LightningEffect instance; final static LightningEffect make() { return new LightningEffect(); } final static LightningEffect get() { if (instance != null) { return instance; } synchronized (LightningEffect.class) { if (instance == null) { instance = make(); } return instance; } } private SpriteBatch _batch; private TArray<ILightning> lists = new TArray<ILightning>(10); LightningEffect() { } public static LightningEffect addBolt(Vector2f s, Vector2f e, LColor c) { return addBolt(new Vector2f[] { s }, new Vector2f[] { e }, c); } // screen.add(LightningEffect.addBolt(Vector2f.at(33, 33), // Vector2f.at(300, 300),LColor.red)); public static LightningEffect addBolt(Vector2f[] s, Vector2f[] e, LColor c) { TArray<ILightning> lights = new TArray<ILightning>(); for (int i = 0; i < e.length; i++) { LightningBolt branch = new LightningBolt(s[i], e[i], c); lights.add(branch); } return new LightningEffect(lights); } public static LightningEffect addBranch(Vector2f s, Vector2f e, LColor c) { return addBranch(new Vector2f[] { s }, new Vector2f[] { e }, c); } // screen.add(LightningEffect.addBranch(Vector2f.at(33, 33), // Vector2f.at(300, 300),LColor.red)); public static LightningEffect addBranch(Vector2f[] s, Vector2f[] e, LColor c) { TArray<ILightning> lights = new TArray<ILightning>(); for (int i = 0; i < e.length; i++) { LightningBranch branch = new LightningBranch(s[i], e[i], c); lights.add(branch); } return new LightningEffect(lights); } public static LightningEffect addRandom(int count, Vector2f s, Vector2f e, LColor c) { return addRandom(count, new Vector2f[] { s }, new Vector2f[] { e }, c); } // screen.add(LightningEffect.addRandom(30,Vector2f.at(33, 33), // Vector2f.at(300, 300),LColor.red)); public static LightningEffect addRandom(int count, Vector2f[] s, Vector2f[] e, LColor c) { TArray<ILightning> lights = new TArray<ILightning>(); for (int i = 0; i < e.length; i++) { LightningRandom branch = new LightningRandom(count, s[i], e[i], c); lights.add(branch); } return new LightningEffect(lights); } public LightningEffect(TArray<ILightning> lights) { this.setLocation(0, 0); this.setRepaint(true); this.lists.addAll(lights); } @Override public void onUpdate(long elapsedTime) { for (ILightning bolt : lists) { bolt.update(elapsedTime); } } @Override public void repaint(GLEx g, float offsetX, float offsetY) { if (isDisposed()) { return; } if (_batch == null) { _batch = new SpriteBatch(1000); } _batch.begin(); _batch.setBlendState(BlendState.Additive); for (ILightning bolt : lists) { bolt.draw(_batch, drawX(offsetX), drawY(offsetY)); } _batch.end(); } public LTexture getLightningSegment() { if (lightningSegment == null || lightningSegment.isClose()) { loadLightning(); } return lightningSegment; } public LTexture getHalfCircle() { if (halfCircle == null || halfCircle.isClose()) { loadLightning(); } return halfCircle; } public LTexture getPixel() { if (pixel == null || pixel.isClose()) { loadLightning(); } return pixel; } public void loadLightning() { loadLightning(new LTexturePack(LSystem.FRAMEWORK_IMG_NAME + "natural.txt")); } public void loadLightning(LTexturePack p) { this.pack = p; this.lightningSegment = pack.getTexture("loon_lightning"); this.halfCircle = pack.getTexture("loon_halfcircle"); this.pixel = pack.getTexture("loon_pixel"); } @Override public void close() { super.close(); if (lists != null) { for (ILightning light : lists) { if (light != null) { light.close(); } } lists.clear(); } if (_batch != null) { _batch.close(); _batch = null; } if (this.lightningSegment != null) { this.lightningSegment.close(); this.lightningSegment = null; } if (this.halfCircle != null) { this.halfCircle.close(); this.halfCircle = null; } if (this.pixel != null) { this.pixel.close(); this.pixel = null; } } }