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

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

if up_key y--
if down_key y++
if left_key x--
if right_key x++

В зависимости от нажатой клавиши изображение снова отображается и позиция мяча обновляется.

Как уменьшить эффект мерцания, чтобы сделать его плавным?

Путь, который я указал в конструкторе файлов, должен быть заменен.

import java.awt.*;
import java.io.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.awt.event.*;

class MyFrame extends Frame implements KeyListener 
{
    BufferedImage img;
    int x=100,y=100;
    public MyFrame()
    {
        super("Box");
        this.setSize(1382,784);
        this.setVisible(true);
        this.addKeyListener(this);
        this.requestFocus();
        this.setResizable(false);
    }
    public void make()
    {
        try{
        img=ImageIO.read(new File("c:/users/udesh_2/desktop/Boundary.jpg"));
        Graphics gfx=img.getGraphics();
        gfx.setColor(Color.black);
        gfx.fillOval(x,y,40,40);
        }
        catch(IOException io){}
    }
    @Override
    public void paint(Graphics g)
    {
        make();
        g.drawImage(img,0,0,getWidth(),getHeight(),null);
    }
    public static void main(String $[])
    {
        MyFrame f=new MyFrame();
        f.make();
        f.repaint();
    }

    public void keyPressed(KeyEvent key)
    {
        boolean found=false;

        if(key.getKeyCode()==KeyEvent.VK_UP)
        {
            found=true;
            y--;
        }
        if(key.getKeyCode()==KeyEvent.VK_DOWN)
        {
            found=true;
            y++;
        }
        if(key.getKeyCode()==KeyEvent.VK_LEFT)
        {
            found=true;
            x--;
        }
        if(key.getKeyCode()==KeyEvent.VK_RIGHT)
        {
            found=true;
            x++;
        }
                    if(found)
        repaint();
    }
    public void keyTyped(KeyEvent key){}
    public void keyReleased(KeyEvent key){}
}
2
Dev Parzival 18 Авг 2019 в 13:15

2 ответа

Лучший ответ

Вы устанавливаете значение переменной img каждый раз, когда вызываете repaint(), что вызывает мерцание. Скорее инициализируйте его один раз в конструкторе. Тогда нет необходимости в дополнительном методе make и в этом случае. Это должно работать:

import java.awt.*;
import java.io.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.awt.event.*;

class MyFrame extends Frame implements KeyListener {

    BufferedImage img;
    int x = 100, y = 100;

    public MyFrame() {
        super("Box");
        this.setSize(480, 480);
        this.setVisible(true);
        this.addKeyListener(this);
        this.requestFocus();
        this.setResizable(false);
        try {
            img = ImageIO.read(new File("c:/users/udesh_2/desktop/Boundary.jpg"));   
        } catch (IOException io) {
            io.printStackTrace();
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        g.setColor(Color.black);
        g.fillOval(x, y, 40, 40);
    }

    public static void main(String $[]) {
        MyFrame f = new MyFrame();
        f.repaint();
    }

    public void keyPressed(KeyEvent key) {
        boolean found = false;

        if (key.getKeyCode() == KeyEvent.VK_UP) {
            found = true;
            y--;
        }
        if (key.getKeyCode() == KeyEvent.VK_DOWN) {
            found = true;
            y++;
        }
        if (key.getKeyCode() == KeyEvent.VK_LEFT) {
            found = true;
            x--;
        }
        if (key.getKeyCode() == KeyEvent.VK_RIGHT) {
            found = true;
            x++;
        }
        if (found) {
            repaint();
        }
    }

    public void keyTyped(KeyEvent key) {
    }

    public void keyReleased(KeyEvent key) {
    }
}
3
Rakibul Islam 18 Авг 2019 в 11:13
import java.awt.*;
import java.io.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.awt.event.*;

class MyFrame extends Frame implements KeyListener {

    BufferedImage img;
    Image _img;
    Graphics gfx;
    int x = 100, y = 100;

    public MyFrame() {
    super("Box");
    this.setSize(1000,780);
    this.setVisible(true);
    this.addKeyListener(this);
    this.requestFocus();
    this.setResizable(false);
    try {
        img = ImageIO.read(new File("c:/users/udesh_2/desktop/Boundary.jpg"));   
    } catch (IOException io) {
        io.printStackTrace();
    }
    _img=createImage(getWidth(),getHeight());
    gfx=_img.getGraphics();

    }

    @Override
    public void paint(Graphics g) {
        if(img!=null){
        gfx.drawImage((Image)img,0,0,getWidth(),getHeight(),this);
        gfx.fillOval(x,y,30,30);

        g.drawImage(_img, 0, 0, getWidth(), getHeight(), this);

        try
        {
            Thread.sleep(70);

        }catch(Exception e){System.out.println(e);}
        }
    }

    public static void main(String $[]) {
        MyFrame f = new MyFrame();
        f.repaint();
    }

    public void keyPressed(KeyEvent key) {
    boolean found = false;

        if (key.getKeyCode() == KeyEvent.VK_UP) {
            found = true;
            y-=2;
        }
        if (key.getKeyCode() == KeyEvent.VK_DOWN) {
            found = true;
            y+=2;
        }
        if (key.getKeyCode() == KeyEvent.VK_LEFT) {
            found = true;
            x-=2;
        }
        if (key.getKeyCode() == KeyEvent.VK_RIGHT) {
            found = true;
            x+=2;
        }
        if (found) {
            repaint();
        }
    }

    public void keyTyped(KeyEvent key) {
    }

    public void keyReleased(KeyEvent key) {
    }
}
1
Udesh Ranjan 18 Авг 2019 в 11:35