From 24e619452d428b12729e9162afbd93fb1084a2b1 Mon Sep 17 00:00:00 2001 From: Edward Peterson Date: Fri, 4 Nov 2016 22:49:46 -0400 Subject: [PATCH] Throwable torches --- core/assets/Fragment.frag | 3 +- core/assets/env.png | Bin 2223 -> 2646 bytes core/assets/testmap.tmx | 184 +++++++++++++++++-- core/src/com/toasted/chuck/ChuckGame.java | 46 ++++- core/src/com/toasted/chuck/EntityPlayer.java | 13 +- core/src/com/toasted/chuck/EntityTorch.java | 39 ++++ core/src/com/toasted/chuck/Graphics.java | 5 +- core/src/com/toasted/chuck/Light.java | 2 + core/src/com/toasted/chuck/LightEmitter.java | 5 + 9 files changed, 268 insertions(+), 29 deletions(-) create mode 100644 core/src/com/toasted/chuck/EntityTorch.java create mode 100644 core/src/com/toasted/chuck/LightEmitter.java diff --git a/core/assets/Fragment.frag b/core/assets/Fragment.frag index 6158404..8aaf627 100644 --- a/core/assets/Fragment.frag +++ b/core/assets/Fragment.frag @@ -5,6 +5,7 @@ uniform vec2 u_screenResolution; uniform vec2 u_lightCoord[50]; uniform float u_lightIntensity[50]; uniform int u_actualLights; +uniform float u_ambientLight; //"in" varyings from our vertex shader varying vec4 vColor; @@ -31,7 +32,7 @@ void main() { //Distance is measured in pixels - float brightest = 0; + float brightest = u_ambientLight; for(int i = 0;i < u_actualLights;i++){ float dis2Light = getDistance(gl_FragCoord.x, gl_FragCoord.y, u_lightCoord[i].x, u_lightCoord[i].y); float dis2Light2 = (1-(min(dis2Light/(disFull * u_lightIntensity[i]), 1))); diff --git a/core/assets/env.png b/core/assets/env.png index f606856d4a266972b4ffe6ee84cebad208b929bb..4dcaac0782ac65ba80cead96b03df32639f582d1 100644 GIT binary patch literal 2646 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 H?n(az0w@E8 diff --git a/core/assets/testmap.tmx b/core/assets/testmap.tmx index 2568d93..cb92c05 100644 --- a/core/assets/testmap.tmx +++ b/core/assets/testmap.tmx @@ -1,5 +1,5 @@ - + @@ -31,7 +31,7 @@ 0,20,20,20,20,20,20,20,1,1,20,20,20,20,20,20,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,20,20,20,20,20,1,1,20,20,20,20,20,20,20,20,10,11,20,20, 0,4,4,4,4,16,4,5,1,1,3,4,16,4,4,4,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,4,4,16,4,5,1,1,3,4,16,4,4,4,4,4,18,19,4,4, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,20,20,20,20,1,1,20,20,20,20,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,20,20,4,5,1,1,3,4,20,20,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,4,4,4,5,1,1,3,4,4,4,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -112,18 +112,172 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/com/toasted/chuck/ChuckGame.java b/core/src/com/toasted/chuck/ChuckGame.java index 60324e0..c92483f 100644 --- a/core/src/com/toasted/chuck/ChuckGame.java +++ b/core/src/com/toasted/chuck/ChuckGame.java @@ -7,6 +7,7 @@ import java.util.Comparator; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputProcessor; +import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.maps.MapLayer; import com.badlogic.gdx.maps.MapObject; @@ -26,7 +27,9 @@ public class ChuckGame extends ApplicationAdapter implements InputProcessor{ OrthogonalTiledMapRenderer tmRenderer; ArrayList collisions = new ArrayList(); ArrayList lights = new ArrayList(); - Light playerLight; + + boolean testLightFade = false; + @Override public void create () { Gdx.input.setInputProcessor(this); @@ -45,9 +48,7 @@ public class ChuckGame extends ApplicationAdapter implements InputProcessor{ }; tiledMap = new TmxMapLoader().load("testmap.tmx"); tmRenderer = new OrthogonalTiledMapRenderer(tiledMap, graphics.getBatch()); - playerLight = new Light(8, 8, 1); - lights.add(playerLight); - lights.add(new Light( 100, 100, .3f)); + lights.add(player.getLight()); MapLayer ml = tiledMap.getLayers().get("collisions"); for(MapObject o: ml.getObjects()){ @@ -56,15 +57,26 @@ public class ChuckGame extends ApplicationAdapter implements InputProcessor{ collisions.add(r); } - MapLayer lightLayer = tiledMap.getLayers().get("lights"); + MapLayer lightLayer = tiledMap.getLayers().get("staticLights"); Vector2 t = new Vector2(); for(MapObject o: lightLayer.getObjects()){ RectangleMapObject rmo = (RectangleMapObject) o; t = new Rectangle(rmo.getRectangle()).getCenter(t); - lights.add(new Light(t.x, t.y, .3f)); + lights.add(new Light(t.x, t.y, Light.VAL_TORCH)); } - + MapLayer objectLayer = tiledMap.getLayers().get("objectSpawn"); + for(MapObject o: objectLayer.getObjects()){ + RectangleMapObject rmo = (RectangleMapObject) o; + Rectangle r = new Rectangle(rmo.getRectangle()); + t = r.getCenter(t); + +// System.out.println(o.getProperties().get("type")); + if(o.getProperties().get("type").equals("torch")){ + EntityTorch torch = new EntityTorch(t.x - r.getWidth() / 2, t.y - r.getHeight() / 2); + spawnEntity(torch); + } + } } @@ -75,14 +87,17 @@ public class ChuckGame extends ApplicationAdapter implements InputProcessor{ e.update(Gdx.graphics.getDeltaTime(), entities, collisions); } Collections.sort(entities, zSorter); - playerLight.position.x = player.position.x + 8; - playerLight.position.y = player.position.y + 8; graphics.cam.position.x = player.position.x + 8; graphics.cam.position.y = player.position.y + 8; graphics.cam.update(); + + if(testLightFade){ + graphics.lightValueMultiplier -= Gdx.graphics.getDeltaTime(); + graphics.lightValueMultiplier = Math.max(0, graphics.lightValueMultiplier); + } graphics.prepare(); graphics.passLightsToShader(lights); @@ -98,7 +113,13 @@ public class ChuckGame extends ApplicationAdapter implements InputProcessor{ e.draw(graphics); } graphics.endSprite(); - System.out.println("FPS:" + Gdx.graphics.getFramesPerSecond()); +// System.out.println("FPS:" + Gdx.graphics.getFramesPerSecond()); + } + public void spawnEntity(Entity e){ + if(e instanceof LightEmitter){ + lights.add(((LightEmitter) e).getLight()); + } + entities.add(e); } @Override @@ -114,6 +135,11 @@ public class ChuckGame extends ApplicationAdapter implements InputProcessor{ @Override public boolean keyUp(int keycode) { player.controller.acceptEvent(keycode, false, player, entities, collisions); + switch(keycode){ + case Keys.F: + testLightFade = true; + break; + } return false; } diff --git a/core/src/com/toasted/chuck/EntityPlayer.java b/core/src/com/toasted/chuck/EntityPlayer.java index fa1b950..475bd95 100644 --- a/core/src/com/toasted/chuck/EntityPlayer.java +++ b/core/src/com/toasted/chuck/EntityPlayer.java @@ -9,7 +9,8 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; -public class EntityPlayer extends Entity{ +public class EntityPlayer extends Entity implements LightEmitter{ + Light illuminator; Texture playerArt = new Texture("player.png"); TextureRegion[] sprites = new TextureRegion[8]; float moveSpeed = 100; @@ -21,6 +22,7 @@ public class EntityPlayer extends Entity{ private ArrayList directionals = new ArrayList();//Don't think I'll use this private boolean[] arrowKeys = new boolean[4]; //UDLR public EntityPlayer(){ + isChuckable = false; for(int i = 0;i < 4;i++){ sprites[i] = new TextureRegion(playerArt, i * 16, 0, 16, 16); @@ -28,6 +30,7 @@ public class EntityPlayer extends Entity{ } lastVelocity = new Vector2(); collision = new Rectangle(0, 0, 16, 16); + illuminator = new Light(position.x + collision.width / 2, position.y + collision.height / 2, Light.VAL_PLAYER); controller = new EntityController(){ public void acceptEvent(int keycode, boolean newState, Entity owner, ArrayList entities, ArrayList collisions) { @@ -171,6 +174,11 @@ public class EntityPlayer extends Entity{ holding.position.x = position.x; holding.position.y = position.y; } + + illuminator.position.x = position.x + collision.width / 2; + illuminator.position.y = position.y + collision.height / 2; + + } @Override @@ -207,4 +215,7 @@ public class EntityPlayer extends Entity{ } return new Vector2(0, -1); } + public Light getLight() { + return illuminator; + } } diff --git a/core/src/com/toasted/chuck/EntityTorch.java b/core/src/com/toasted/chuck/EntityTorch.java new file mode 100644 index 0000000..b67d9bb --- /dev/null +++ b/core/src/com/toasted/chuck/EntityTorch.java @@ -0,0 +1,39 @@ +package com.toasted.chuck; + +import java.util.ArrayList; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; + +public class EntityTorch extends EntityBox implements LightEmitter{ + private Light emitter; + private TextureRegion torch = new TextureRegion(new Texture("env.png"),0, 23, 16, 16); + public EntityTorch(float x, float y) { + super(x, y); + emitter = new Light(x + collision.width / 2, y + collision.height / 2, .3f); + } + + @Override + public Light getLight() { + return emitter; + } + + @Override + public void update(float delta, ArrayList entities, ArrayList collisions) { + super.update(delta, entities, collisions); + emitter.position.set(position).add(collision.width / 2, 3 * collision.height / 4); + } + + + public void draw(Graphics g, float dx, float dy){ + if(flyLength >= 0){ + g.getBatch().draw(shadow, position.x, position.y-1); + } + 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); + } + +} diff --git a/core/src/com/toasted/chuck/Graphics.java b/core/src/com/toasted/chuck/Graphics.java index 855d7a8..de20803 100644 --- a/core/src/com/toasted/chuck/Graphics.java +++ b/core/src/com/toasted/chuck/Graphics.java @@ -22,7 +22,7 @@ public class Graphics { final int orthoX = 16 * 28; final int orthoY = 9 * 28; final float orthoScale = orthoX / (float)getWidth(); - + public float lightValueMultiplier = 1f; // for testing fade out ShaderProgram shader = new ShaderProgram(VERTEX, FRAGMENT); public Graphics(){ @@ -77,6 +77,7 @@ public class Graphics { } else { shader.setUniformi("u_actualLights", lights.size()); + shader.setUniformf("u_ambientLight", 0f); int loc = shader.getUniformLocation("u_lightCoord[" + 0 + "]"); int locIn = shader.getUniformLocation("u_lightIntensity[0]"); for(int i = 0;i < lights.size();i++){ @@ -84,7 +85,7 @@ public class Graphics { Vector3 v3 = cam.project(new Vector3(lights.get(i).position.x, lights.get(i).position.y, 0)); Vector2 v = new Vector2(v3.x, v3.y); shader.setUniformf(loc + i, v); - shader.setUniformf(locIn + i, lights.get(i).intensity); + shader.setUniformf(locIn + i, lights.get(i).intensity * lightValueMultiplier); } } } diff --git a/core/src/com/toasted/chuck/Light.java b/core/src/com/toasted/chuck/Light.java index 492d101..7d86609 100644 --- a/core/src/com/toasted/chuck/Light.java +++ b/core/src/com/toasted/chuck/Light.java @@ -3,6 +3,8 @@ package com.toasted.chuck; import com.badlogic.gdx.math.Vector2; public class Light { + public final static float VAL_TORCH = .4f; + public final static float VAL_PLAYER = .9f; private static Vector2 tmp = new Vector2(); Vector2 position; float intensity = 1; diff --git a/core/src/com/toasted/chuck/LightEmitter.java b/core/src/com/toasted/chuck/LightEmitter.java new file mode 100644 index 0000000..2846e37 --- /dev/null +++ b/core/src/com/toasted/chuck/LightEmitter.java @@ -0,0 +1,5 @@ +package com.toasted.chuck; + +public interface LightEmitter { + public Light getLight(); +}