将 jLabel 移动到 jPanel 中的不同位置(类似 Pacman 的游戏)

2024-01-10

我正在制作像吃豆人这样的游戏,到目前为止我才刚刚从网格开始。我启动了网格,但我需要弄清楚如何将某些内容移动到网格中的不同位置,以便当用户单击或我的幽灵移动时,它将显示在屏幕上。我怎样才能让它动起来?我尝试了很多不同的方法,但没有一个对我有用。

import java.awt.*;

import javax.swing.*;
import javax.swing.border.BevelBorder;


public class GUI {

public static void main(String[] args) {
    final JFrame f = new JFrame("Frame Test");
    GridLayout Layout = new GridLayout(50,50);

    JPanel panel = new JPanel(new GridLayout(50, 50, 1, 1));

    //Not sure if I need this or not?
    //panel.setLayout(new GridBagLayout());

    //first set of black
    for (int i = 0; i < 1000; i++) {
        JLabel a = new JLabel(new ImageIcon("black-square.jpg"), JLabel.CENTER);
        panel.add(a);

    }

    //adds pacman
    JLabel b = new JLabel(new ImageIcon("pacman.png"), JLabel.CENTER);
    panel.add(b);

    //next set of black
    for (int i = 0; i < 1000; i++) {
        JLabel c = new JLabel(new ImageIcon("black-square.jpg"), JLabel.CENTER);
        panel.add(c);
    }


   //do the thing 
    f.setContentPane(panel);
    f.setSize(1000, 1000);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);


}

}


首先看一下Swing 中的并发 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ and 如何使用 Swing 计时器 http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

您将遇到的下一个问题是容器受控于LayoutManager。虽然可以使用它来实现移动,但它会是块状的,因为每个组件都会跳跃单元格。

如果你想要平滑的移动,你将不得不设计自己的布局逻辑,这可能非常复杂。

尽管如此,您的目标应该是保持游戏的“虚拟”视图。这使您可以了解迷宫的形状和角色的位置,而无需与 UI 进行大量比较。然后,您应该简单地渲染这个“虚拟”视图或模型的状态

更新了非常基本的示例

这是一个基本示例,它使用GridLayout and setComponentZOrder移动到有关面板的组件...没有碰撞检测,“AI”很可悲...

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class PacMan101 {

    public static void main(String[] args) {
        new PacMan101();
    }

    public PacMan101() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MazePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MazePane extends JPanel {

        private JLabel pacMan;
        private JLabel ghost;

        public MazePane() {
            pacMan = new JLabel(new ImageIcon(getClass().getResource("/PacMan.png")));
            ghost = new JLabel(new ImageIcon(getClass().getResource("/Ghost.png")));

            setLayout(new GridLayout(8, 8));
            add(pacMan);

            for (int index = 1; index < (8 * 8) - 1; index++) {
                add(new JPanel() {

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(32, 32);
                    }

                });
            }

            add(ghost);

            Timer timer = new Timer(500, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    move(pacMan);
                    move(ghost);
                    revalidate();
                    repaint();
                }

                protected void move(Component obj) {
                    int order = getComponentZOrder(obj);
                    int row = order / 8;
                    int col = order - (row * 8);

                    boolean moved = false;
                    while (!moved) {
                        int direction = (int) (Math.round(Math.random() * 3));
                        int nextRow = row;
                        int nextCol = col;
                        switch (direction) {
                            case 0:
                                nextRow--;
                                break;
                            case 1:
                                nextCol++;
                                break;
                            case 2:
                                nextRow++;
                                break;
                            case 3:
                                nextCol--;
                                break;
                        }

                        if (nextRow >= 0 && nextRow < 8 && nextCol >= 0 && nextCol < 8) {
                            row = nextRow;
                            col = nextCol;
                            moved = true;
                        }
                    }

                    order = (row * 8) + col;
                    setComponentZOrder(obj, order);

                }
            });
            timer.start();
        }

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 jLabel 移动到 jPanel 中的不同位置(类似 Pacman 的游戏) 的相关文章

  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException

随机推荐

  • Excel VBA:工作表保护未按预期工作

    使用 VBA 我试图禁止插入和删除行和列 同时允许用户编辑单元格内容 我希望以下调用能够解决问题 ActiveSheet Protect Password SomePassword AllowInsertingColumns False A
  • ASP.NET 2.5 前缀 ctl00 和 ASP.NET 4 不前缀 ctl00

    有谁知道为什么 ASP NET 4 放弃了ctl00ASP 控件上的前缀 有没有我错过的设置 在 ASP NET 4 0 中 他们引入了对更简洁的 HTML 语法的支持 你可以阅读相关内容在 Scott Gu 的博客 http weblog
  • 原生 Javascript 页面加载消息?

    我想要一个页面阻塞 加载脚本 该脚本将覆盖整个页面并在加载所有资源时显示 正在加载 消息 以避免无样式内容的闪烁等 我基本上想要类似的东西jQuery 的 BlockUI http jquery malsup com block page的
  • python 中的高斯-勒让德算法

    我需要一些帮助来计算 Pi 我正在尝试编写一个 python 程序来将 Pi 计算为 X 位数字 我已经尝试了 python 邮件列表中的几个 但它对我的使用来说太慢了 我读过有关高斯 勒让德算法 http en wikipedia org
  • 《使用 Rails 进行敏捷 Web 开发》一书:CSS 未应用

    我刚刚通过阅读著名的实用书架书籍 Agile Web Development with Rails 开始深入 Rails 的世界 到目前为止 我确实遵循了所有示例 但现在我被困在第 85 页 pdf 版本 其中应该将自定义 CSS 添加到项
  • XSLT - 从 URL 获取文件名

    我需要从 URL 获取文件名 URL 是动态的 并且斜杠的数量可以是不同的数量 我使用 xslt 1 0 所以寻找需要的东西 http DevSite sites name Lists note Attachments 3 image jp
  • 访问 NODE_ENV 在前端代码中有意义吗?

    我有一个正在部署的反应 节点应用程序 其中一个组件尝试访问 NODE ENV 以确定要使用的主机 URL localhost 或 heroku 我现在意识到 即使 NODE ENV 被设置为生产环境 它在浏览器上下文中始终是 未定义 的 因
  • Visual Studio 2017 ASP.NET MVC 核心模板中的 Bower 替换

    最近 我使用 Visual Studio 2017 15 6 3 从头开始 创建了一个 ASP NET MVC Core 项目 我发现了常用的 JavaScript 框架 引导程序 jquery jquery 验证 jquery 验证 不显
  • 最好使用私有方法还是受保护方法?

    在我的许多 PHP 项目中 我最终得到的类具有我不打算扩展的非公共函数 最好将它们声明为受保护的还是私有的 我可以从两种角度看待争论 将它们设为私有是一种更为保守的方法 但可以说 如果我希望扩展该方法 并且它清楚地表明哪些方法是由基类扩展的
  • 在 Rhino 中作为 JavaScript 对象访问 java 地图和列表

    有没有办法在 Rhino 中以 JavaScript 对象的形式访问 Java 地图和列表 我有一个 Map 其中仅包含其他映射以及基元和字符串列表 我想将其传递给 Rhino 脚本并对其执行操作 并将修改后的对象返回到 Java 但因为它
  • 具有多个国家/地区代码顶级域名 (ccTLD) 的 Facebook 应用

    假设我们有一个通过以下域提供服务的 Web 应用程序 www something com www something co uk www something de 我想知道是否有一种方法可以验证用户的 Facebook 帐户 从这些不同的域
  • 从开始日期到结束日期的每个日期的行

    我想做的是记录如下所示 Start DT End DT ID 4 5 2013 4 9 2013 1 并将其更改为如下所示 DT ID 4 5 2013 1 4 6 2013 1 4 7 2013 1 4 8 2013 1 4 9 2013
  • Heroku 上的自定义根域

    我有一个域 example com 我想将其用于位于 example herokuapp com 的 Rails 应用程序 但我很困惑如何执行此操作 赫罗库 说 https devcenter heroku com articles cus
  • 如何使用 jQuery 通过命名空间进行 XML 解析

    我是 jQuery 新手 想解析 XML 文档 我能够使用默认命名空间解析常规 XML 但使用 XML 例如
  • 数据库转储到文本文件,对“行已完成”有副作用

    我试图让一个函数从 select 语句将数据库 sql 转储写入文本文件 返回的量可能非常大 我有兴趣尽快完成此操作 对于大型结果集 我还需要记录每个 x 间隔写入的总行数以及自上一个 x 间隔以来每秒写入的行数 我有一个 map 实际上在
  • 如何将 Spider 搜索添加到我的网站? “无法连接到数据库”

    我下载了蜘蛛搜索引擎 http www sphider eu 我目前正在尝试通过本地主机运行它 我将其提取到根文件夹中 并用 HTML 创建了一个搜索栏 div div
  • 如何指示 SharePoint 场在特定服务器上运行计时器作业?

    我们有一个 SP 计时器作业 运行良好一段时间 最近 管理员在场中加入了另一台服务器 因此 SharePoint 决定开始在此另一台服务器上运行此计时器作业 问题是服务器上没有安装所有依赖项 即 Oracle 因此作业失败 我只是在这里寻找
  • NumPy 数组中元素的索引[重复]

    这个问题在这里已经有答案了 在Python中 我们可以使用以下方法获取数组中值的索引 index 但是对于 NumPy 数组 当我尝试执行以下操作时 decoding index i I get AttributeError numpy n
  • 使用 Java 在网页上查找链接

    使用Java将网页的源代码存储在字符串中 我想提取源代码中的所有url并输出它们 我对正则表达式之类的东西很糟糕 甚至不知道如何解决这个问题 任何帮助将不胜感激 不要使用正则表达式 https stackoverflow com quest
  • 将 jLabel 移动到 jPanel 中的不同位置(类似 Pacman 的游戏)

    我正在制作像吃豆人这样的游戏 到目前为止我才刚刚从网格开始 我启动了网格 但我需要弄清楚如何将某些内容移动到网格中的不同位置 以便当用户单击或我的幽灵移动时 它将显示在屏幕上 我怎样才能让它动起来 我尝试了很多不同的方法 但没有一个对我有用