我还在学习Java,如果有人可以帮助我,我会很开心!
抱歉英语不好,我是西班牙人! 我正在制作一个平铺游戏,游戏使用经典的#34;游戏循环"将引擎限制在60fps 循环睡眠然后调用repaint(); 这很好用!但..
问题是在调整JFrame大小或最大化时调用重绘事件! 例如,当JFrame最大化/调整大小时,游戏渲染速度为10000fps,但是当它们没有时,游戏以我设置的速度渲染,因此有一种方法可以禁用自动重绘并使其仅在"组件时工作。重绘()"从我的代码中调用?
这里的问题不是"游戏循环",问题是当重新调整大小/最大化时,重绘会被称为自动渲染游戏更多fps!
public class Handling {
static private int fps=0;
static private int fpsfinal=0;
static int frames = 60;
static int frames_skip = 1000 / frames;
static long ticknext = GetTickCount();
static long ticksleep = 0;
public static void Run() {
for(;;){
Main.getDevice().repaint();
fps++;
ticknext += frames_skip;
ticksleep = ticknext - GetTickCount();
if(ticksleep >= 0) {
try {
Thread.sleep(ticksleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static long GetTickCount(){
return System.currentTimeMillis();
}
public static int GetFPS(){
fpsfinal=fps;
fps=0;
return fpsfinal-2;
}
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.ImageObserver;
import javax.swing.*;
public class Game extends JPanel{
private static final long serialVersionUID = 1L;
static boolean dir=true;
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
int layout=Main.layout;
Graphics2D g2d = (Graphics2D) g;
g.setFont(Resources.GetFont(0));
Camera.UpdateCameraAxis();
Camera.DoCamera();
Cursor.MouseLoop();
if (layout==0){
this.setBackground(new Color(210,247,255));
for(int xx=Math.max( etc....
答案 0 :(得分:4)
所以当JFrame没有最大化时
我不知道为什么这会导致问题,因为只应生成一个重绘请求。
或(调整大小)
我可以看到这是一个问题,因为重新调整帧的每个像素都会调用重绘。在这种情况下,您可以使用:
Toolkit.getDefaultToolkit().setDynamicLayout(false);
现在,在调整大小完成后,组件将得到验证。
this.setBackground(new Color(210,247,255));
不要使用上面的代码,因为更改背景会导致调用repaint(),这将再次调用paintComponent()方法。绘画方法仅用于绘画。
答案 1 :(得分:3)
"当我调整Jframe的大小时,如何停止自动重绘(#);
简短回答,你不控制它。更长的答案,您需要确保在paintComponent
方法中没有做任何改变状态(您正在使用绘画)的事情。例如:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Random random = new Random();
int x = random.nextInt(100);
int y = random.nextInt(100);
int size = random.nextInt(100);
g.drawRect(x, y, size, size);
}
这里发生的是每次GUI重新绘制,在你的控制下不时,矩形将调整大小,而不需要它。因此,如果您希望矩形仅在您告诉它时重新绘制,您需要确保仅从外部操纵状态(即x,y,大小) paintComponent
方法,仅使用该状态绘制。像
Random random = new Random();
int x, y, size;
...
void reset() {
x = random.nextInt(100);
y = random.nextInt(100);
size = random.nextInt(100);
}
...
Timer timer = new Timer(25, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
reset();
repaint();
}
}).start();
...
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(x, y, size, size);
}