2014-10-05 2 views
1

Я все еще изучаю Java, если кто-то может мне помочь, я буду очень счастлив!Как остановить авто-перерисовку() при изменении размера Jframe

Извините за плохой английский, я испанский! Я делаю игру с черепицей, в игре используется классический «игровой цикл», который закрывает двигатель со скоростью 60 кадров в секунду. Задержка цикла, а затем переадресация вызова(); Это прекрасно работает! Но ..

Проблема в том, что событие перерисовывания вызывается, когда размер JFrame изменяется или увеличивается! Например, когда JFrame максимизирован/изменен размер, рендеринг игры со скоростью 10000 кадров в секунду, но когда они не выполняются, игра отображается с установленной мной скоростью, поэтому есть способ отключить автоматическую перерисовку и заставить ее работать ТОЛЬКО, когда «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.... 
+0

, пожалуйста, добавьте код, который очень сложно помочь вам только с описанием. –

+0

Итак, вы хотите изменить размер окна без вызова repaint()? – DreadHeadedDeveloper

+0

да, это именно то, что я хочу, я хочу, чтобы игра работала со скоростью 60 кадров в секунду, но когда я изменяю размер, функция repaint() называется для запуска игры со скоростью 1000 кадров в секунду, например –

ответ

4

так, когда JFrame не развернуто

Я не знаю, почему это может вызвать проблемы, так как только один запрос перекрашивать должен быть сформирован.

или (изменение размера)

Я могу видеть это является проблемой, так как перекрашивание будет вызываться для каждого пикселя при изменении размера кадра с помощью. В этом случае, возможно, вы можете использовать:

Toolkit.getDefaultToolkit().setDynamicLayout(false); 

Теперь компоненты будут проверены после завершения изменения размера.

это.setBackground (новый цвет (210,247,255));

Не используйте код, как указано выше, так как смена фона вызывает вызов repaint(), который снова вызовет метод paintComponent(). Методы живописи предназначены только для рисования.

+0

, в каком месте я должен добавить этот код: Toolkit.getDefaultToolkit(). SetDynamicLayout (false); в начале или в перекраске? –

+0

@LesterMurillo, почему вы хотите постоянно устанавливать это свойство? – camickr

+0

игровая логика и рендеринг работают с установленным fps (60), изменение размера/максимизации вызывает это чаще, вызывая перекрытие/больше fps, поэтому игровая графика получает асинхронную логику, делая мерцание, если вы не просите об этом, тогда я понимаю плохо, (Я испанский) –

2

"Как остановить автоматическую перерисовку() при изменении размера 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 и только использования, что состояние рисовать. Что-то вроде

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); 
} 
+0

Спасибо, дело в том, что когда пользователь изменяет размер Jframe , Jframe меняет свой размер, но игра была почти такой же (без изменений), но спасибо за помощь, я постараюсь сделать игру BuferredImage и нарисовать изображение, поэтому игра будет обновляться Только тогда, когда я хочу c: но все еще спасибо за игру –

+0

+1 для НЕ изменяющегося состояния в методе рисования. – camickr

+0

Ye, но я не изменяю состояние метода рисования, проблема в том, что repaint вызывается из моего контроля, java должен иметь способ отключить autodraw: ( –

Смежные вопросы