我还在学习Java,如果有人能帮我,我会很高兴的!
对不起英语不好,我是西班牙人!我正在制作一个瓷砖游戏,游戏使用经典的“游戏循环”,它将引擎限制在60 fine的循环睡眠,然后调用repaint();这很好!但是..。
问题是,当JFrame调整大小或最大化时,就会调用重绘事件!例如,当JFrame最大化/调整大小时,游戏呈现速度为10000 For,但如果没有,游戏呈现将以我设置的速度呈现,因此有一种方法可以禁用自动重绘并使其仅在代码中调用"component.repaint()“时才能工作?
这里的问题不是“游戏循环”,问题是,当调整/最大化渲染游戏时,重新绘制称为自动绘制在更多的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....
发布于 2014-10-04 19:05:10
所以当JFrame没有最大化的时候
我不知道这为什么会导致问题,因为应该只生成一个重绘请求。
或(调整大小)
我可以看到这是一个问题,因为重新绘制将被调用的每一个像素,您调整帧的大小。在这种情况下,您可以使用:
Toolkit.getDefaultToolkit().setDynamicLayout(false);
现在,组件将在调整大小完成后进行验证。
新颜色(210,247,255);
不要使用上面这样的代码,因为更改背景会导致调用repaint(),这将再次调用paintComponent()方法。绘画方法只适用于绘画。
发布于 2014-10-04 19:00:03
“如何在调整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重新绘制,这是而不是在您的控制下,矩形将调整大小,而不需要它。因此,如果您希望矩形只在告诉它时重新绘制,则需要确保只操作 paintComponent
方法外的的状态(即x、y、size),并且只使用该状态进行绘制。有点像
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);
}
https://stackoverflow.com/questions/26199008
复制相似问题