如何使用键绑定使矩形在屏幕上移动?

2024-03-03

我试图创建的游戏是贪吃蛇,到目前为止我已经弄清楚如何使用paint(Graphics g)一点JPanel、鼠标侦听器,现在我正在尝试创建一个将在屏幕上移动并使用键绑定或键侦听器的矩形,但我不知道应该如何处理此问题。

这是到目前为止我的代码,它有两部分。 第一部分称为snake2因为如果我不知道自己在做什么,我就会用不同的东西制作相同的程序。Snake使用框架,但是Snake2 uses JPanel(看起来好多了……)

    import java.awt.*;

    //required for MouseListener
    import java.awt.event.*;

    //requied for Graohics
    import java.applet.*;
    import javax.swing.*;

    public class Snake2 extends JPanel
    {
      private Rectangle sampleObject;

      public Snake2()
      {
         addMouseListener(new MouseListener());

      }


      /* create background */
      public void paint (Graphics g)
      {
        Font angel = new Font("Angelic War", Font.BOLD, 60);
        Font ith = new Font("Ithornît", Font.BOLD, 78);

        setBackground(Color.darkGray);
        g.setColor(Color.darkGray);
        g.fillRect(0,0,700,850);
        g.setColor(Color.gray);
        g.fillRect(50,150,600,650);
        g.setColor(Color.white);
        g.drawRect(50,150,600,650);

        g.drawString("Quit",52,116);
        g.drawRect(50,100,30,20);

        //g.setFont(angel);
        //g.drawString("SNAKE",300,70);
        g.setFont(ith);
        g.drawString("SNAKE",280,90);  
      }

      public void sprite (int x, int y, Graphics g){
        g.setColor(Color.white);
        g.fillRect(300,200,10,10);
      }

      public void start (int x, int y, Graphics g){
        g.setColor(Color.white);
        g.drawString("START GAME",300,425);
      }
    }


    /* Tracks where mouse is clicked */
    class MouseListener extends MouseAdapter
    {
      public void mouseReleased(MouseEvent me)
      {
        if (me.getX() >= 50 && me.getX() <= 80 && me.getY() >= 100 && me.getY() <= 120)
        {
          System.exit(0);
        }

          String str="Mouse Released at "+me.getX()+","+me.getY();
          System.out.println(str);
      }
    }

第二部分是:

    import javax.swing.JFrame;
    import java.awt.Dimension;

    public class SnakeDisplay
    {

      public static void main ( String [ ] arguments )
      {   
        JFrame frame = new JFrame ( "Snake" );
        Snake2 panel = new Snake2 ( );


        frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
        frame.add ( panel );
        frame.setContentPane ( panel );

        frame.setPreferredSize ( new Dimension ( 700, 850 ) );
        //frame.setLocationRelativeTo ( null );
        frame.setVisible ( true );
        frame.pack ( );     
      }
    }

  1. 你应该覆盖paintComponent在你的JPanel并打电话super.paintComponent(g) in it.
  2. See 如何使用按键绑定教程 http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html。在这种情况下,首选键绑定而不是KeyListener
  3. pack() then setVisible()
  4. 您应该为 x 和 y 位置设置全局变量,以便可以从您的内部访问它们Action。然后在您的操作中,增加您的 x 或 y 并重新绘制

尝试运行这个例子

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class KeyBidings extends JFrame {
    int x = 0;
    int y = 0;

    DrawPanel drawPanel = new DrawPanel();

    public KeyBidings(){
        Action rightAction = new AbstractAction(){
            public void actionPerformed(ActionEvent e) {
                x +=10;
                drawPanel.repaint();
            }
        };

            InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
            ActionMap actionMap = drawPanel.getActionMap();

        inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction");
        actionMap.put("rightAction", rightAction);

        add(drawPanel);

        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private class DrawPanel extends JPanel {


        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.GRAY);
                    g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.GREEN);
            g.fillRect(x, y, 50, 50);
        }

        public Dimension getPreferredSize() {
            return new Dimension(400, 200);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                new KeyBidings();
            }
        });
    }
}

这是您更关心的代码

    Action rightAction = new AbstractAction(){
        public void actionPerformed(ActionEvent e) {
            x +=10;
            drawPanel.repaint();
        }
    };

    InputMap inputMap = drawPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
    ActionMap actionMap = drawPanel.getActionMap();

    inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "rightAction");
    actionMap.put("rightAction", rightAction);

创建自定义操作并将该操作添加到链接到输入映射击键的操作映射。在操作中,只需根据方向增加或减少 x 和/或 y,然后重新绘制面板。


See 按键绑定教程 http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html | 图形教程 http://docs.oracle.com/javase/tutorial/2d/

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

如何使用键绑定使矩形在屏幕上移动? 的相关文章

随机推荐

  • HttpContext.Current.User.Identity.IsAuthenticated 返回 false

    我有一个奇怪的问题 我有一个包含以下代码的页面 if HttpContext Current User Identity IsAuthenticated Server Transfer Views Public Unauthorised a
  • 不幸的是 已停止

    我有一个应用程序 用户以表单提交一些数据 然后将其发送到服务器 我正在平板电脑和 Android 智能手机 Galaxy S2 上对其进行测试 在平板电脑上 一旦我单击 提交 应用程序就会停止工作 并显示消息 不幸的是已停止工作 这个问题在
  • 在没有模块的情况下访问 JDK 11 中的“sun.security.x509”?

    tl 博士在最后 我们有一个生成自签名 SSL 证书的小方法 它显然取决于sun security x509 因此 目前我们仍在使用 JDK8 构建它 尽管代码库的其余部分 它只是一个小型的单个库 是使用 JDK11 构建并使用 JVM11
  • 创建不带输入文本框的复制按钮

    我需要一些 JavaScript 来制作一些文本 以便在您单击按钮时复制您的剪贴板 我已在下面附加了按钮 HTML 注意 我有多个按钮
  • TFS:将一个分支中本地完成的更改提交到另一个分支

    我对很多文件进行了更改 同时我想我宁愿将这些未经测试的代码提交到尚未创建的分支 这样现有代码库的用户就不会受到影响 由于我接触了很多很多文件并创建和添加了新的子项目等 我想避免手动复制文件和文件夹 在 Visual Studio 中完成此操
  • 从命令行调用 python 脚本而不先输入“python”

    问题 在命令行中 如何调用 python 脚本而无需键入python在脚本名称前面 这可能吗 Info 我编写了一个方便的脚本 用于从命令行访问 sqlite 数据库 但我有点不喜欢键入 python SQLsap args 而宁愿只键入
  • 从 RDF 到 html 的 XSLT 转换

    我正在尝试使用 XSLT 将 RDF 文件转换为 HTML 我正在使用我在网上找到的模板 http snippets dzone com posts show 1164 http snippets dzone com posts show
  • 使用 toString 进行 Java 语言设计

    他们决定不实施toString方法用于int 而是让它继承toString方法来自Object 他们确实实施了更合理的toString数组的方法 他们位于java util Arrays http docs oracle com javas
  • 谷歌地图 myoptions 不起作用

    我正在尝试自定义马萨诸塞州地图 以显示 10 个区 我已将链接添加到在 我的地点 中创建的地图 但无法使地图居中 缩放或标题 中心 LatLng 是伍斯特 没有任何效果 帮助 Thanks
  • 如何查看 PHP SOAP 客户端类生成的实际 XML?

    考虑以下 SOAP 客户端脚本示例 SOAP new SoapClient WDSL Create a SOAP Client from a WSDL Build an array of data to send in the reques
  • Ionic 3 Native:文件:{代码:5,消息:“ENCODING_ERR”}

    我正在使用文件 API 插件中的 checkFile 函数 https ionicframework com docs native file checkFile在 Ionic 3 中检查文件是否存在于本地 Promise 被拒绝并出现以下
  • 如何以安全的方式为 HTTPS 配置 OpenSSL?

    每个月 网络上都会有一些文章介绍某些应用程序或平台在 SSL 实施中使用过时的加密配置 这让我担心 我自己的实现怎么样 当我在应用程序中使用 OpenSSL 来提供和 或使用 HTTPS 时 我到底应该做什么才能以最安全的方式配置 Open
  • Heroku 上的 ffmpeg:无法识别的选项“预设”

    我在本地 Rails 应用程序中使用 ffmpeg 版本 1 2 4 来转换视频文件 当我在本地运行应用程序时 一切都按预期工作 当我部署到heroku时 我添加了ffmpeg的构建包 https github com shunjikoni
  • 反序列化 JSON 日期(无时区)

    从昨天开始 我遇到了一个让我头疼的问题 不知道如何处理 我的数据库中有一个日期字段 其中包含以下值 然后我的应用程序获取该值并将其发送到我的网络表单 价值仍然相同 没关系 在客户端 我使用 javascript 警报进行中断 以查看来自 J
  • 从 tkinter 中的文本小部件复制格式化文本

    我正在使用 tkinter 在 Python 中开发 APA 引文制作器 我使用文本小部件在生成引文后显示引文 但每当我复制文本 目前使用 ctrl c 快捷方式 时 它都会丢失其格式 是否有某种方法可以从文本小部件复制格式化文本 例如斜体
  • 在 Gallery 中嵌入 ListView

    目标是实现一个 Gallery 其适配器返回 ListView 换句话说 嵌入水平滚动 Gallery 中的垂直滚动 ListView 经过一些工作后它就可以工作了 但是当尝试水平滚动时 ListView 看起来非常不稳定 就像居中时有一些
  • 更智能的“ff-find-other-file”

    我正在开发一个项目 其中源代码组织在以下目录结构中 source include source include analysis source include tools source include utils source includ
  • 如何在 Google App Engine Java 应用程序的模块之间共享会话?

    当我通过以下方式在会话中存储某些内容时HttpSession在模块A中 HttpSession session req getSession true session setAttribute username Eng Fouad 然后我尝
  • 需要帮助找到正确的 T-SQL 查询

    我不太确定该怎么做 基本上我有一张这样的桌子 UserId DateRequested Approved ApprovedBy Notes 1 2011 05 26 0 NULL NULL 1 2011 05 27 0 NULL NULL
  • 如何使用键绑定使矩形在屏幕上移动?

    我试图创建的游戏是贪吃蛇 到目前为止我已经弄清楚如何使用paint Graphics g 一点JPanel 鼠标侦听器 现在我正在尝试创建一个将在屏幕上移动并使用键绑定或键侦听器的矩形 但我不知道应该如何处理此问题 这是到目前为止我的代码