【发布时间】:2014-11-29 16:42:29
【问题描述】:
我还在学习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....
【问题讨论】:
-
请添加一些代码,仅通过描述很难帮助您。
-
所以您希望能够在不调用 repaint() 的情况下调整窗口大小?
-
是的,这正是我想要的,我希望游戏以 60 fps 运行,但是当我调整大小时,调用 repaint() 以使游戏以 1000 fps 运行
-
在这种情况下,我必须说您可能使用了错误的语言。 Java 在后端做了很多你无法控制(合法)改变的事情。我会做更多的研究,所以我可以给你一个明确的答案,但我的猜测是,没有办法按照你的要求做......
-
psyche,我可能是错的,检查这个问题,看看它是否有帮助 -- LINK 具体来说,查看第二个答案。我觉得这可能是您需要的。