Implemented block build animation and shaders
This commit is contained in:
@@ -23,6 +23,18 @@ public class Blocks {
|
||||
|
||||
blockpart = new BlockPart(),
|
||||
|
||||
build1 = new BuildBlock("build1"),
|
||||
|
||||
build2 = new BuildBlock("build2"),
|
||||
|
||||
build3 = new BuildBlock("build3"),
|
||||
|
||||
build4 = new BuildBlock("build4"),
|
||||
|
||||
build5 = new BuildBlock("build5"),
|
||||
|
||||
build6 = new BuildBlock("build6"),
|
||||
|
||||
defaultFloor = new Floor("defaultfloor") {{
|
||||
}},
|
||||
|
||||
|
||||
@@ -2,17 +2,14 @@ package io.anuke.mindustry.core;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.Colors;
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
import com.badlogic.gdx.graphics.Texture.TextureWrap;
|
||||
import com.badlogic.gdx.graphics.g2d.GlyphLayout;
|
||||
import com.badlogic.gdx.math.MathUtils;
|
||||
import com.badlogic.gdx.math.Rectangle;
|
||||
import com.badlogic.gdx.math.Vector2;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import com.badlogic.gdx.utils.FloatArray;
|
||||
import com.badlogic.gdx.utils.Pools;
|
||||
import io.anuke.mindustry.content.blocks.Blocks;
|
||||
import io.anuke.mindustry.content.fx.Fx;
|
||||
import io.anuke.mindustry.core.GameState.State;
|
||||
import io.anuke.mindustry.entities.Player;
|
||||
@@ -22,21 +19,18 @@ import io.anuke.mindustry.entities.effect.GroundEffectEntity;
|
||||
import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
|
||||
import io.anuke.mindustry.entities.units.BaseUnit;
|
||||
import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.game.TeamInfo.TeamData;
|
||||
import io.anuke.mindustry.graphics.*;
|
||||
import io.anuke.mindustry.input.InputHandler;
|
||||
import io.anuke.mindustry.input.PlaceMode;
|
||||
import io.anuke.mindustry.ui.fragments.ToolFragment;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.BlockBar;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.core.*;
|
||||
import io.anuke.ucore.entities.EffectEntity;
|
||||
import io.anuke.ucore.entities.Entities;
|
||||
import io.anuke.ucore.entities.Entity;
|
||||
import io.anuke.ucore.entities.EntityGroup;
|
||||
import io.anuke.ucore.function.Callable;
|
||||
import io.anuke.ucore.graphics.*;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.graphics.Hue;
|
||||
import io.anuke.ucore.graphics.Lines;
|
||||
import io.anuke.ucore.graphics.Surface;
|
||||
import io.anuke.ucore.modules.RendererModule;
|
||||
import io.anuke.ucore.scene.utils.Cursors;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
@@ -49,7 +43,7 @@ import static io.anuke.ucore.core.Core.camera;
|
||||
public class Renderer extends RendererModule{
|
||||
private final static float shieldHitDuration = 18f;
|
||||
|
||||
public Surface shadowSurface, shieldSurface, waterSurface;
|
||||
public Surface effectSurface;
|
||||
|
||||
private int targetscale = baseCameraScale;
|
||||
private Texture background = new Texture("sprites/background.png");
|
||||
@@ -117,11 +111,9 @@ public class Renderer extends RendererModule{
|
||||
public void init(){
|
||||
pixelate = Settings.getBool("pixelate");
|
||||
int scale = Settings.getBool("pixelate") ? Core.cameraScale : 1;
|
||||
|
||||
shadowSurface = Graphics.createSurface(scale);
|
||||
shieldSurface = Graphics.createSurface(scale);
|
||||
|
||||
effectSurface = Graphics.createSurface(scale);
|
||||
pixelSurface = Graphics.createSurface(scale);
|
||||
waterSurface = Graphics.createSurface(scale);
|
||||
}
|
||||
|
||||
public void setPixelate(boolean pixelate){
|
||||
@@ -165,7 +157,6 @@ public class Renderer extends RendererModule{
|
||||
|
||||
float prex = camera.position.x, prey = camera.position.y;
|
||||
updateShake(0.75f);
|
||||
float prevx = camera.position.x, prevy = camera.position.y;
|
||||
clampCamera(-tilesize / 2f, -tilesize / 2f + 1, world.width() * tilesize - tilesize / 2f, world.height() * tilesize - tilesize / 2f);
|
||||
|
||||
float deltax = camera.position.x - prex, deltay = camera.position.y - prey;
|
||||
@@ -212,9 +203,17 @@ public class Renderer extends RendererModule{
|
||||
Entities.draw(groundEffectGroup, e -> !(e instanceof BelowLiquidEffect));
|
||||
|
||||
blocks.processBlocks();
|
||||
blocks.drawBlocks(Layer.overlay);
|
||||
blocks.drawBlocks(Layer.block);
|
||||
|
||||
drawAllTeams(false);
|
||||
Graphics.surface(effectSurface, true);
|
||||
Graphics.shader(Shaders.inline, false);
|
||||
blocks.drawBlocks(Layer.placement);
|
||||
Graphics.shader();
|
||||
Graphics.flushSurface();
|
||||
|
||||
blocks.drawBlocks(Layer.overlay);
|
||||
|
||||
drawAllTeams(false);
|
||||
|
||||
blocks.skipLayer(Layer.turret);
|
||||
blocks.drawBlocks(Layer.laser);
|
||||
@@ -361,7 +360,7 @@ public class Renderer extends RendererModule{
|
||||
void drawShield(){
|
||||
if(shieldGroup.size() == 0 && shieldDraws.size == 0) return;
|
||||
|
||||
Graphics.surface(renderer.shieldSurface, false);
|
||||
Graphics.surface(renderer.effectSurface, false);
|
||||
Draw.color(Color.ROYAL);
|
||||
Entities.draw(shieldGroup);
|
||||
for(Callable c : shieldDraws){
|
||||
@@ -382,7 +381,7 @@ public class Renderer extends RendererModule{
|
||||
}
|
||||
}
|
||||
|
||||
Texture texture = shieldSurface.texture();
|
||||
Texture texture = effectSurface.texture();
|
||||
Shaders.shield.color.set(Color.SKY);
|
||||
|
||||
Tmp.tr2.setRegion(texture);
|
||||
|
||||
@@ -132,7 +132,7 @@ public abstract class GroundUnitType extends UnitType{
|
||||
}
|
||||
|
||||
public void update(BaseUnit unit) {
|
||||
//TODO move toward resupply point?
|
||||
//TODO move toward resupply point
|
||||
if(unit.inventory.totalAmmo() + 10 >= unit.inventory.ammoCapacity()){
|
||||
unit.state.set(unit, attack);
|
||||
}
|
||||
@@ -158,7 +158,7 @@ public abstract class GroundUnitType extends UnitType{
|
||||
if(closest != null){
|
||||
unit.target = closest;
|
||||
}else {
|
||||
Tile target = Geometry.findClosest(unit.x, unit.y, world.indexer().getEnemy(unit.team, BlockFlag.resupplyPoint));
|
||||
Tile target = Geometry.findClosest(unit.x, unit.y, world.indexer().getEnemy(unit.team, BlockFlag.target));
|
||||
if (target != null) unit.target = target.entity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package io.anuke.mindustry.graphics;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import io.anuke.mindustry.content.blocks.Blocks;
|
||||
import io.anuke.mindustry.game.Team;
|
||||
@@ -8,7 +7,6 @@ import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.mindustry.world.blocks.types.StaticBlock;
|
||||
import io.anuke.ucore.core.Graphics;
|
||||
import io.anuke.ucore.core.Settings;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
@@ -60,7 +58,7 @@ public class BlockRenderer{
|
||||
|
||||
int expandr = 4;
|
||||
|
||||
Graphics.surface(renderer.shadowSurface);
|
||||
Graphics.surface(renderer.effectSurface);
|
||||
|
||||
for(int x = -rangex - expandr; x <= rangex + expandr; x++){
|
||||
for(int y = -rangey - expandr; y <= rangey + expandr; y++){
|
||||
|
||||
@@ -66,20 +66,20 @@ public enum CacheLayer {
|
||||
|
||||
protected void beginShader(){
|
||||
//renderer.getBlocks().endFloor();
|
||||
renderer.waterSurface.getBuffer().begin();
|
||||
renderer.effectSurface.getBuffer().begin();
|
||||
Graphics.clear(Color.CLEAR);
|
||||
//renderer.getBlocks().beginFloor();
|
||||
}
|
||||
|
||||
public void endShader(Shader shader){
|
||||
renderer.getBlocks().endFloor();
|
||||
renderer.waterSurface.getBuffer().end();
|
||||
renderer.effectSurface.getBuffer().end();
|
||||
|
||||
renderer.pixelSurface.getBuffer().begin();
|
||||
|
||||
Graphics.shader(shader);
|
||||
Graphics.begin();
|
||||
Draw.rect(renderer.waterSurface.texture(), Core.camera.position.x, Core.camera.position.y,
|
||||
Draw.rect(renderer.effectSurface.texture(), Core.camera.position.x, Core.camera.position.y,
|
||||
Core.camera.viewportWidth * Core.camera.zoom, -Core.camera.viewportHeight * Core.camera.zoom);
|
||||
Graphics.end();
|
||||
Graphics.shader();
|
||||
|
||||
@@ -3,6 +3,8 @@ package io.anuke.mindustry.graphics;
|
||||
public enum Layer{
|
||||
/**Base block layer.*/
|
||||
block,
|
||||
/**for placement*/
|
||||
placement,
|
||||
/**First overlay. Stuff like conveyor items.*/
|
||||
overlay,
|
||||
/**"High" blocks, like turrets.*/
|
||||
|
||||
@@ -15,6 +15,7 @@ import static io.anuke.mindustry.Vars.world;
|
||||
|
||||
public class Shaders{
|
||||
public static final Outline outline = new Outline();
|
||||
public static final Inline inline = new Inline();
|
||||
public static final Shield shield = new Shield();
|
||||
public static final SurfaceShader water = new SurfaceShader("water");
|
||||
public static final SurfaceShader lava = new SurfaceShader("lava");
|
||||
@@ -71,6 +72,25 @@ public class Shaders{
|
||||
shader.setUniformf("u_texsize", vec.set(region.getTexture().getWidth(), region.getTexture().getHeight()));
|
||||
}
|
||||
}
|
||||
|
||||
public static class Inline extends Shader{
|
||||
public Color color = new Color();
|
||||
public float progress;
|
||||
|
||||
public Inline(){
|
||||
super("inline-lines", "default");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(){
|
||||
shader.setUniformf("u_progress", progress);
|
||||
shader.setUniformf("u_color", color);
|
||||
shader.setUniformf("u_uv", region.getU(), region.getV());
|
||||
shader.setUniformf("u_uv2", region.getU2(), region.getV2());
|
||||
shader.setUniformf("u_time", Timers.time());
|
||||
shader.setUniformf("u_texsize", vec.set(region.getTexture().getWidth(), region.getTexture().getHeight()));
|
||||
}
|
||||
}
|
||||
|
||||
public static class Shield extends Shader{
|
||||
public static final int MAX_HITS = 3*64;
|
||||
|
||||
@@ -203,9 +203,10 @@ public abstract class InputHandler extends InputAdapter{
|
||||
NetEvents.handlePlace(player, x, y, result, rotation);
|
||||
}
|
||||
|
||||
//todo fix this, call placed()
|
||||
if(!Net.client()){
|
||||
Tile tile = world.tile(x, y);
|
||||
if(tile != null) threads.run(() -> result.placed(tile));
|
||||
//Tile tile = world.tile(x, y);
|
||||
//if(tile != null) threads.run(() -> result.placed(tile));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -166,13 +166,11 @@ public class SettingsMenuDialog extends SettingsDialog{
|
||||
graphics.checkPref("pixelate", true, b -> {
|
||||
if(b){
|
||||
renderer.pixelSurface.setScale(Core.cameraScale);
|
||||
renderer.shadowSurface.setScale(Core.cameraScale);
|
||||
renderer.shieldSurface.setScale(Core.cameraScale);
|
||||
renderer.effectSurface.setScale(Core.cameraScale);
|
||||
//Graphics.getEffects1().setScale(Core.cameraScale);
|
||||
//Graphics.getEffects2().setScale(Core.cameraScale);
|
||||
}else{
|
||||
renderer.shadowSurface.setScale(1);
|
||||
renderer.shieldSurface.setScale(1);
|
||||
renderer.effectSurface.setScale(1);
|
||||
//Graphics.getEffects1().setScale(1);
|
||||
//Graphics.getEffects2().setScale(1);
|
||||
}
|
||||
|
||||
@@ -304,6 +304,10 @@ public class Block extends BaseBlock {
|
||||
}
|
||||
}
|
||||
|
||||
public TextureRegion[] getBlockIcon(){
|
||||
return getIcon();
|
||||
}
|
||||
|
||||
public TextureRegion[] getCompactIcon(){
|
||||
TextureRegion[] out = getIcon();
|
||||
for(int i = 0; i < out.length; i ++){
|
||||
|
||||
@@ -10,6 +10,7 @@ import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.content.fx.Fx;
|
||||
import io.anuke.mindustry.resource.ItemStack;
|
||||
import io.anuke.mindustry.resource.Recipe;
|
||||
import io.anuke.mindustry.world.blocks.types.BuildBlock.BuildEntity;
|
||||
import io.anuke.ucore.core.Effects;
|
||||
import io.anuke.ucore.entities.Entities;
|
||||
|
||||
@@ -62,7 +63,10 @@ public class Placement {
|
||||
//just in case
|
||||
if(tile == null) return;
|
||||
|
||||
tile.setBlock(result, rotation);
|
||||
Block sub = Block.getByName("build" + result.size);
|
||||
|
||||
tile.setBlock(sub, rotation);
|
||||
tile.<BuildEntity>entity().result = result;
|
||||
tile.setTeam(team);
|
||||
|
||||
if(result.isMultiblock()){
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
package io.anuke.mindustry.world.blocks.types;
|
||||
|
||||
import com.badlogic.gdx.graphics.Colors;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.game.Team;
|
||||
import io.anuke.mindustry.graphics.Layer;
|
||||
import io.anuke.mindustry.graphics.Shaders;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
import io.anuke.ucore.core.Graphics;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
|
||||
public class BuildBlock extends Block {
|
||||
private static final float buildTime = 120f;
|
||||
|
||||
public BuildBlock(String name) {
|
||||
super(name);
|
||||
solid = true;
|
||||
update = true;
|
||||
size = Integer.parseInt(name.charAt(name.length()-1) + "");
|
||||
health = 1;
|
||||
layer = Layer.placement;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Tile tile){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawLayer(Tile tile) {
|
||||
BuildEntity entity = tile.entity();
|
||||
|
||||
Shaders.inline.color = Colors.get("accent");
|
||||
|
||||
for(TextureRegion region : entity.result.getBlockIcon()){
|
||||
Shaders.inline.region = region;
|
||||
Shaders.inline.progress = entity.progress;
|
||||
Shaders.inline.apply();
|
||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||
Graphics.flush();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawShadow(Tile tile) {
|
||||
BuildEntity entity = tile.entity();
|
||||
|
||||
entity.result.drawShadow(tile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(Tile tile) {
|
||||
BuildEntity entity = tile.entity();
|
||||
entity.progress += 1f/buildTime;
|
||||
if(entity.progress > 1f){
|
||||
Team team = tile.getTeam();
|
||||
tile.setBlock(entity.result);
|
||||
tile.setTeam(team);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity getEntity() {
|
||||
return new BuildEntity();
|
||||
}
|
||||
|
||||
public class BuildEntity extends TileEntity{
|
||||
public Block result;
|
||||
public float progress;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.anuke.mindustry.world.blocks.types.defense;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import io.anuke.mindustry.content.fx.Fx;
|
||||
import io.anuke.mindustry.entities.*;
|
||||
@@ -18,7 +19,10 @@ import io.anuke.ucore.core.Timers;
|
||||
import io.anuke.ucore.function.BiConsumer;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.graphics.Lines;
|
||||
import io.anuke.ucore.util.*;
|
||||
import io.anuke.ucore.util.Angles;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
import io.anuke.ucore.util.Strings;
|
||||
import io.anuke.ucore.util.Translator;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
@@ -111,6 +115,11 @@ public abstract class Turret extends Block{
|
||||
|
||||
Draw.color();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TextureRegion[] getBlockIcon(){
|
||||
return new TextureRegion[]{Draw.region("block-" + size), Draw.region(name)};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawSelect(Tile tile){
|
||||
|
||||
Reference in New Issue
Block a user