From 67c2bf37f0eabfa6a79570f09e0207b174772e92 Mon Sep 17 00:00:00 2001 From: Edward Peterson Date: Sun, 6 Nov 2016 00:06:18 -0400 Subject: [PATCH] Added a bunch of stuff added bats added Pressure pads Fragment shader now gives a slight yellowish tint to simulate torchlight added flicker to light values added flicker animation to torches --- core/assets/Fragment.frag | 4 + core/assets/env.png | Bin 2646 -> 6872 bytes core/assets/testmap.tmx | 242 ++++++++++++++---- core/src/com/toasted/chuck/ChuckGame.java | 2 +- core/src/com/toasted/chuck/Graphics.java | 19 +- core/src/com/toasted/chuck/Level.java | 15 +- core/src/com/toasted/chuck/Light.java | 11 +- .../com/toasted/chuck/entities/Entity.java | 16 ++ .../com/toasted/chuck/entities/EntityBat.java | 48 ++++ .../com/toasted/chuck/entities/EntityBox.java | 15 +- .../chuck/entities/EntityPressurePad.java | 62 +++++ .../toasted/chuck/entities/EntityTorch.java | 38 ++- 12 files changed, 412 insertions(+), 60 deletions(-) create mode 100644 core/src/com/toasted/chuck/entities/EntityBat.java create mode 100644 core/src/com/toasted/chuck/entities/EntityPressurePad.java diff --git a/core/assets/Fragment.frag b/core/assets/Fragment.frag index 74b22d3..4cc1b04 100644 --- a/core/assets/Fragment.frag +++ b/core/assets/Fragment.frag @@ -40,6 +40,10 @@ void main() { brightest = brightest + dis2Light2 - brightest * dis2Light2; } texColor.rgb = texColor.rgb * (sin(pow(brightest, 10) * M_PI / 2)); + + //apply torchlight tint + texColor.b = texColor.b * 0.7; + texColor.g = texColor.g * 0.9; //final color gl_FragColor = texColor * vColor; } diff --git a/core/assets/env.png b/core/assets/env.png index 4dcaac0782ac65ba80cead96b03df32639f582d1..6edb7efb1f6df42b4108307b02d01013d0d16099 100644 GIT binary patch literal 6872 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 - + @@ -167,7 +167,6 @@ - @@ -183,6 +182,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -369,47 +410,160 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/com/toasted/chuck/ChuckGame.java b/core/src/com/toasted/chuck/ChuckGame.java index ea9a4ba..35f0d32 100644 --- a/core/src/com/toasted/chuck/ChuckGame.java +++ b/core/src/com/toasted/chuck/ChuckGame.java @@ -29,7 +29,7 @@ public class ChuckGame extends ApplicationAdapter implements InputProcessor{ Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); level.draw(graphics); -// System.out.println("FPS:" + Gdx.graphics.getFramesPerSecond()); + System.out.println("FPS:" + Gdx.graphics.getFramesPerSecond()); } diff --git a/core/src/com/toasted/chuck/Graphics.java b/core/src/com/toasted/chuck/Graphics.java index f32cd30..1182a60 100644 --- a/core/src/com/toasted/chuck/Graphics.java +++ b/core/src/com/toasted/chuck/Graphics.java @@ -5,7 +5,9 @@ import java.util.ArrayList; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; @@ -24,7 +26,7 @@ public class Graphics { final float orthoScale = orthoX / (float)getWidth(); public float lightValueMultiplier = 1f; // for testing fade out private static int MAX_LIGHTS = 50; - + private static Texture textureMap; ShaderProgram shader = new ShaderProgram(VERTEX, FRAGMENT); public Graphics(){ cam = new OrthographicCamera(); @@ -77,17 +79,26 @@ public class Graphics { if(lights.size() > MAX_LIGHTS){ // if there are too many to do } else { - shader.setUniformi("u_actualLights", lights.size()); - shader.setUniformf("u_ambientLight", Light.VAL_AMBIENT); + int loc = shader.getUniformLocation("u_lightCoord[0]"); int locIn = shader.getUniformLocation("u_lightIntensity[0]"); + int nullLights = 0; for(int i = 0;i < lights.size();i++){ - + if(lights.get(i) == null || !lights.get(i).isEmitting()){ + nullLights++; + continue; + } Vector3 v3 = cam.project(new Vector3(lights.get(i).getX(), lights.get(i).getY(), 0)); Vector2 v = new Vector2(v3.x, v3.y); shader.setUniformf(loc + i, v); shader.setUniformf(locIn + i, lights.get(i).getIntensity() * lightValueMultiplier); } + shader.setUniformi("u_actualLights", lights.size() - nullLights); + shader.setUniformf("u_ambientLight", Light.VAL_AMBIENT); } } + public static TextureRegion getSubTexture(int i){ + if(textureMap == null) textureMap = new Texture("env.png"); + return new TextureRegion(textureMap, (i % 8) * 16, (i / 8) * 16, 16, 16); + } } diff --git a/core/src/com/toasted/chuck/Level.java b/core/src/com/toasted/chuck/Level.java index f4eef1f..25b9b2c 100644 --- a/core/src/com/toasted/chuck/Level.java +++ b/core/src/com/toasted/chuck/Level.java @@ -15,8 +15,10 @@ import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.toasted.chuck.entities.Entity; +import com.toasted.chuck.entities.EntityBat; import com.toasted.chuck.entities.EntityBox; import com.toasted.chuck.entities.EntityPlayer; +import com.toasted.chuck.entities.EntityPressurePad; import com.toasted.chuck.entities.EntityTorch; public class Level { @@ -36,7 +38,7 @@ public class Level { zSorter = new Comparator(){ public int compare(Entity arg0, Entity arg1) { - return (int) Math.signum(arg1.getY() - arg0.getY()); + return (int) Math.signum(arg1.getZSortValue() - arg0.getZSortValue()); } @@ -132,12 +134,19 @@ public class Level { Vector2 t = new Vector2(); t = r.getCenter(t); Entity newEntity = null; - if(o.getProperties().get("type").equals("torch")){ + String type = (String) o.getProperties().get("type"); + if(type.equals("torch")){ newEntity = new EntityTorch(t.x - r.getWidth() / 2, t.y - r.getHeight() / 2); } - if(o.getProperties().get("type").equals("box")){ + if(type.equals("box")){ newEntity = new EntityBox(t.x - r.getWidth() / 2, t.y - r.getHeight() / 2); } + if(type.equals("pressurePad")){ + newEntity = new EntityPressurePad(t.x - r.getWidth() / 2, t.y - r.getHeight() / 2); + } + if(type.equals("bat")){ + newEntity = new EntityBat(r.x, r.y); + } if(listToAdd == null){ spawnEntity(newEntity); } else { diff --git a/core/src/com/toasted/chuck/Light.java b/core/src/com/toasted/chuck/Light.java index ce01412..9b6f17d 100644 --- a/core/src/com/toasted/chuck/Light.java +++ b/core/src/com/toasted/chuck/Light.java @@ -9,6 +9,7 @@ public class Light { private static Vector2 tmp = new Vector2(); private Vector2 position; private float intensity = 1; + private boolean isEmitting = true; public Light(float x, float y, float intensity){ position = new Vector2(x, y); this.intensity = intensity; @@ -28,5 +29,13 @@ public class Light { public float getIntensity(){ return intensity; } - + public void setIntensity(float value){ + intensity = value; + } + public boolean isEmitting(){ + return isEmitting; + } + public void setEmitting(boolean state){ + isEmitting = state; + } } diff --git a/core/src/com/toasted/chuck/entities/Entity.java b/core/src/com/toasted/chuck/entities/Entity.java index 4909135..5fb76fd 100644 --- a/core/src/com/toasted/chuck/entities/Entity.java +++ b/core/src/com/toasted/chuck/entities/Entity.java @@ -16,12 +16,22 @@ public abstract class Entity { protected float flyLength; protected boolean isChuckable = true; protected boolean shouldDrawSelf = true; + protected boolean isHostile = false; + protected float stunTimer = 0; protected float weight = 0; //used for destruction capabilities and pressure plate triggering public Entity(){ + } + public Entity(float x, float y){ + position = new Vector2(x, y); + collision = new Rectangle(x, y, 16, 16); } public abstract void update(float delta, Level lvl); protected Rectangle doCollisions(float delta, ArrayList collisions){ + if(stunTimer > 0) { + stunTimer -= delta; + return null; + } Rectangle collidedWith = null; position.x += velocity.x * delta; @@ -87,4 +97,10 @@ public abstract class Entity { public EntityController getController(){ return controller; } + public float getZSortValue(){ + return getY(); + } + public void stun(float duration){ + this.stunTimer = duration; + } } diff --git a/core/src/com/toasted/chuck/entities/EntityBat.java b/core/src/com/toasted/chuck/entities/EntityBat.java new file mode 100644 index 0000000..a9a8f5e --- /dev/null +++ b/core/src/com/toasted/chuck/entities/EntityBat.java @@ -0,0 +1,48 @@ +package com.toasted.chuck.entities; + +import java.util.Random; + +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.toasted.chuck.Graphics; +import com.toasted.chuck.Level; + +public class EntityBat extends Entity{ + private static final float MOVE_SPEED = 40f; + private TextureRegion[] animation = new TextureRegion[]{Graphics.getSubTexture(20), Graphics.getSubTexture(21)}; + private float timeToPickNextDirection = 0f; + private float animationSpeed = .05f; + private float animationTimer = animationSpeed; + + private int animationFrame = 0; + private Random rand = new Random(); + + public EntityBat(float x, float y){ + super(x, y); + isChuckable = false; + isHostile = true; + } + + public void update(float delta, Level lvl) { + Rectangle collide = doCollisions(delta, lvl.getCollisions()); + //wandering ai + timeToPickNextDirection -= delta; + if(timeToPickNextDirection <= 0 || collide != null){ + float nextDirection = rand.nextFloat(); + timeToPickNextDirection = rand.nextFloat() * 1.5f; + velocity.x = (float)Math.cos(nextDirection * Math.PI * 2f) * MOVE_SPEED; + velocity.y = (float)Math.sin(nextDirection * Math.PI * 2f) * MOVE_SPEED; + } + animationTimer -= delta; + if(animationTimer <= 0){ + animationTimer = animationSpeed; + animationFrame++; + } + + } + + public void draw(Graphics g) { + g.getBatch().draw(animation[animationFrame % 2], getX(), getY()); + } + +} diff --git a/core/src/com/toasted/chuck/entities/EntityBox.java b/core/src/com/toasted/chuck/entities/EntityBox.java index 8b0ae62..d9b9130 100644 --- a/core/src/com/toasted/chuck/entities/EntityBox.java +++ b/core/src/com/toasted/chuck/entities/EntityBox.java @@ -12,10 +12,7 @@ public class EntityBox extends Entity{ Texture shadow = new Texture("shadow.png"); public EntityBox(float x, float y){ - super(); - position.x = x; - position.y = y; - collision = new Rectangle(x, y, 16, 16); + super(x, y); weight = 1; } public void update(float delta, Level lvl) { @@ -31,6 +28,16 @@ public class EntityBox extends Entity{ lvl.revealSecretRoom(layerOpened); } } + if(flyLength > 0){ + //can hit enemies while in air + for(Entity e: lvl.getEntities()){ + if(e.isHostile && e.collision.overlaps(collision)){ + velocity.x = 0; + velocity.y = 0; + e.stun(4f); + } + } + } } public void draw(Graphics g) { diff --git a/core/src/com/toasted/chuck/entities/EntityPressurePad.java b/core/src/com/toasted/chuck/entities/EntityPressurePad.java new file mode 100644 index 0000000..ae55a12 --- /dev/null +++ b/core/src/com/toasted/chuck/entities/EntityPressurePad.java @@ -0,0 +1,62 @@ +package com.toasted.chuck.entities; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.math.Vector2; +import com.toasted.chuck.Graphics; +import com.toasted.chuck.Level; +import com.toasted.chuck.Light; +import com.toasted.chuck.LightEmitter; + +public class EntityPressurePad extends Entity implements LightEmitter{ + + private final float TRIGGER_WEIGHT = .75f; + + + private TextureRegion art = Graphics.getSubTexture(16); + private TextureRegion pressed = Graphics.getSubTexture(24); + private Light indicator; + private boolean depressed = false; + public EntityPressurePad(float x, float y){ + super(x, y); + indicator = new Light(x + collision.width / 2, y + collision.height / 2, 2f); + + indicator.setEmitting(false); + isChuckable = false; + + } + @Override + public void update(float delta, Level lvl) { + boolean foundTrigger = false; + for(Entity e: lvl.getEntities()){ + if(e.weight > TRIGGER_WEIGHT && e.flyLength <= 0){ + if(e.collision.overlaps(collision)){ + foundTrigger = true; + break; + } + } + } + if(foundTrigger) { +// indicator.setEmitting(true); + depressed = true; + } else { + depressed = false; +// indicator.setEmitting(false); + } + } + + @Override + public void draw(Graphics g) { + g.getBatch().draw(depressed ? pressed : art, position.x, position.y); + + } + public float getZSortValue(){ + return super.getZSortValue() + 1000000; + } + @Override + public Light getLight() { + return indicator; + } + +} diff --git a/core/src/com/toasted/chuck/entities/EntityTorch.java b/core/src/com/toasted/chuck/entities/EntityTorch.java index ee36d86..875fa4c 100644 --- a/core/src/com/toasted/chuck/entities/EntityTorch.java +++ b/core/src/com/toasted/chuck/entities/EntityTorch.java @@ -1,5 +1,7 @@ package com.toasted.chuck.entities; +import java.util.Random; + import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.toasted.chuck.Graphics; @@ -9,7 +11,20 @@ import com.toasted.chuck.LightEmitter; public class EntityTorch extends EntityBox implements LightEmitter{ private Light emitter; - private TextureRegion torch = new TextureRegion(new Texture("env.png"),0, 23, 16, 16); + private TextureRegion torch = new TextureRegion(new Texture("env.png"),0, 16, 16, 16); + private Random rand = new Random(); + private static TextureRegion[] torchFrames = new TextureRegion[]{ + Graphics.getSubTexture(8), + Graphics.getSubTexture(25), + Graphics.getSubTexture(26), + Graphics.getSubTexture(27), + Graphics.getSubTexture(28), + }; + private int currentFrame = 0; + private float flickerSpeed = .1f; + private float frameTimer = flickerSpeed; + private static final float FLICKER = .07f; + public EntityTorch(float x, float y) { super(x, y); emitter = new Light(x + collision.width / 2, y + collision.height / 2, .3f); @@ -24,6 +39,20 @@ public class EntityTorch extends EntityBox implements LightEmitter{ @Override public void update(float delta, Level lvl) { super.update(delta, lvl); + + //try flickering light + emitter.setIntensity((rand.nextFloat() * FLICKER + (1f-FLICKER)) * .3f); + frameTimer -= delta; + if(frameTimer <= 0){ + frameTimer = flickerSpeed; + int newFrame; + do { + newFrame = rand.nextInt(5); + } while(newFrame == currentFrame); + currentFrame = newFrame; + } + + //follow the torch emitter.getPosition().set(position).add(collision.width / 2, 3 * collision.height / 4); } @@ -34,8 +63,11 @@ public class EntityTorch extends EntityBox implements LightEmitter{ } float flyPerc = (Math.max(flyLength, 0) / .5f); if(flyPerc > 0) - g.getBatch().draw(torch, position.x +dx, position.y + (float)Math.abs(Math.cos((1 - flyPerc) * (Math.PI * 3f / 4f) - (Math.PI / 4f))) * 15 + dy); - else g.getBatch().draw(torch, position.x + dx, position.y + dy); + g.getBatch().draw(getFrame(), position.x +dx, position.y + (float)Math.abs(Math.cos((1 - flyPerc) * (Math.PI * 3f / 4f) - (Math.PI / 4f))) * 15 + dy); + else g.getBatch().draw(getFrame(), position.x + dx, position.y + dy); + } + private TextureRegion getFrame(){ + return torchFrames[currentFrame]; } }