添加垂直方向消失动画

This commit is contained in:
Light_Quanta 2024-05-21 18:22:49 +08:00
parent 8145ab4db3
commit 6178b87a9a
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
3 changed files with 58 additions and 40 deletions

View file

@ -2,14 +2,12 @@ package net.mcreator.target.client.screens;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.*;
import net.mcreator.target.init.TargetModAttributes;
import net.mcreator.target.init.TargetModItems;
import net.mcreator.target.init.TargetModTags;
import net.mcreator.target.network.TargetModVariables;
import net.minecraft.client.CameraType;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player;
@ -18,7 +16,8 @@ import net.minecraftforge.client.event.RenderGuiEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.joml.Matrix4f;
import static net.mcreator.target.tools.RenderTool.preciseBlit;
@Mod.EventBusSubscriber({Dist.CLIENT})
public class CrossHairOverlay {
@ -84,28 +83,6 @@ public class CrossHairOverlay {
RenderSystem.setShaderColor(1, 1, 1, 1);
}
private static void preciseBlit(GuiGraphics gui, ResourceLocation pAtlasLocation, float pX, float pY, float pUOffset, float pVOffset, float pWidth, float pHeight, float pTextureWidth, float pTextureHeight) {
float pX2 = pX + pWidth;
float pY2 = pY + pHeight;
float pBlitOffset = 0;
float pMinU = pUOffset / pTextureWidth;
float pMaxU = (pUOffset + pWidth) / pTextureWidth;
float pMinV = pVOffset / pTextureHeight;
float pMaxV = (pVOffset + pHeight) / pTextureHeight;
RenderSystem.setShaderTexture(0, pAtlasLocation);
RenderSystem.setShader(GameRenderer::getPositionTexShader);
Matrix4f matrix4f = gui.pose().last().pose();
BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder();
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
bufferbuilder.vertex(matrix4f, pX, pY, pBlitOffset).uv(pMinU, pMinV).endVertex();
bufferbuilder.vertex(matrix4f, pX, pY2, pBlitOffset).uv(pMinU, pMaxV).endVertex();
bufferbuilder.vertex(matrix4f, pX2, pY2, pBlitOffset).uv(pMaxU, pMaxV).endVertex();
bufferbuilder.vertex(matrix4f, pX2, pY, pBlitOffset).uv(pMaxU, pMinV).endVertex();
BufferUploader.drawWithShader(bufferbuilder.end());
}
private static boolean shouldRenderCrosshair(Player player) {
if (player == null) return false;

View file

@ -25,6 +25,8 @@ import top.theillusivec4.curios.api.CuriosApi;
import java.util.concurrent.atomic.AtomicReference;
import static net.mcreator.target.tools.RenderTool.preciseBlit;
@Mod.EventBusSubscriber(value = Dist.CLIENT)
public class KillMessageOverlay {
private static final ResourceLocation HEADSHOT = new ResourceLocation(TargetMod.MODID, "textures/screens/damage_types/headshot.png");
@ -51,17 +53,16 @@ public class KillMessageOverlay {
return;
}
int index = 0;
float totalTop = 5;
for (PlayerKillRecord record : KillMessageHandler.QUEUE) {
renderKillMessages(record, event, index);
index++;
totalTop = renderKillMessages(record, event, totalTop);
}
}
private static void renderKillMessages(PlayerKillRecord record, RenderGuiEvent.Pre event, int index) {
private static float renderKillMessages(PlayerKillRecord record, RenderGuiEvent.Pre event, float baseTop) {
int w = event.getWindow().getGuiScaledWidth();
int h = 10 + index * 10;
float top = baseTop;
Font font = Minecraft.getInstance().font;
@ -100,9 +101,12 @@ public class KillMessageOverlay {
// 4s后开始消失
if (record.tick >= 80) {
double rate = Math.pow((record.tick + event.getPartialTick() - 80) / 20, 5);
float rate = (float) Math.pow((record.tick + event.getPartialTick() - 80) / 20, 5);
gui.pose().translate(rate * 100, 0, 0);
gui.setColor(1, 1, 1, (float) (1 - rate));
gui.setColor(1, 1, 1, 1 - rate);
baseTop += 10 * (1 - rate);
} else {
baseTop += 10;
}
// 击杀提示是右对齐的这里从右向左渲染
@ -112,7 +116,7 @@ public class KillMessageOverlay {
Minecraft.getInstance().font,
targetName.get(),
w - targetNameWidth - 10f,
h,
top,
record.target.getTeamColor(),
false
);
@ -123,9 +127,10 @@ public class KillMessageOverlay {
ResourceLocation damageTypeIcon = getDamageTypeIcon(record);
if (damageTypeIcon != null) {
gui.blit(damageTypeIcon,
preciseBlit(gui,
damageTypeIcon,
damageTypeIconW,
h - 2,
top - 2,
0,
0,
12,
@ -143,9 +148,10 @@ public class KillMessageOverlay {
ResourceLocation resourceLocation = gunItem.getGunIcon();
gui.blit(resourceLocation,
preciseBlit(gui,
resourceLocation,
itemIconW,
h,
top,
0,
0,
32,
@ -159,9 +165,10 @@ public class KillMessageOverlay {
if (record.stack.getItem().getDescriptionId().equals("item.dreamaticvoyage.world_peace_staff")) {
renderItem = true;
gui.blit(WORLD_PEACE_STAFF,
preciseBlit(gui,
WORLD_PEACE_STAFF,
itemIconW,
h,
top,
0,
0,
32,
@ -196,7 +203,7 @@ public class KillMessageOverlay {
Minecraft.getInstance().font,
attackerName.get(),
nameW,
h,
top,
record.attacker.getTeamColor(),
false
);
@ -208,6 +215,8 @@ public class KillMessageOverlay {
gui.setColor(1, 1, 1, 1);
gui.pose().popPose();
return baseTop;
}
@Nullable

View file

@ -0,0 +1,32 @@
package net.mcreator.target.tools;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.*;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.resources.ResourceLocation;
import org.joml.Matrix4f;
public class RenderTool {
public static void preciseBlit(GuiGraphics gui, ResourceLocation pAtlasLocation, float pX, float pY, float pUOffset, float pVOffset, float pWidth, float pHeight, float pTextureWidth, float pTextureHeight) {
float pX2 = pX + pWidth;
float pY2 = pY + pHeight;
float pBlitOffset = 0;
float pMinU = pUOffset / pTextureWidth;
float pMaxU = (pUOffset + pWidth) / pTextureWidth;
float pMinV = pVOffset / pTextureHeight;
float pMaxV = (pVOffset + pHeight) / pTextureHeight;
RenderSystem.setShaderTexture(0, pAtlasLocation);
RenderSystem.setShader(GameRenderer::getPositionTexShader);
Matrix4f matrix4f = gui.pose().last().pose();
BufferBuilder bufferbuilder = Tesselator.getInstance().getBuilder();
bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
bufferbuilder.vertex(matrix4f, pX, pY, pBlitOffset).uv(pMinU, pMinV).endVertex();
bufferbuilder.vertex(matrix4f, pX, pY2, pBlitOffset).uv(pMinU, pMaxV).endVertex();
bufferbuilder.vertex(matrix4f, pX2, pY2, pBlitOffset).uv(pMaxU, pMaxV).endVertex();
bufferbuilder.vertex(matrix4f, pX2, pY, pBlitOffset).uv(pMaxU, pMinV).endVertex();
BufferUploader.drawWithShader(bufferbuilder.end());
}
}