Java 如何使用Slick2D渲染最后一个角色图示符的一部分

Java 如何使用Slick2D渲染最后一个角色图示符的一部分,java,opengl,lwjgl,slick2d,Java,Opengl,Lwjgl,Slick2d,我目前正在使用Slick渲染游戏中的自定义聊天 我想做的是,我想为聊天创建一个自定义的“淡入淡出”效果,它从右到左平滑地淡入淡出。我不太擅长在文本中解释事情,所以我将展示一个我想要的例子 例如: 我想呈现文本bernhardkiv:helloworld,运行我的常规字体渲染器,结果如下: 我想做的是,顺利地将文本切掉,如下所示 我不知道该怎么做!我相信这是可能的使用glScissoring,但我一直在尝试使用它,似乎没有任何工作(没有发生任何事情,一切都保持不变) 我非常感谢任何人的帮助,我

我目前正在使用Slick渲染游戏中的自定义聊天

我想做的是,我想为聊天创建一个自定义的“淡入淡出”效果,它从右到左平滑地淡入淡出。我不太擅长在文本中解释事情,所以我将展示一个我想要的例子

例如:

我想呈现文本
bernhardkiv:helloworld,运行我的常规字体渲染器,结果如下:

我想做的是,顺利地将文本切掉,如下所示

我不知道该怎么做!我相信这是可能的使用glScissoring,但我一直在尝试使用它,似乎没有任何工作(没有发生任何事情,一切都保持不变)


我非常感谢任何人的帮助,我基本上希望能够,而不是在x,y处渲染,我希望能够在x,y处使用宽度字符串\u宽度-平滑\u剪切进行渲染,以便能够产生一点褪色效果。

免责声明:

  • 这对我来说是一个新领域,但由于似乎没有其他人回答,我将尝试一下,因为这个问题对我来说似乎有点有趣。我还没有完全测试这些代码修改,所以可能有我不知道的bug/副作用。使用风险自担。:-)

  • Slick2D库中的
    org.newdawn.slick.Font
    实现类(和支持类)似乎不支持扩展(私有成员和方法)。据我所知,为了达到预期的效果,需要对其中一些内部类进行更改。(另一种方法是复制整个类和包。)根据提问者的评论,我的理解是,Slick2D源代码包含在提问者的项目中,因此在这种情况下,对内部Slick2D类进行更改应该是可行的

  • 可以说,上述类之所以不具有扩展友好性是有原因的,可能有更好的方法来进行必要的更改以使它们具有可扩展性。如果给我一个实际的项目和更多的时间,我甚至可能会改变自己的做法然而,这个答案的目的是向提问者展示我是如何通过对内部Slick2D类进行最小的代码更改来达到预期效果的本质。提问者可以自行决定如何将这些更改应用到他/她的项目中

  • 此代码使用Slick build 237


    您可以在此处看到完整的代码更改。下面我只显示与实现所需淡入淡出效果最相关的代码更改

    将每个角色想象为绘制在一个GL_四边形中,四个角各有一个RGBA值(如图中所述):

    我们要做的是保持左上角和左下角颜色不变,并将右上角和右下角颜色更改为alpha为0(透明)。OpenGL将逐渐淡化我们的透明度。为此,我们扩展了
    org.newdawn.slick.Image
    以使用以下方法创建
    FadableImage
    (与
    Image
    Drumembedded
    方法非常相似,但不覆盖它):

    因此,我们的想法是,渲染的最后一个字符将是endIndex-1处的字符。淡入宽度百分比是将在endIndex-1处绘制的包含字符的四边形的宽度百分比。因此,您可以使用该参数来微调所需的效果(
    0.0f
    1.0f
    )。将淡入度宽度百分比设置为
    0.5f
    ,将绘制四边形总宽度的50%。淡入度将达到50%的宽度:

     (x,x,x,1)       (x,x,x,0)
    
         ------------|------------
         |           |            |
         | drawn     | not        |
         |           |  drawn     |
         |           |            |
         |           |            |
         |           |            |
         ------------|------------
    
      (x,x,x,1)      (x,x,x,0)
    

    现在让我们用以下代码测试它:

    import java.awt.Font;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import org.newdawn.slick.AppGameContainer;
    import org.newdawn.slick.BasicGame;
    import org.newdawn.slick.Color;
    import org.newdawn.slick.GameContainer;
    import org.newdawn.slick.Graphics;
    import org.newdawn.slick.SlickException;
    import org.newdawn.slick.UnicodeFont;
    import org.newdawn.slick.font.effects.ColorEffect;
    
    public class TextFadeTest extends BasicGame {
    
        private final int Y_OFFSET = 50;
        private final org.newdawn.slick.Color bgColor =  new org.newdawn.slick.Color(126, 166, 240);
    
        private UnicodeFont unicodeFont;
    
        public TextFadeTest(String gamename) {
            super(gamename);
        }
    
        @Override
        public void init(GameContainer gc) throws SlickException {
            gc.setShowFPS(false);
            gc.getGraphics().setBackground(bgColor);
    
            Font awtFont = new Font(Font.SERIF, Font.PLAIN, 36);
            unicodeFont = new UnicodeFont(awtFont);
            unicodeFont.getEffects().add(new ColorEffect(java.awt.Color.WHITE));
            unicodeFont.addAsciiGlyphs();
            unicodeFont.loadGlyphs();
        }
    
        @Override
        public void update(GameContainer gc, int i) throws SlickException {}
    
        @Override
        public void render(GameContainer gc, Graphics g) throws SlickException {
    
            String str = "bernhardkiv: hello world!";
            int y = 0;
            unicodeFont.drawString(10, y, str);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, Color.white, 0, 22);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.10f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.25f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.50f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.75f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.90f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 1.0f);
    
        }
    
        public static void main(String[] args) {
            try {
                AppGameContainer appgc;
                appgc = new AppGameContainer(new TextFadeTest("TextFadeTest"));
                appgc.setDisplayMode(640, 480, false);
                appgc.start();
            }
            catch(SlickException ex) {
                Logger.getLogger(TextFadeTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
    }
    
    结果如下:


    您能展示一些您迄今为止尝试过的代码示例吗?@dbank我已经搜索了好几个小时,但我还没有找到任何关于我可以尝试什么的信息。当您说“我的常规字体渲染器”时。。。您是否正在使用一些
    org.newdawn.slick.Font
    的实现,例如
    org.newdawn.slick.TrueTypeFont
    ?或者你使用的是你自己定制的东西吗?当你说“字符串宽度-平滑剪切”时,你能详细说明你的意图吗?以及您希望渲染的“最后一个字符图示符的部分”是什么?在本例中,看起来您显示了大约一半的“r”。我使用的是UnicodeFont,是的,我的意思是我想渲染1/2,然后1/4,然后1/5,当然是像素。嘿!我现在不在城里,所以我无法测试这个,但从结果来看,这正是我需要的!非常感谢,德班克先生!没问题!我希望有帮助!
    public void drawString(float x, float y, String text, int endIndex, float fadePercentWidth) {
        drawDisplayList(x, y, text, Color.white, 0, endIndex, fadePercentWidth);
    }
    
     (x,x,x,1)       (x,x,x,0)
    
         ------------|------------
         |           |            |
         | drawn     | not        |
         |           |  drawn     |
         |           |            |
         |           |            |
         |           |            |
         ------------|------------
    
      (x,x,x,1)      (x,x,x,0)
    
    import java.awt.Font;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import org.newdawn.slick.AppGameContainer;
    import org.newdawn.slick.BasicGame;
    import org.newdawn.slick.Color;
    import org.newdawn.slick.GameContainer;
    import org.newdawn.slick.Graphics;
    import org.newdawn.slick.SlickException;
    import org.newdawn.slick.UnicodeFont;
    import org.newdawn.slick.font.effects.ColorEffect;
    
    public class TextFadeTest extends BasicGame {
    
        private final int Y_OFFSET = 50;
        private final org.newdawn.slick.Color bgColor =  new org.newdawn.slick.Color(126, 166, 240);
    
        private UnicodeFont unicodeFont;
    
        public TextFadeTest(String gamename) {
            super(gamename);
        }
    
        @Override
        public void init(GameContainer gc) throws SlickException {
            gc.setShowFPS(false);
            gc.getGraphics().setBackground(bgColor);
    
            Font awtFont = new Font(Font.SERIF, Font.PLAIN, 36);
            unicodeFont = new UnicodeFont(awtFont);
            unicodeFont.getEffects().add(new ColorEffect(java.awt.Color.WHITE));
            unicodeFont.addAsciiGlyphs();
            unicodeFont.loadGlyphs();
        }
    
        @Override
        public void update(GameContainer gc, int i) throws SlickException {}
    
        @Override
        public void render(GameContainer gc, Graphics g) throws SlickException {
    
            String str = "bernhardkiv: hello world!";
            int y = 0;
            unicodeFont.drawString(10, y, str);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, Color.white, 0, 22);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.10f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.25f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.50f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.75f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 0.90f);
            unicodeFont.drawString(10, y+=Y_OFFSET, str, 22, 1.0f);
    
        }
    
        public static void main(String[] args) {
            try {
                AppGameContainer appgc;
                appgc = new AppGameContainer(new TextFadeTest("TextFadeTest"));
                appgc.setDisplayMode(640, 480, false);
                appgc.start();
            }
            catch(SlickException ex) {
                Logger.getLogger(TextFadeTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
    }