有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何防止Java图形中的闪烁?

    package local.ryan.grid;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Game implements Runnable, KeyListener {
    
    public boolean isRunning = false;
    
    private long lastTime;
    private double fps;
    public int gamestage = 0;
    
    public int width = 300, height = 300;
    public String title = "Le Go!";
    
    public JFrame frame = new Frame(2, width, height, title);
    
    public int x = 0, y = 0, velX = 0, velY = 0;
    
    public static void main(String[] args) throws InterruptedException {

        Thread game = new Thread(new Game());
        game.start();
        
    }
    
    public void run() {
        
        frame.addKeyListener(this);
        frame.setFocusable(true);
        frame.setFocusTraversalKeysEnabled(false);
        start();
        
        while(isRunning) {
            
            lastTime = System.nanoTime();
            
            try {
                
                // Limit Each Frame, to 60 fps.
                // Prevents performance issues with multiple objects.
                
            Thread.sleep(1000 / 60); // 1000 miliseconds (1 second) / 60 frames-per-second ~ 17 ms.
            
            
            
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            render(frame.getGraphics());
            
            fps = 1000000000D / (System.nanoTime() - lastTime); //one second(nano) divided by amount of time it takes for one frame to finish
            lastTime = System.nanoTime();
            
            // Change to integer, to remove decimals.
            System.out.println("FPS: " + (int) fps + ".");
            
        }
        
    }
    
    public void render(Graphics c) {   
        
        c.clearRect(0, 0, width, height);
        Graphics2D g = (Graphics2D)c;
       
        g.setColor(Color.RED);
        g.fillRect(x, y, 30, 60);
        
        g.dispose();
        
    }  
    
    public void start() {
        
        if(isRunning)
            return;
        
        isRunning = true;
        
        
    }
    
    public void stop() {
        
        if(!isRunning)
            return;
        
        isRunning = false;
        
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        
        if(e.getKeyCode() == KeyEvent.VK_D) {
            
            velX += 1;
            actionPerformed();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            
        }
        
        
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    public void actionPerformed() {
        
        x = x + velX;
        y = y + velY;
        render(frame.getGraphics());
        
    }
    
}

我该如何防止在渲染中闪烁,除了闪烁时的恼人之外,所有这些都可以正常工作。我想我可以添加一个if语句,检查VelX或VelY是否不等于0,但当我移动正方形时,它会闪烁


共 (1) 个答案

  1. # 1 楼答案

    这可能有几个原因,但看看你的代码,现在的原因是因为它不是双缓冲的。当图形被双缓冲时,计算机将绘制到一个虚拟屏幕,然后将该屏幕与显示的屏幕切换,以防止闪烁

    这样做可以实现双重缓冲:

    private void render(Graphics g) 
    {
       BufferedImage bufferedImage = new BufferedImage(500, 500, BufferedImage.TYPE_ARGB);
       Graphics2D g2d = bufferedImage.createGraphics();
       //paint using g2d ...
    
       Graphics2D g2dComponent = (Graphics2D) g;
       g2dComponent.drawImage(bufferedImage, null, 0, 0);  
    

    }

    关于更多信息,我相信Java文档中有一些很好的教程