mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-02-22 12:38:05 +07:00
WIP launch animation progress
This commit is contained in:
parent
00e3a59463
commit
737fa4fa69
@ -7,6 +7,7 @@ buildscript{
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
|
//note that later versions, like alpha05, fail to work correctly
|
||||||
classpath 'com.android.tools.build:gradle:7.1.0-alpha02'
|
classpath 'com.android.tools.build:gradle:7.1.0-alpha02'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -18,7 +19,6 @@ configurations{ natives }
|
|||||||
repositories{
|
repositories{
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven{ url "https://maven.google.com" }
|
maven{ url "https://maven.google.com" }
|
||||||
jcenter() //remove later once google/JetBrains fixes the dependency
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task deploy(type: Copy){
|
task deploy(type: Copy){
|
||||||
|
@ -103,8 +103,6 @@ public class Vars implements Loadable{
|
|||||||
public static final float invasionGracePeriod = 20;
|
public static final float invasionGracePeriod = 20;
|
||||||
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */
|
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */
|
||||||
public static final float minArmorDamage = 0.1f;
|
public static final float minArmorDamage = 0.1f;
|
||||||
/** launch animation duration */
|
|
||||||
public static final float launchDuration = 140f;
|
|
||||||
/** land animation duration */
|
/** land animation duration */
|
||||||
public static final float coreLandDuration = 150f;
|
public static final float coreLandDuration = 150f;
|
||||||
/** size of tiles in units */
|
/** size of tiles in units */
|
||||||
|
@ -544,7 +544,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
core.items.each((i, a) -> i.unlock());
|
core.items.each((i, a) -> i.unlock());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
|
if(Core.input.keyTap(Binding.pause) && !renderer.isCutscene() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
|
||||||
state.set(state.is(State.playing) ? State.paused : State.playing);
|
state.set(state.is(State.playing) ? State.paused : State.playing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
private static final float cloudScaling = 1700f, cfinScl = -2f, cfinOffset = 0.3f, calphaFinOffset = 0.25f;
|
private static final float cloudScaling = 1700f, cfinScl = -2f, cfinOffset = 0.3f, calphaFinOffset = 0.25f;
|
||||||
private static final float[] cloudAlphas = {0, 0.5f, 1f, 0.1f, 0, 0f};
|
private static final float[] cloudAlphas = {0, 0.5f, 1f, 0.1f, 0, 0f};
|
||||||
private static final float cloudAlpha = 0.81f;
|
private static final float cloudAlpha = 0.81f;
|
||||||
private static final float[] thrusterSize = {0f, 0f, 0f, 0f, 0.3f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0f};
|
private static final float[] thrusterSizes = {0f, 0f, 0f, 0f, 0.3f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0f};
|
||||||
private static final Interp landInterp = Interp.pow3;
|
private static final Interp landInterp = Interp.pow3;
|
||||||
|
|
||||||
public final BlockRenderer blocks = new BlockRenderer();
|
public final BlockRenderer blocks = new BlockRenderer();
|
||||||
@ -70,7 +70,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
//current duration of screen shake
|
//current duration of screen shake
|
||||||
shakeTime;
|
shakeTime;
|
||||||
//for landTime > 0: if true, core is currently *launching*, otherwise landing.
|
//for landTime > 0: if true, core is currently *launching*, otherwise landing.
|
||||||
private boolean isLaunching;
|
private boolean launching;
|
||||||
private Vec2 camShakeOffset = new Vec2();
|
private Vec2 camShakeOffset = new Vec2();
|
||||||
|
|
||||||
public Renderer(){
|
public Renderer(){
|
||||||
@ -129,7 +129,9 @@ public class Renderer implements ApplicationListener{
|
|||||||
if(!state.isPaused()){
|
if(!state.isPaused()){
|
||||||
landTime -= Time.delta;
|
landTime -= Time.delta;
|
||||||
}
|
}
|
||||||
camerascale = landInterp.apply(minZoomScl, Scl.scl(4f), 1f - landTime / coreLandDuration);
|
float fin = landTime / coreLandDuration;
|
||||||
|
if(!launching) fin = 1f - fin;
|
||||||
|
camerascale = landInterp.apply(minZoomScl, Scl.scl(4f), fin);
|
||||||
weatherAlpha = 0f;
|
weatherAlpha = 0f;
|
||||||
|
|
||||||
//snap camera to cutscene core regardless of player input
|
//snap camera to cutscene core regardless of player input
|
||||||
@ -312,7 +314,8 @@ public class Renderer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateLandParticles(){
|
void updateLandParticles(){
|
||||||
float tsize = Mathf.sample(thrusterSize, (landTime + 35f) / coreLandDuration);
|
float time = launching ? coreLandDuration - landTime : landTime;
|
||||||
|
float tsize = Mathf.sample(thrusterSizes, (time + 35f) / coreLandDuration);
|
||||||
|
|
||||||
landPTimer += tsize * Time.delta;
|
landPTimer += tsize * Time.delta;
|
||||||
if(landCore != null && landPTimer >= 1f){
|
if(landCore != null && landPTimer >= 1f){
|
||||||
@ -331,9 +334,12 @@ public class Renderer implements ApplicationListener{
|
|||||||
var clouds = assets.get("sprites/clouds.png", Texture.class);
|
var clouds = assets.get("sprites/clouds.png", Texture.class);
|
||||||
if(landTime > 0 && build != null){
|
if(landTime > 0 && build != null){
|
||||||
float fout = landTime / coreLandDuration;
|
float fout = landTime / coreLandDuration;
|
||||||
|
|
||||||
|
if(launching) fout = 1f - fout;
|
||||||
|
|
||||||
float fin = 1f - fout;
|
float fin = 1f - fout;
|
||||||
|
|
||||||
//core
|
//draw core
|
||||||
var block = (CoreBlock)build.block;
|
var block = (CoreBlock)build.block;
|
||||||
TextureRegion reg = block.fullIcon;
|
TextureRegion reg = block.fullIcon;
|
||||||
float scl = Scl.scl(4f) / camerascale;
|
float scl = Scl.scl(4f) / camerascale;
|
||||||
@ -341,7 +347,15 @@ public class Renderer implements ApplicationListener{
|
|||||||
float s = reg.width * Draw.scl * scl * 3.6f * Interp.pow2Out.apply(fout);
|
float s = reg.width * Draw.scl * scl * 3.6f * Interp.pow2Out.apply(fout);
|
||||||
float rotation = Interp.pow2In.apply(fout) * 135f, x = build.x + Mathf.range(shake), y = build.y + Mathf.range(shake);
|
float rotation = Interp.pow2In.apply(fout) * 135f, x = build.x + Mathf.range(shake), y = build.y + Mathf.range(shake);
|
||||||
float thrustOpen = 0.25f;
|
float thrustOpen = 0.25f;
|
||||||
float frame = fin >= thrustOpen ? 1f : fin / thrustOpen;
|
float thrusterFrame = fin >= thrustOpen ? 1f : fin / thrustOpen;
|
||||||
|
float thrusterSize = Mathf.sample(thrusterSizes, fin);
|
||||||
|
|
||||||
|
//when launching, thrusters stay out the entire time.
|
||||||
|
if(launching){
|
||||||
|
Interp i = Interp.pow2Out;
|
||||||
|
thrusterFrame = i.apply(Mathf.clamp(fout*13f));
|
||||||
|
thrusterSize = i.apply(Mathf.clamp(fout*9f));
|
||||||
|
}
|
||||||
|
|
||||||
Draw.color(Pal.lightTrail);
|
Draw.color(Pal.lightTrail);
|
||||||
//TODO spikier heat
|
//TODO spikier heat
|
||||||
@ -351,20 +365,20 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
float pfin = Interp.pow3Out.apply(fin), pf = Interp.pow2In.apply(fout);
|
float pfin = Interp.pow3Out.apply(fin), pf = Interp.pow2In.apply(fout);
|
||||||
|
|
||||||
//particles
|
//draw particles
|
||||||
Angles.randLenVectors(1, pfin, 100, 800f * scl * pfin, (ax, ay, ffin, ffout) -> {
|
Angles.randLenVectors(1, pfin, 100, 800f * scl * pfin, (ax, ay, ffin, ffout) -> {
|
||||||
Lines.stroke(scl * ffin * pf * 3f);
|
Lines.stroke(scl * ffin * pf * 3f);
|
||||||
Lines.lineAngle(build.x + ax, build.y + ay, Mathf.angle(ax, ay), (ffin * 20 + 1f) * scl);
|
Lines.lineAngle(build.x + ax, build.y + ay, Mathf.angle(ax, ay), (ffin * 20 + 1f) * scl);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
Draw.mixcol(Color.white, Interp.pow2In.apply(fout));
|
Draw.mixcol(Color.white, Interp.pow5In.apply(fout));
|
||||||
Draw.scl(scl);
|
Draw.scl(scl);
|
||||||
|
|
||||||
Draw.alpha(1f);
|
Draw.alpha(1f);
|
||||||
|
|
||||||
//thruster flame
|
//draw thruster flame
|
||||||
float strength = (1f + (block.size - 3)/2.5f) * scl * Mathf.sample(thrusterSize, fin) * (0.95f + Mathf.absin(2f, 0.1f));
|
float strength = (1f + (block.size - 3)/2.5f) * scl * thrusterSize * (0.95f + Mathf.absin(2f, 0.1f));
|
||||||
float offset = (block.size - 3) * 3f * scl;
|
float offset = (block.size - 3) * 3f * scl;
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++){
|
for(int i = 0; i < 4; i++){
|
||||||
@ -379,12 +393,12 @@ public class Renderer implements ApplicationListener{
|
|||||||
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength);
|
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength);
|
||||||
}
|
}
|
||||||
|
|
||||||
drawThrusters(block, x, y, rotation, frame);
|
drawThrusters(block, x, y, rotation, thrusterFrame);
|
||||||
|
|
||||||
Drawf.spinSprite(block.region, x, y, rotation);
|
Drawf.spinSprite(block.region, x, y, rotation);
|
||||||
|
|
||||||
Draw.alpha(Interp.pow4In.apply(frame));
|
Draw.alpha(Interp.pow4In.apply(thrusterFrame));
|
||||||
drawThrusters(block, x, y, rotation, frame);
|
drawThrusters(block, x, y, rotation, thrusterFrame);
|
||||||
Draw.alpha(1f);
|
Draw.alpha(1f);
|
||||||
|
|
||||||
Drawf.spinSprite(block.teamRegions[build.team.id], x, y, rotation);
|
Drawf.spinSprite(block.teamRegions[build.team.id], x, y, rotation);
|
||||||
@ -393,8 +407,8 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
|
//draw clouds
|
||||||
if(state.rules.cloudColor.a > 0.0001f){
|
if(state.rules.cloudColor.a > 0.0001f){
|
||||||
//clouds
|
|
||||||
float scaling = cloudScaling;
|
float scaling = cloudScaling;
|
||||||
float sscl = Math.max(1f + Mathf.clamp(fin + cfinOffset)* cfinScl, 0f) * camerascale;
|
float sscl = Math.max(1f + Mathf.clamp(fin + cfinOffset)* cfinScl, 0f) * camerascale;
|
||||||
|
|
||||||
@ -472,16 +486,18 @@ public class Renderer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void showLanding(){
|
public void showLanding(){
|
||||||
isLaunching = false;
|
launching = false;
|
||||||
camerascale = minZoomScl;
|
camerascale = minZoomScl;
|
||||||
landTime = coreLandDuration;
|
landTime = coreLandDuration;
|
||||||
cloudSeed = Mathf.random(1f);
|
cloudSeed = Mathf.random(1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showLaunch(){
|
public void showLaunch(){
|
||||||
isLaunching = true;
|
Vars.ui.hudfrag.showLaunch();
|
||||||
|
launching = true;
|
||||||
landCore = player.team().core();
|
landCore = player.team().core();
|
||||||
cloudSeed = Mathf.random(1f);
|
cloudSeed = Mathf.random(1f);
|
||||||
|
landTime = coreLandDuration;
|
||||||
//TODO other stuff.
|
//TODO other stuff.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -913,6 +913,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}else{
|
}else{
|
||||||
CoreBlock block = from.info.bestCoreType instanceof CoreBlock b ? b : (CoreBlock)Blocks.coreShard;
|
CoreBlock block = from.info.bestCoreType instanceof CoreBlock b ? b : (CoreBlock)Blocks.coreShard;
|
||||||
|
|
||||||
|
//TODO load launchFrom sector right before launching so animation is correct
|
||||||
loadouts.show(block, from, () -> {
|
loadouts.show(block, from, () -> {
|
||||||
from.removeItems(universe.getLastLoadout().requirements());
|
from.removeItems(universe.getLastLoadout().requirements());
|
||||||
from.removeItems(universe.getLaunchResources());
|
from.removeItems(universe.getLaunchResources());
|
||||||
@ -923,7 +924,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
//TODO
|
//TODO
|
||||||
renderer.showLaunch();
|
renderer.showLaunch();
|
||||||
hide();
|
hide();
|
||||||
Time.runTask(launchDuration, () -> control.playSector(from, sector));
|
//run with less delay, as the loading animation is delayed by several frames
|
||||||
|
Time.runTask(coreLandDuration - 8f, () -> control.playSector(from, sector));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}else if(mode == select){
|
}else if(mode == select){
|
||||||
|
@ -545,11 +545,21 @@ public class HudFragment extends Fragment{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showLaunchDirect(){
|
public void showLaunch(){
|
||||||
|
float margin = 30f;
|
||||||
|
|
||||||
Image image = new Image();
|
Image image = new Image();
|
||||||
image.color.a = 0f;
|
image.color.a = 0f;
|
||||||
|
image.touchable = Touchable.disabled;
|
||||||
image.setFillParent(true);
|
image.setFillParent(true);
|
||||||
image.actions(Actions.fadeIn(launchDuration / 60f, Interp.pow2In), Actions.delay(8f / 60f), Actions.remove());
|
image.actions(Actions.delay((coreLandDuration - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove());
|
||||||
|
image.update(() -> {
|
||||||
|
image.toFront();
|
||||||
|
ui.loadfrag.toFront();
|
||||||
|
if(state.isMenu()){
|
||||||
|
image.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
Core.scene.add(image);
|
Core.scene.add(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -558,9 +568,10 @@ public class HudFragment extends Fragment{
|
|||||||
image.color.a = 1f;
|
image.color.a = 1f;
|
||||||
image.touchable = Touchable.disabled;
|
image.touchable = Touchable.disabled;
|
||||||
image.setFillParent(true);
|
image.setFillParent(true);
|
||||||
image.actions(Actions.fadeOut(0.8f), Actions.remove());
|
image.actions(Actions.fadeOut(35f / 60f), Actions.remove());
|
||||||
image.update(() -> {
|
image.update(() -> {
|
||||||
image.toFront();
|
image.toFront();
|
||||||
|
ui.loadfrag.toFront();
|
||||||
if(state.isMenu()){
|
if(state.isMenu()){
|
||||||
image.remove();
|
image.remove();
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,10 @@ public class LoadingFragment extends Fragment{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void toFront(){
|
||||||
|
table.toFront();
|
||||||
|
}
|
||||||
|
|
||||||
public void setProgress(Floatp progress){
|
public void setProgress(Floatp progress){
|
||||||
bar.reset(0f);
|
bar.reset(0f);
|
||||||
bar.visible = true;
|
bar.visible = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user