我正在制作一个2D垂直射击游戏,其中一切都是编码(和工作)但图形.我之前没有使用过Graphics类,所以这对我来说都是新手.以下是我用于将所有内容绘制到JFrame的代码:
public void paintAll()
{
Graphics h = new Graphics2D();
for(Bullet j : GameState.getEnBullets()){
h.drawImage(j.getImage(),j.getX(), j.getY(), null);}
for(Enemy j : GameState.getEnemies()){
h.drawImage(j.getImage(),j.getX(), j.getY(), null);}
for(Bullet j : GameState.getPlayBullets()){
h.drawImage(j.getImage(),j.getX(), j.getY(), null);}
this.paint(h);
}
Run Code Online (Sandbox Code Playgroud)
第一行"Graphics h = new Graphics2D();" 产生错误,因为Graphics2d是抽象的,但我不知道从哪里开始.
我需要代码来获取我拥有的所有图像并将它们绘制到JFrame中的点.我提醒你,我以前从未这样做过,所以请告诉我这是否是错误的做法.
我有一个很长的重绘操作,我想限速,即确保它最多每N毫秒调用一次.
我目前的解决方案有点令人不满意:我使用Timer持续时间较短的Swing ,restart()每当我收到一个事件时我都会这样做.这样可确保在N毫秒窗口内发生事件时不会触发重绘(即重绘将在事件发生并且N毫秒"安静"时间段过去后发生).
我想要的是确保在第一个事件后最多N毫秒调用重绘,并且重绘时间最多为N.任何想法?(没有记录调用start已启动的效果Timer).
这是使数字显示的线程:
class CoOrdCounter extends Thread{
public void run(){
try{
while(true){
Thread.sleep(500);
printX = cow.x;
printY = cow.y;
}
}catch(Exception e){}
}
}
//Of course I also have CoOrdCounter co = new CoOrdCounter; co.start();
Run Code Online (Sandbox Code Playgroud)
然后......
g.drawString("Co-ords: ("+printX+","+printY+")",50,100);
它总是显示(0,0),可能是因为int printX = 0, printY = 0;.这意味着变量根本没有改变......为什么?我应该如何做这项工作......?
[PLEASE]我知道我不应该使用paint(),但我是初学者 - 中级所以......
[编辑]现在MadProgrammer提到它,我确实得到了一个EventDispatchThread错误.
[编辑2]我理解使用Timer但@MadProgrammer我如何获得cow.x并cow.y使用您的代码片段?
[编辑3]如果您键入密钥p,KeyListener将启动Thread Slider,thread.的实例.
[UPDATE CLASS 2(真实的)]
import javax.swing.*;
import …Run Code Online (Sandbox Code Playgroud) 我正在使用eclipse平台和window builder pro.我已经创建了新项目(窗口构建器 - > swing designer - > application window); 现在我希望我的应用程序显示一些2D动画(例如移动的矩形),而不会闪烁屏幕.最好的方法是什么?现在我的代码中只有这些方法:MainWindow()构造函数,initialize()和main(String [] args)
我已经阅读了一些关于显示2D图形的信息,但它们都使用不同的组件和idk哪种方式是最好的,我并不总是理解它们使用的方法.
所以我目前正在创建一个登录屏幕,它具有使用Graphics对象和"游戏循环"制作的酷炫背景效果.当我添加一个JTextField虽然,它被看到在一切,而不是在上面.无论如何要在图形内部的所有组件下绘制JFrame?
这是图形的图像:

文本字段就在那里,就在绘制到框架表面的所有内容之下.我想以某种方式重新排序,以便它在组件下面绘制.
这是我目前的框架代码:
frame = new JFrame("Login");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.getContentPane().setPreferredSize(new Dimension(450, 200));
frame.getContentPane().setBackground(Color.black);
frame.setBackground(Color.black);
frame.setLayout(new FlowLayout());
JTextField user = new JTextField(20);
user.setLocation(100, 200);
user.setVisible(true);
frame.add(user);
frame.pack();
frame.setVisible(true);
frame.createBufferStrategy(2);
buff = frame.getBufferStrategy();
Painter painter = new Painter();
frame.add(painter);
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?
是的,我知道你可以使用AffineTransformation,但我希望我的剑图像围绕我所制作的角色(图形中绘制的黑色块)旋转360度而不是仅仅一次旋转.基本上我想要像Terraria那样的旋转系统.我知道如何获得角色的x和y所以问题是:我如何围绕我定义的点旋转?我的代码设置如下
f.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
swordSwinging=true;
}
});
Run Code Online (Sandbox Code Playgroud)
...
if(swordSwinging){
//swinging code goes here
}
repaint();
Run Code Online (Sandbox Code Playgroud)