package net.fourbytes.shadow.blocks; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.ui.Image; import net.fourbytes.shadow.Entity; import net.fourbytes.shadow.Images; import net.fourbytes.shadow.Particle; import net.fourbytes.shadow.Shadow; import net.fourbytes.shadow.entities.Player; import net.fourbytes.shadow.map.IsSaveable; import net.fourbytes.shadow.systems.IParticleManager; import net.fourbytes.shadow.utils.Garbage; @IsSaveable(false) public class BlockGrassTop extends BlockType { public int[] order = {0, -2, -2}; public float[] offsets = {0, 0, 0, 0, 0, 0}; public float[] factors = {0, 0, 0, 0, 0, 0}; public float[] speed1 = {0, 0, 0, 0, 0, 0}; public float[] speed2 = {0, 0, 0, 0, 0, 0}; public float[] height = {0, 0, 0, 0, 0, 0}; public Sprite[] spritecache; public float frame = 0; public float depth = 0; public float collision = 0f; public BlockGrassTop() { frame = Shadow.rand.nextInt(1000); for (int i = 0; i < offsets.length; i++) { offsets[i] = MathUtils.random(6f); factors[i] = 1f - ((float)Shadow.rand.nextInt(100))/300f; speed1[i] = 10f+Shadow.rand.nextInt(10); speed2[i] = 20f+Shadow.rand.nextInt(20); height[i] = 1f + ((float)Shadow.rand.nextInt(100))/450f; if (i < order.length && i > 0) { int orderi = -1; while (orderi == -1) { orderi = Shadow.rand.nextInt(offsets.length); for (int x : order) { if (orderi == x) { orderi = -1; break; } } } order[i] = orderi; } } depth = 0.075f + ((float)Shadow.rand.nextInt(100))/3000f; } @Override public TextureRegion getTexture(int id) { TextureRegion[][] regs = Images.split("block_grasstop", 16, 16); if (images == null || images.length != regs[0].length || spritecache == null) { images = new Image[regs[0].length]; spritecache = new Sprite[regs[0].length]; } return regs[0][id]; } @Override public Image getImage(int id) { if (images == null || images[id] == null) { Image img = new Image(getTexture(id)); images[id] = img; } return images[id]; } public Sprite getSprite(int i) { if (spritecache == null || spritecache[i] == null) { Sprite sprite = new Sprite(getTexture(i)); spritecache[i] = sprite; } return spritecache[i]; } @Override public void init() { tickInView = true; solid = false; rendertop = 0x02; imgIDs = order; } @Override public void tick(float delta) { //frame++; super.tick(delta); } @Override public void collide(Entity e) { if (e instanceof Player) { if (collision <= 0f) { Vector2 pos = Garbage.vec2s.getNext(); for (int i = 0; i < 3 + Shadow.rand.nextInt(3); i++) { pos.set(this.pos); pos.x += rec.width/2f; pos.y += rec.height/2f; pos.x -= MathUtils.random(-0.5f, 0.5f); pos.y -= MathUtils.random(-0.25f, 0.25f); Particle go = layer.level.systems.get(IParticleManager.class).create("GrassParticle", pos, layer, null, 0, 0); layer.add(go); } } collision = 0.25f; } } @Override public void frame(float delta) { frame += delta; collision -= delta; } @Override public void preRender() { if (spritecache == null) { getTexture(0); } for (int i = 0; i < spritecache.length; i++) { Image img = getImage(i); img.setPosition(pos.x + renderoffs.x, pos.y + rec.height + renderoffs.y + depth); img.setSize(rec.width + renderoffs.width, (rec.height + renderoffs.height) * height[i]); img.setScaleY(-1f); Sprite sprite = getSprite(i); sprite.setColor(img.getColor()); sprite.setPosition(pos.x + renderoffs.x, pos.y + rec.height + renderoffs.y + depth); sprite.setSize(rec.width + renderoffs.width, -(rec.height + renderoffs.height) * height[i]); float offsetframe = (frame + offsets[i])*60f; float offs = MathUtils.sin(offsetframe / (1.3f * speed1[i]))/8f + (MathUtils.cos(offsetframe/(1.2f*speed2[i]))/8f); offs *= 1.15f; offs *= factors[i]; float[] verts = sprite.getVertices(); float x2 = sprite.getX(); float x3 = x2 + sprite.getWidth(); x2 += offs; x3 += offs; verts[SpriteBatch.X2] = x2; verts[SpriteBatch.X3] = x3; } imgupdate = false; texupdate = false; } @Override public void render() { for (int i = 0; i < order.length-2; i++) { Sprite sprite = spritecache[order[i]]; sprite.setColor(images[order[i]].getColor()); sprite.draw(Shadow.spriteBatch); } } @Override public void renderTop() { for (int i = order.length-2; i < order.length; i++) { Sprite sprite = spritecache[order[i]]; sprite.setColor(images[order[i]].getColor()); sprite.draw(Shadow.spriteBatch); } } }