亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

drawImage() 拒絕繪制在方法外部實例化的圖像

drawImage() 拒絕繪制在方法外部實例化的圖像

qq_遁去的一_1 2022-12-15 16:44:00
我目前正在嘗試將圖像打印到屏幕上以準備創建游戲。我可以自己顯示圖像,但前提是圖像在paintComponents()類中實例化。我,當然,不想每一幀都重新實例化整個板,但似乎無法讓它工作。我將如何做到這一點?我試圖在類范圍內聲明一個圖像并在類的構造函數中實例化它。但是,一旦我嘗試打電話drawImage(),圖像就拒絕顯示。一旦我將它實例化,這個問題就消失了printComponents()。我曾嘗試(輕微地)使用 JLabel 和 JIcon,但運氣不佳。特別是因為我不能將 drawImage 與 JLabel 一起使用。這是行不通的:public class Skeleton extends JPanel{    BufferedImage img = null;    public Skeleton()    {        try{            img = ImageIO.read(new File(myFile.png));        } catch (IOException e){            System.out.println("Loading failed.");        }        while(true)        {            repaint();        }    }    public paintComponents(Graphics g)    {        g.drawImage(img, 50, 50, null);    }   }這確實有效:public class Skeleton extends JPanel{    public Skeleton()    {        while(true)        {            repaint();        }    }    public paintComponents(Graphics g)    {        BufferedImage img = null;        try{            img = ImageIO.read(new File(myFile.png));        } catch (IOException e){            System.out.println("Loading failed.");        }        g.drawImage(img, 50, 50, null);    }   }我想最終創建一個包含預加載圖像的 Tile 對象的雙數組,就像myFile.png我可以調用打印的那樣g.drawImage(tiles[1][1].getTexture(), 50, 50, null);加載我的文件是有效的,因為我從不拋出異常并且代碼在paintComponents. 我錯過了什么?
查看完整描述

1 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

好吧,我會做兩件不同的事情:首先,我測試了兩個版本,但都對我不起作用。我想這可能是由您在構造函數中創建的無限循環引起的,因為它永遠不會退出。


除此之外,您的 paintMethod 似乎有錯誤(實際上應該是繪制并覆蓋 JPanel 中的 super 方法),您需要對更新進行更改。我建議您看一下“Game-Loops”,盡管它也可以為每個實例使用單獨的線程,但我建議不要這樣做。我更正了您的代碼,以便您可以查看它:具有單獨線程的第一個版本:


package stackoverflowtests;


import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;


import javax.imageio.ImageIO;

import javax.swing.JPanel;


public class Skeleton extends JPanel implements Runnable {


    private BufferedImage img = null;


    public Skeleton() {

        setSize(1000, 500);

        try {

            img = ImageIO.read(new File("index.jpg"));

        } catch (IOException e) {

            System.out.println("Loading failed.");

        }

    }


    public void paint(Graphics g) {

        g.drawImage(img, 50, 50, null);

    }


    @Override

    public void run() {

        while (true) repaint();

    }


}

主要是這樣的:


package stackoverflowtests;


import javax.swing.JFrame;


public class Main extends JFrame {


    public Main() {

        setSize(1280, 720);

        setLocationRelativeTo(null);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Skeleton skeli = new Skeleton();

        skeli.setLocation(0, 0);

        skeli.setSize(1000, 500);

        add(skeli);

        new Thread(skeli).start();

        setVisible(true);

    }


    public static void main(String[] args) {

        Main main = new Main();


    }

}

游戲循環的可能性 2:


package stackoverflowtests;


import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;


import javax.imageio.ImageIO;

import javax.swing.JPanel;


public class Skeleton extends JPanel {


    private BufferedImage img = null;


    public Skeleton() {

        setSize(1000, 500);

        try {

            img = ImageIO.read(new File("index.jpg"));

        } catch (IOException e) {

            System.out.println("Loading failed.");

        }

    }


    public void paint(Graphics g) {

        g.drawImage(img, 50, 50, null);

    }


}

主要是:


package stackoverflowtests;


import javax.swing.JFrame;


public class Main extends JFrame {


    public Main() {

        setSize(1280, 720);

        setLocationRelativeTo(null);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Skeleton skeli = new Skeleton();

        skeli.setLocation(0, 0);

        skeli.setSize(1000, 500);

        add(skeli);

        setVisible(true);

    }


    public static void main(String[] args) {

        Main main = new Main();


        // Gameloop

        long lastTime = System.nanoTime();

        double amountOfTicks = 60.0;

        double ns = 1000000000 / amountOfTicks;

        double delta = 0;

        long timer = System.currentTimeMillis();

        int frames = 0;

        while (true) {

            long now = System.nanoTime();

            delta += (now - lastTime) / ns;

            lastTime = now;

            while (delta >= 1) {

                // updates++;

                delta--;

            }

            System.out.println("repaint");

            main.repaint();

            frames++;

        }

    }

}

您需要問自己的第二件事是,您是否可以為每個實體使用 BufferedImage 對象而不是整個 JPanel ;)


查看完整回答
反對 回復 2022-12-15
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號