Merge pull request #117 from hellomouse/feature-blockpreview

Added Placement Preview
This commit is contained in:
Anuken
2018-04-21 15:41:03 -04:00
committed by GitHub
4 changed files with 114 additions and 59 deletions
+1
View File
@@ -270,6 +270,7 @@ setting.multithread.name=Multithreading
setting.fps.name=Show FPS setting.fps.name=Show FPS
setting.vsync.name=VSync setting.vsync.name=VSync
setting.lasers.name=Show Power Lasers setting.lasers.name=Show Power Lasers
setting.previewopacity.name=Placing Preview Opacity
setting.healthbars.name=Show Entity Health bars setting.healthbars.name=Show Entity Health bars
setting.pixelate.name=Pixelate Screen setting.pixelate.name=Pixelate Screen
setting.musicvol.name=Music Volume setting.musicvol.name=Music Volume
@@ -12,13 +12,14 @@ import io.anuke.mindustry.world.Layer;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.mindustry.world.blocks.Blocks;
import io.anuke.mindustry.world.blocks.types.StaticBlock; import io.anuke.mindustry.world.blocks.types.StaticBlock;
import io.anuke.mindustry.world.blocks.types.defense.Turret;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.graphics.CacheBatch; import io.anuke.ucore.graphics.CacheBatch;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import java.util.Arrays; import java.util.Arrays;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -27,6 +28,8 @@ import static io.anuke.ucore.core.Core.camera;
public class BlockRenderer{ public class BlockRenderer{
private final static int chunksize = 32; private final static int chunksize = 32;
private final static int initialRequests = 32*32; private final static int initialRequests = 32*32;
private static float storeX = 0;
private static float storeY = 0;
private int[][][] cache; private int[][][] cache;
private CacheBatch cbatch; private CacheBatch cbatch;
@@ -215,7 +218,7 @@ public class BlockRenderer{
if(point.pathTiles != null){ if(point.pathTiles != null){
for(int i = 1; i < point.pathTiles.length; i ++){ for(int i = 1; i < point.pathTiles.length; i ++){
Lines.line(point.pathTiles[i-1].worldx(), point.pathTiles[i-1].worldy(), Lines.line(point.pathTiles[i-1].worldx(), point.pathTiles[i-1].worldy(),
point.pathTiles[i].worldx(), point.pathTiles[i].worldy()); point.pathTiles[i].worldx(), point.pathTiles[i].worldy());
Lines.circle(point.pathTiles[i-1].worldx(), point.pathTiles[i-1].worldy(), 6f); Lines.circle(point.pathTiles[i-1].worldx(), point.pathTiles[i-1].worldy(), 6f);
} }
} }
@@ -280,4 +283,49 @@ public class BlockRenderer{
cbatch.dispose(); cbatch.dispose();
cbatch = new CacheBatch(world.width() * world.height() * 4); cbatch = new CacheBatch(world.width() * world.height() * 4);
} }
public void drawPreview(Block block, float drawx, float drawy, float rotation, float opacity) {
Draw.alpha(opacity);
Draw.rect(block.name(), drawx, drawy, rotation);
}
public void handlePreview(Block block, float rotation, float drawx, float drawy, int tilex, int tiley) {
if(control.input().recipe != null && state.inventory.hasItems(control.input().recipe.requirements)
&& control.input().validPlace(tilex, tiley, block) && (android || control.input().cursorNear())) {
if(block.isMultiblock()) {
float halfBlockWidth = (block.width * tilesize) / 2;
float halfBlockHeight = (block.height * tilesize) / 2;
if((storeX == 0 && storeY == 0)) {
storeX = drawx;
storeY = drawy;
}
if((storeX == drawx - halfBlockWidth || storeX == drawx + halfBlockWidth || storeY == drawy - halfBlockHeight || storeY == drawy + halfBlockHeight) &&
((tiley - control.input().getBlockY()) % block.height != 0 || (tilex - control.input().getBlockX()) % block.width != 0)) {
return;
}
else {
storeX = drawx;
storeY = drawy;
}
}
float opacity = (float) Settings.getInt("previewopacity") / 100f;
Draw.color(Color.WHITE);
Draw.alpha(opacity);
if(block instanceof Turret) {
if (block.isMultiblock()) {
Draw.rect("block-" + block.width + "x" + block.height, drawx, drawy);
} else {
Draw.rect("block", drawx, drawy);
}
}
drawPreview(block, drawx, drawy, rotation, opacity);
Draw.reset();
}
}
} }
@@ -34,15 +34,17 @@ public enum PlaceMode{
float si = MathUtils.sin(Timers.time() / 6f) + 1.5f; float si = MathUtils.sin(Timers.time() / 6f) + 1.5f;
renderer.getBlocks().handlePreview(control.input().recipe.result, control.input().recipe.result.rotate ? control.input().rotation * 90 : 0f, x + offset.x, y + offset.y, tilex, tiley);
Draw.color(valid ? Colors.get("place") : Colors.get("placeInvalid")); Draw.color(valid ? Colors.get("place") : Colors.get("placeInvalid"));
Lines.stroke(2f); Lines.stroke(2f);
Lines.crect(x + offset.x, y + offset.y, tilesize * control.input().recipe.result.width + si, Lines.crect(x + offset.x, y + offset.y, tilesize * control.input().recipe.result.width + si,
tilesize * control.input().recipe.result.height + si); tilesize * control.input().recipe.result.height + si);
control.input().recipe.result.drawPlace(tilex, tiley, control.input().rotation, valid); control.input().recipe.result.drawPlace(tilex, tiley, control.input().rotation, valid);
Lines.stroke(2f);
if(control.input().recipe.result.rotate){ if(control.input().recipe.result.rotate){
Draw.color(Colors.get("placeRotate")); Draw.color(Colors.get("placeRotate"));
tr.trns(control.input().rotation * 90, 7, 0); tr.trns(control.input().rotation * 90, 7, 0);
Lines.line(x, y, x + tr.x, y + tr.y); Lines.line(x, y, x + tr.x, y + tr.y);
@@ -150,7 +152,7 @@ public enum PlaceMode{
tile = tile.getLinked(); tile = tile.getLinked();
if(tile != null && control.input().validBreak(tile.x, tile.y)){ if(tile != null && control.input().validBreak(tile.x, tile.y)){
Lines.crect(tile.drawx(), tile.drawy(), Lines.crect(tile.drawx(), tile.drawy(),
tile.block().width * t, tile.block().height * t); tile.block().width * t, tile.block().height * t);
} }
} }
} }
@@ -273,16 +275,18 @@ public enum PlaceMode{
Draw.alpha(0.3f); Draw.alpha(0.3f);
Draw.crect("blank", x, y, x2 - x, y2 - y); Draw.crect("blank", x, y, x2 - x, y2 - y);
Draw.color(Colors.get("placeInvalid"));
int amount = 1; int amount = 1;
for(int cx = 0; cx <= Math.abs(endx - tilex); cx ++){ for(int cx = 0; cx <= Math.abs(endx - tilex); cx ++){
for(int cy = 0; cy <= Math.abs(endy - tiley); cy ++){ for(int cy = 0; cy <= Math.abs(endy - tiley); cy ++){
int px = tx + cx * Mathf.sign(ex - tx), int px = tx + cx * Mathf.sign(ex - tx),
py = ty + cy * Mathf.sign(ey - ty); py = ty + cy * Mathf.sign(ey - ty);
renderer.getBlocks().handlePreview(control.input().recipe.result, control.input().recipe.result.rotate ? rotation * 90 : 0f, px * t + offset.x, py * t + offset.y, px, py);
if(!control.input().validPlace(px, py, control.input().recipe.result) if(!control.input().validPlace(px, py, control.input().recipe.result)
|| !state.inventory.hasItems(control.input().recipe.requirements, amount)){ || !state.inventory.hasItems(control.input().recipe.requirements, amount)){
Lines.stroke(2f);
Draw.color(Colors.get("placeInvalid"));
Lines.crect(px * t + offset.x, py * t + offset.y, t*block.width, t*block.height); Lines.crect(px * t + offset.x, py * t + offset.y, t*block.width, t*block.height);
} }
amount ++; amount ++;
@@ -291,6 +295,7 @@ public enum PlaceMode{
if(control.input().recipe.result.rotate){ if(control.input().recipe.result.rotate){
float cx = tx * t, cy = ty * t; float cx = tx * t, cy = ty * t;
Lines.stroke(2f);
Draw.color(Colors.get("placeRotate")); Draw.color(Colors.get("placeRotate"));
tr.trns(rotation * 90, 7, 0); tr.trns(rotation * 90, 7, 0);
Lines.line(cx, cy, cx + tr.x, cy + tr.y); Lines.line(cx, cy, cx + tr.x, cy + tr.y);
@@ -139,6 +139,7 @@ public class SettingsMenuDialog extends SettingsDialog{
graphics.checkPref("fps", false); graphics.checkPref("fps", false);
graphics.checkPref("lasers", true); graphics.checkPref("lasers", true);
graphics.sliderPref("previewopacity", 50, 0, 100, i -> i + "%");
graphics.checkPref("indicators", true); graphics.checkPref("indicators", true);
graphics.checkPref("healthbars", true); graphics.checkPref("healthbars", true);
graphics.checkPref("pixelate", true, b -> { graphics.checkPref("pixelate", true, b -> {