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.vsync.name=VSync
setting.lasers.name=Show Power Lasers
setting.previewopacity.name=Placing Preview Opacity
setting.healthbars.name=Show Entity Health bars
setting.pixelate.name=Pixelate Screen
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.blocks.Blocks;
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.Graphics;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.graphics.CacheBatch;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf;
import java.util.Arrays;
import static io.anuke.mindustry.Vars.*;
@@ -27,6 +28,8 @@ import static io.anuke.ucore.core.Core.camera;
public class BlockRenderer{
private final static int chunksize = 32;
private final static int initialRequests = 32*32;
private static float storeX = 0;
private static float storeY = 0;
private int[][][] cache;
private CacheBatch cbatch;
@@ -280,4 +283,49 @@ public class BlockRenderer{
cbatch.dispose();
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;
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"));
Lines.stroke(2f);
Lines.crect(x + offset.x, y + offset.y, tilesize * control.input().recipe.result.width + si,
tilesize * control.input().recipe.result.height + si);
control.input().recipe.result.drawPlace(tilex, tiley, control.input().rotation, valid);
Lines.stroke(2f);
if(control.input().recipe.result.rotate){
Draw.color(Colors.get("placeRotate"));
tr.trns(control.input().rotation * 90, 7, 0);
Lines.line(x, y, x + tr.x, y + tr.y);
@@ -273,16 +275,18 @@ public enum PlaceMode{
Draw.alpha(0.3f);
Draw.crect("blank", x, y, x2 - x, y2 - y);
Draw.color(Colors.get("placeInvalid"));
int amount = 1;
for(int cx = 0; cx <= Math.abs(endx - tilex); cx ++){
for(int cy = 0; cy <= Math.abs(endy - tiley); cy ++){
int px = tx + cx * Mathf.sign(ex - tx),
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)
|| !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);
}
amount ++;
@@ -291,6 +295,7 @@ public enum PlaceMode{
if(control.input().recipe.result.rotate){
float cx = tx * t, cy = ty * t;
Lines.stroke(2f);
Draw.color(Colors.get("placeRotate"));
tr.trns(rotation * 90, 7, 0);
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("lasers", true);
graphics.sliderPref("previewopacity", 50, 0, 100, i -> i + "%");
graphics.checkPref("indicators", true);
graphics.checkPref("healthbars", true);
graphics.checkPref("pixelate", true, b -> {