我仍在学习Java,如果有人可以帮助我,我将非常高兴!
对不起,英语不好,我是西班牙人!我正在制作一个平铺游戏,该游戏使用了经典的“游戏循环”,该引擎以60fps的速度限制了引擎的速度。循环睡眠,然后调用repaint();。这样很好!但..
问题在于,当调整JFrame的大小或使其最大化时,将调用repaint事件!例如,当JFrame最大化/调整大小时,游戏以10000fps的速度渲染,但当它们没有渲染时,游戏以我设置的速度渲染,因此有一种方法可以禁用“自动重绘”,并使其仅在“ 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....
所以当JFrame没有最大化时
我不知道为什么这会引起问题,因为只应生成一个重画请求。
或(调整大小)
我可以看到这是一个问题,因为将为您调整帧大小的每个像素调用重绘。在这种情况下,您可以使用:
Toolkit.getDefaultToolkit().setDynamicLayout(false);
现在,将在调整大小后验证组件。
this.setBackground(new Color(210,247,255));
不要使用上述代码,因为更改背景会导致调用repaint(),这将再次调用paintComponent()方法。绘画方法仅用于绘画。