我目前正在研究Java2D中基于磁贴的游戏,我正在考虑添加一些便宜的眼睛糖果.
例如,实现一个简单的粒子系统(可能像这样对于爆炸和/或烟雾).
您是否有任何关于相对容易编程的效果的建议,这些效果不需要大量(或根本)绘制新艺术?
这些效果的教程和代码示例也是最受欢迎的!
-我做.
PS - 如果绝对必要,我可以切换到像LWJGL/JOGL甚至是Slick这样的东西 - 但我宁愿继续使用Java2D.
我想知道如何实现矩形的简单2D碰撞检测是一个好主意,如下所示:
Collision col = new Rectangle();< - 我应该这样做还是应该避免的事情?我知道我'可以',但我应该吗?contains()和intersects()方法; 我应该这样做,还是应该为Java中的2D碰撞检测做些什么?你好我是affineTransformjava 新手.我想用它来剪切一些我以后要使用的GUI.现在我只想测试一个示例代码,但我无法解释它的输出.这是代码
package main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainClass{
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
jf.getContentPane().add(new MyCanvas());
jf.setSize(600, 600);
jf.setVisible(true);
}
}
class Left extends JPanel {
Left(){
setPreferredSize(new Dimension(450,450));
setBorder(BorderFactory.createLineBorder(Color.green));
setBackground(Color.gray);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
AffineTransform at = new AffineTransform();
g2.setTransform(at);
g2.drawRect(getWidth()/2 - 10, getHeight()/2 - 10, 20, …Run Code Online (Sandbox Code Playgroud) 码
import javax.swing.*;
import java.awt.*;
class tester {
public static void main(String args[]) {
JFrame fr = new JFrame();
JPanel p = new JPanel();
p.setBackground(Color.RED);
p.paintImmediately(20,20,500,500);
fr.add(p);
fr.setVisible(true);
fr.setSize(2000,2000);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个完全是红色的面板.为什么我不接线?我怎么才能得到它?
在我的应用程序中,我需要像Photoshop那样绘制网格线 - 例如,用户可以在文档上拖动线条以帮助他对齐图层.现在,问题在于我能够绘制这样的线条(它只是简单的使用Line2D的简单Java2D绘画),但是我无法将这些线条放在其他所有内容之上,因为当子组件绘制自己时,我的网格线被删除了.
程序结构是这样的:JFrame - > JPanel - > JScrollPane - > JPanel - > [很多其他JPanels,就像层一样]
作为测试,我将绘制代码添加到JFrame,它正确显示我的Line2D实例在其他所有内容之上.但是,当我在子组件中执行任何需要该子项重新绘制的内容时,JFrame中绘制的线将被删除.
我知道这是预期的Swing行为 - 也就是说,它只会重绘那些已经改变的区域.但是,我正在寻找一些方法,不断在其他所有方面绘制线网格线.
我能够让它工作的唯一方法是使用一个Swing Timer,它每隔10ms在我的根组件上调用repaint(),但它消耗了大量的CPU.
更新
示例的工作代码如下.请注意,在我的实际应用程序中,我有许多可以触发重绘()的不同组件,并且没有一个组件引用了执行网格线绘制的组件(当然我可以将它传递给每个人,但是成为最新的选择)
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridTest extends JFrame {
public static void main(String[] args) {
new GridTest().run();
}
private void run() {
setLayout(null);
setPreferredSize(new Dimension(200, 200));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel p = new JPanel();
p.setBounds(20, 20, 100, 100); …Run Code Online (Sandbox Code Playgroud) 为什么我的JComponent没有显示在背景JFrame之上?
请检查以下代码:
class CounterFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private MyPanel myComponent = new MyPanel();
private JLabel contentPane = new JLabel(new ImageIcon(getClass()
.getResource("background/2.jpg")));
CounterFrame() {
contentPane.setLayout(new GridBagLayout());
setContentPane(contentPane);
add(myComponent);
}
}
class MyPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private Font myFont;
private String target;
private String raised = "200000";
private Image background;
public MyPanel() {
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D …Run Code Online (Sandbox Code Playgroud) 我似乎无法解决这里的问题.
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GamePanel extends JPanel implements Runnable, MouseMotionListener {
private static final int SCREEN_WIDTH = 640;
private static final int SCREEN_HEIGHT = 480;
private static final int INDENT = 20;
private int playerOneScore = 0;
private int playerTwoScore = 0;
private ImageEntity playerOne = new ImageEntity("Images/bouncer.bmp");
private ImageEntity playerTwo = new ImageEntity("Images/bouncer.bmp");
private int mouseX = 0;
private int …Run Code Online (Sandbox Code Playgroud) 我正在开发一个在地图上显示GPS轨迹的应用程序.我想把轨道画成任意厚度的彩色路径.我找到了GeneralPath似乎正在做我想要的课程.但是,我希望彩色路径也有黑色边框.我找不到任何关于如何在路径上添加边框的内容,因此我想出了一个快速的黑色解决方案,首先绘制一条粗黑色路径,然后在顶部绘制一条细彩色路径.
SSCCE:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.GeneralPath;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PathBorder {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
PathBorder window = new PathBorder();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public PathBorder() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel …Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制线条JPanel,我已经打了一些墙.我可以让双方失望但是一旦从x线中减去它就会出错.

package GUIstuff;
import java.awt.Graphics;
import javax.swing.JPanel;
public class DrawPanel extends JPanel{
public void paintComponent (Graphics g){
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
int drawCounter = 0; // counters for all the while statements
int drawCounter2 = 0;
int drawCounter3 = 0;
int drawCounter4 = 0;
int x1 = 0; // cords change with the while statemetns
int x2 = 0;
int y1 = 0;
int y2 = 0;
while (drawCounter <= 15){ // counter …Run Code Online (Sandbox Code Playgroud) 嗨伙计们,我正在用java制作游戏,它每秒刷新自己60次.每次执行循环时我都会使用g2d来绘制图像和字符串.如果我这样做g2d.setFont(new Font("Arial", Font.PLAIN, 8));
并且拉绳并且这将是正常的,但是如果我将字体设置为某些"不熟悉的"字体并执行相同的操作,那么在启动的第一秒中摆动将显示白色屏幕,然后正确地绘制所有内容,它显然太慢了.(2秒)
我在jframe中放了一个jpanel并覆盖jpanel的paint()方法来绘制我需要的所有东西.我已经SwingUtilities.invokeLater在我的代码中使用了.
import javax.swing.*;
import java.awt.*;
public class Window extends JFrame{
public Window(){
add(new Board());
setSize(800,600);
setVisible(true);
}
public static void main(String[] args){
new Window();
}
private class Board extends JPanel {
Font font = new Font("Bitmap", Font.PLAIN, 64);
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setFont(font);
g2d.drawString("This is slow", 220,200);
Toolkit.getDefaultToolkit().sync();
g2d.dispose();
g.dispose();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不是一个循环,但它非常滞后.
http://fontsov.com/download-fonts/bitmap1159.html
这是可爱的字体,会减慢我们的应用程序."Arial"的速度非常快.怎么能让这个不那么迟钝?