java - Java2D:使形状看起来不那么“扁平”
问题描述
我正在为孩子们在线学习英语创造一个幸运之轮。问题是图形看起来非常平坦。我想添加一些深度(之后可能会像绽放或粒子一样)。我试图让它吸引 8-12 岁左右的孩子(这个游戏将在在线课程中与老师一起使用)。背景还行,我比较关心的是轮子的切片。但任何提示都会很好。
这就是我绘制它们的方式(我使用的是彩虹色):
int c = 0;
for (int i = 0; i < this.slices.length; i++) {
switch (c) {
case 0: g2d.setPaint(new Color(148, 0, 211)); break;
case 1: g2d.setPaint(new Color(75, 0, 130)); break;
case 2: g2d.setPaint(new Color(0, 0, 255)); break;
case 3: g2d.setPaint(new Color(0, 255, 0)); break;
case 4: g2d.setPaint(new Color(255, 255, 0)); break;
case 5: g2d.setPaint(new Color(255, 127, 0)); break;
case 6: g2d.setPaint(new Color(255, 0, 0)); break;
}
c++;
if (c > 6) c = 0;
g2d.fill(this.slices[i]);
g2d.setPaint(new Color(0, 0, 0, 80));
g2d.draw(this.slices[i]);
}
我想我可以使用渐变填充让事情看起来更好。我试过了,但我不能让它看起来不错。下面的屏幕截图给出了一个看起来很酷的轮子的想法。
我能做些什么来让轮子更深一点,基本上让它看起来更酷?
解决方案
这是一个非常基本的例子,使用多个相互重叠的绘画效果......
如果我有更多时间玩,我可能会考虑使用 moreRadialGradientPaint
而不是LinearGradientPaint
,但这可能会给你一个起点
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.RadialGradientPaint;
import java.awt.RenderingHints;
import java.awt.geom.Arc2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Slice slice = new Slice(100, 200, 60, 40);
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.translate((getWidth() / 2.0) - slice.getBounds().width,
(getHeight() - slice.getBounds().height) / 2.0);
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON
);
g2d.setRenderingHints(hints);
Color primaryColor = Color.MAGENTA;
Color alphaColor = new Color(primaryColor.getRed(), primaryColor.getGreen(), primaryColor.getBlue(), 0);
Color shadowColor = new Color(0, 0, 0, 128);
g2d.setColor(primaryColor);
g2d.fill(slice);
RadialGradientPaint rgp = new RadialGradientPaint(
new Point2D.Double(slice.getBounds2D().getWidth(), slice.getBounds2D().getHeight() / 2d),
(float)slice.getBounds2D().getHeight() / 2.0f,
new float[] {0.6f, 1.0f},
new Color[] {alphaColor, shadowColor});
g2d.setPaint(rgp);
g2d.fill(slice);
Graphics2D gScale = (Graphics2D) g2d.create();
LinearGradientPaint lgp = new LinearGradientPaint(
new Point2D.Double(0, 0),
new Point2D.Double(slice.getBounds2D().getWidth(), 0),
new float[]{0f, 1f},
new Color[] {shadowColor, alphaColor});
gScale.setPaint(lgp);
gScale.fill(slice);
lgp = new LinearGradientPaint(
new Point2D.Double(slice.getBounds2D().getWidth(), 0),
new Point2D.Double(slice.getBounds2D().getWidth() * 2, 0),
new float[]{0f, 1f},
new Color[] {alphaColor, shadowColor});
gScale.setPaint(lgp);
gScale.fill(slice);
gScale.dispose();
g2d.setPaint(primaryColor.brighter());
g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2d.draw(slice);
g2d.dispose();
}
}
public class Slice extends Path2D.Double {
public Slice(double width, double height, double range, double innerHeight) {
moveTo(0, 0);
append(new Arc2D.Double(0, 0, width, height,
90 - (range / 2.0), range,
Arc2D.OPEN), false);
double sliceWidth = width / 2.0;
double x = (width - sliceWidth) / 2.0;
append(new Arc2D.Double(x, height, sliceWidth, innerHeight,
90 + (range / 2.0), -range,
Arc2D.OPEN), true);
closePath();
}
}
}
推荐阅读
- php - 在具有 PHP 和 nodeJS 依赖项的项目之间集成覆盖率的最合适方法是什么?
- visual-studio-code - 如何强制vscode中的“调试控制台”接受gdb命令?
- c++ - C++ 规则 5 - 自定义析构函数的分段错误
- python - 如何在 Python 中模块化包含“with”的代码
- python - 如何让 Python 上的 OpenCv 播放已经从网络摄像头播放的视频?
- angular - 如何将 GrapesJS 与 Angular 集成?
- angular - 使用angular 9登录后如何在firestore中添加相应的用户数据?
- c++ - 哪个编译器对使用单例 CRTP 的模板参数类型的内联静态成员是正确的?
- spring-boot - Spring Security 是否允许未经身份验证的用户?这段代码有什么问题?
- java - 如何使用常规数组中的键/值在 Java 8 中创建关联数组?