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