如何创建重叠的背景和前景图像?

2024-04-07

通过使用Java swing,有哪些可用的方法来创建前景图像(例如knight)哪个可以在静态背景图像上移动?

我们可以使用JLabel与图像图标?


该解决方案还解决了以下提到的问题:JFrame 中的图像相互覆盖,而不是相互显示两个图像 https://stackoverflow.com/questions/35710453/images-in-jframe-are-overwriting-each-other-not-displaying-both-images-over-each?noredirect=1#comment59099957_35710453


如果我们尝试添加背景和一些前景图像,如果我们打算让这些图像相互重叠,可能会有点棘手,因为 Java 提供的许多布局可能会阻止组件(例如 JLabels)相互重叠。将图像定位到准确位置也可能是一个问题。

当我们想要创建类似于我们在游戏中看到的屏幕时,我会建议采用不同的方法:

替代方法是直接在面板上绘制,而不是创建多个填充 imageIcon 的 JLabel。这是一个定制面板,其中包含我们有兴趣绘制的图像实例。

class DrawingSpace extends JPanel
{
    private BufferedImage bg, hero;
    private int bgWidth, bgHeight;
    private int heroWidth, heroHeight;  
    private int scWidth, scHeight;
    private int mouseX, mouseY;

    public DrawingSpace(){      
        loadImages();
        init();     
        setPreferredSize(new Dimension(scWidth, scHeight));     
        addMouseMotionListener(new MouseHandler());     
    }

    private void init(){
        mouseX = 0;
        mouseY = 0;
        heroWidth = hero.getWidth();
        heroHeight = hero.getHeight();      
        bgWidth = bg.getWidth();
        bgHeight = bg.getHeight();      
        scWidth = bgWidth;
        scHeight = bgHeight;        
    }

    private void loadImages(){
        try{
            bg = ImageIO.read(getClass().getResource("Images/background.jpg"));
            hero = ImageIO.read(getClass().getResource("Images/knight.png"));
        }catch(IOException ioe){System.out.println("Unable to open file");}
    }

    @Override public void paintComponent(Graphics g){
        super.paintComponent(g);        
        g.drawImage(bg, 0, 0, bgWidth, bgHeight, null);
        g.drawImage(hero, mouseX-(heroWidth/2), mouseY-(heroHeight/2), heroWidth, heroHeight, null);        
    }

    private class MouseHandler implements MouseMotionListener
    {
        @Override public void mouseMoved(MouseEvent e){
            mouseX = e.getX();
            mouseY = e.getY();
            repaint();
        }
        @Override public void mouseDragged(MouseEvent e){}  
    }
}

驱动代码的运行器类:

class KnightRunner
{   
    public static void main(String[] args){

        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                JFrame frame = new JFrame("Knight Runner");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
                frame.add(new DrawingSpace());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);             
            }
        });
    }       
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建重叠的背景和前景图像? 的相关文章

随机推荐

  • 如何在 Objective-C 中对 URL 进行编码或解码

    有没有类似的东西 NSString URLencode NSString someString NSString URLdecode NSString someString 如果可以 如何实施 请注意投反对票的人 这不是一个简单的问题 我需
  • Code-golf:将乘法表输出到控制台

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我最近向一位从事工作经验的学生推荐了一篇有关将乘法表转储到控制台的文章 它使用嵌套的 for
  • 雅虎财经历史数据下载网址无效

    我使用以下网址从雅虎财经获取历史数据 从 2017 年 5 月 16 日起 该网址已失效 好像他们已经更改了网址 新网址是 在上面更改的 URL 中有一个会话 cookie 它是碎屑 有什么想法如何以编程方式获取此cookie 在JAVA中
  • 无法通过api在材质表react中获取数据

    我正在尝试通过 Material React 表中的 api 获取数据 但它向我显示错误 如下所示 无效的挂钩调用 钩子只能在函数组件的主体内部调用 发生这种情况可能是由于以下原因之一 1 您的React和渲染器版本可能不匹配 例如Reac
  • 文本框文本在文本输入时消失

    基本上我有一个创建的用户窗体 我想知道是否可以添加用户窗体加载时存在的灰色文本 但一旦用户开始在文本框中输入文本 该文本就会消失 图片已过期 一旦用户开始输入 字体颜色应更改为黑色 任何帮助 将不胜感激 像这样的东西吗 Private Su
  • Kotlin Foo::class.java“未解析的参考:Java”错误

    我正在尝试将我的 Java 代码转换为HomePage class到科特林 我正在按照以下说明进行操作Kotlin org https kotlinlang org docs reference java interop html 获取类
  • SetCursorPos 无法通过远程桌面工作(从 WM_INPUT 事件读取)

    当读取鼠标位置时WM INPUT事件 并且鼠标光标被隐藏 看起来SetCursorPos通过远程桌面使用该应用程序时不起作用 当应用程序不通过远程桌面使用时 相同的代码可以正常工作 即我可以在所有方向上进行无限的鼠标移动 因为SetCurs
  • 如何使用 Bot Framework 在 Teams 中添加提及以及自适应卡

    我正在尝试发送带有自适应卡片附件的活动 并提及创建该帖子的用户 通过在线阅读 我发现您目前无法在自适应卡片中包含提及内容 有没有办法在发送活动时提及某人 例如在另一个附件中 我尝试设置activity Text 提及 这有效 但是它创建了两
  • Google Geocharts:同一地图上的区域和标记?

    我正在尝试使用谷歌地理图表 https google developers appspot com chart interactive docs gallery geochart 我有州数据和城市数据 我想在城市数据上显示它们 这意味着我想
  • 如何获取两个 git 分支之间不同提交的列表?

    我想查看两个分支之间仅非常见提交的列表 我怎样才能得到这样的输出 基本上是一个git diff y master new feature两个分支之间的总结 master new feature xxx Jan 1st 2018 initia
  • 呼叫其他代码呆子 - 嵌套循环的替代方案?

    对于我 或可能其他人 来说 拥有一个需要迭代的对象列表 然后与属性列表进行交互的情况并不罕见 我使用嵌套循环 如下所示 IList
  • 解析一个小端二进制文件,填充到一个矩阵中

    我有一个包含 X X 矩阵的二进制文件 文件本身是一个单精度浮点数 小端 序列 我想做的就是解析它 并将其填充到一些合理的 clojure 矩阵数据类型中 谢谢这个问题 https stackoverflow com questions 7
  • C 中允许负数组索引吗?

    我刚刚读了一些代码 发现这个人正在使用arr 2 访问之前的第二个元素arr 像这样 a b c d e f g arr 0 arr 1 arr 2 这是允许的吗 我知道arr x 是相同的 arr x So arr 2 is arr 2
  • 如何执行脚本从nodejs设置iterm2徽章?

    我从 Iterm2 官方网站获得这个 bash 脚本 printf e 1337 SetBadgeFormat s a echo text base64 我尝试像下面这样执行 没有错误 但无法设置 iterm2 Badge var exec
  • 使用与 Python 2 一起运行的 Pylint 检查 Python 3 源代码

    Pylint 的一些检查取决于检查的源代码是 Python 2 还是 Python 3 例如 请参阅如何避免 Python 3 中继承类的构造函数出现 Pylint 警告 https stackoverflow com questions
  • 是否可以将多个通道复用为一个通道?

    这个想法是在切片中拥有可变数量的通道 将通过它们接收到的每个值推送到单个通道中 并在最后一个输入通道关闭后关闭该输出通道 类似这样 但对于两个以上的通道数 func multiplex cin1 cin2 cout chan int n 2
  • grep 正则表达式 空白行为

    我有一个文本文件 其中包含以下内容 12 34 EUR 5 67 EUR EUR 之前有一个空格 我忽略了 0 XX EUR 我试过 grep 1 9 0 9 0 9 2 sEUR gt didn t match grep 1 9 0 9
  • 为什么 LinearSVC 不能做这个简单的分类?

    我正在尝试使用以下简单分类LinearSVC对象在scikit learn 我尝试过使用 0 10 和 0 14 版本 使用代码 from sklearn svm import LinearSVC SVC from numpy import
  • 检查常量是否为空

    为什么这是不可能的 if empty MY CONST 但这是 my const MY CONST if empty my const define QUOTA MSG There is currently no message to sh
  • 如何创建重叠的背景和前景图像?

    通过使用Java swing 有哪些可用的方法来创建前景图像 例如knight 哪个可以在静态背景图像上移动 我们可以使用JLabel与图像图标 该解决方案还解决了以下提到的问题 JFrame 中的图像相互覆盖 而不是相互显示两个图像 ht