1

我想做一个八字和十字架游戏,所以你用鼠标选择一个框,然后在键盘上用 X 或 O 输入答案。我已经让框选择工作但似乎无法让 x 和 o 工作。我的代码可能不是最好的,因为这是我制作的第一款游戏。

这是我的主要课程:

package com;

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class Board extends JPanel implements ActionListener, MouseListener,
        KeyListener {

    public int box = 1;
    public int x, y;
    public int cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4, cx5, cy5;

    public boolean player1 = true;
    public boolean player2 = false;
    public boolean box1 = false;
    public boolean box2 = false;
    public boolean box3 = false;
    public boolean box4 = false;
    public boolean box5 = false;
    public boolean box6 = false;
    public boolean box7 = false;
    public boolean box8 = false;
    public boolean box9 = false;
    public boolean xpress = false;
    public boolean cross1 = false;
    public boolean cross2 = false;
    public boolean cross3 = false;
    public boolean cross4 = false;
    public boolean cross5 = false;

    public Thread t;
    Timer time;

    JButton cross, naught;

    Image Board, Select, Cross, Cross2, Cross3, Cross4, Cross5, Naught;

    Board() {
        super();
        x = 0;
        y = 60;

        t = new Thread();
        time = new Timer(5, this);
        time.start();
        t.start();
        setFocusable(true);

        addMouseListener(this);
        addKeyListener(this);

        ImageIcon i = new ImageIcon(getClass().getResource(
                "/images/Board_N+C.png"));
        Board = i.getImage();
        ImageIcon i1 = new ImageIcon(getClass().getResource(
                "/images/Select_N+C.png"));
        Select = i1.getImage();
        ImageIcon i2 = new ImageIcon(getClass().getResource(
                "/images/Cross_N+C.png"));
        Cross = i2.getImage();
        Cross2 = i2.getImage();
        Cross3 = i2.getImage();
        Cross4 = i2.getImage();
        Cross5 = i2.getImage();

        ImageIcon i3 = new ImageIcon(getClass().getResource(
                "/images/Naught_N+C.png"));
        Naught = i3.getImage();

    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.drawImage(Board, 0, 60, null);
        if (cross1) {

        }

        if (x < 170 && y < 230 && !xpress) {
            g2d.drawImage(Select, 0, 60, null);

            repaint();
        } else if (x < 340 && x > 170 && y < 230 && !xpress) {
            g2d.drawImage(Select, 170, 60, null);
            repaint();

        } else if (x < 510 && x > 340 && y < 230 && !xpress) {
            g2d.drawImage(Select, 340, 60, null);
            repaint();

        } else if (x < 170 && y < 400 && y > 230 && !xpress) {
            g2d.drawImage(Select, 0, 230, null);
            repaint();

        } else if (x < 340 && x > 170 && y < 400 && y > 230 && !xpress) {
            g2d.drawImage(Select, 170, 230, null);
            repaint();

        } else if (x < 510 && x > 340 && y < 400 && y > 230 && !xpress) {
            g2d.drawImage(Select, 340, 230, null);
            repaint();

        } else if (x < 170 && y < 570 && y > 400 && !xpress) {
            g2d.drawImage(Select, 0, 400, null);
            repaint();

        } else if (x < 340 && x > 170 && y < 570 && y > 400 && !xpress) {
            g2d.drawImage(Select, 170, 400, null);
            repaint();

        } else if (x < 510 && x > 340 && y < 570 && y > 400 && !xpress) {
            g2d.drawImage(Select, 340, 400, null);
            repaint();
        }
        if (xpress && !player2) {
            if (x < 170 && y < 230) {
                cross1 = true;
                while (cross1) {
                    g2d.drawImage(Cross, 0, 60, null);
                    System.out.println("Cross");

                }repaint();
                xpress = false;
            } else if (x < 340 && x > 170 && y < 230) {
                repaint();

            } else if (x < 510 && x > 340 && y < 230) {
                repaint();

            } else if (x < 170 && y < 400 && y > 230) {
                repaint();

            } else if (x < 340 && x > 170 && y < 400 && y > 230) {
                repaint();

            } else if (x < 510 && x > 340 && y < 400 && y > 230) {
                repaint();

            } else if (x < 170 && y < 570 && y > 400) {
                repaint();

            } else if (x < 340 && x > 170 && y < 570 && y > 400) {
                repaint();

            } else if (x < 510 && x > 340 && y < 570 && y > 400) {
                repaint();
            }
        }
    }

    public void mouseClicked(MouseEvent me) {

        x = me.getX();
        y = me.getY();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    }

    public void mouseEntered(MouseEvent arg0) {
    }

    public void mouseExited(MouseEvent arg0) {
    }

    public void mousePressed(MouseEvent arg0) {
    }

    public void mouseReleased(MouseEvent arg0) {
    }

    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == e.VK_X) {
            if (player1) {
                xpress = true;
                player1 = false;
                player2 = true;
            }
        }

    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {

    }

}

如何在按键时显示图像并将其保留在屏幕上直到线程停止?

希望有人可以提供帮助。如果您需要更多信息,请询问。

4

1 回答 1

1

您显然不知道线程在 Java 中是如何工作的。

t = new Thread();
time = new Timer(5, this);
time.start();
t.start();

首先,创建Thread不会做任何事情(然后有一个线程启动并立即死亡,因为它什么都不做)。

其次,您最好有一个非常好的理由每 5 毫秒触发一次计时器。这将限制事件调度线程,最终消耗您的 CPU 并使您的程序停止运行。

花点时间通读一遍

例子

这是一个非常简单的示例,BYO 图像...

public class PopShowAndFadeImage {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        JFrame test = new JFrame("Test");
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setSize(700, 1000);
        test.setLocationRelativeTo(null);
        test.setLayout(new BorderLayout());
        test.add(new ImagePane());
        test.setVisible(true);

    }

    protected static class ImagePane extends JPanel {

        private BufferedImage background;

        private Image image;
        private Timer timeOut;

        public ImagePane() {

            timeOut = new Timer(1000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    image = null;
                    repaint();

                }
            });
            timeOut.setRepeats(false);
            timeOut.setCoalesce(true);

            setFocusable(true);

            InputMap im = getInputMap(WHEN_FOCUSED);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "HitMe");
            am.put("HitMe", new AbstractAction() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    if (background == null) {
                        try {
                            background = ImageIO.read(getClass().getResource("/MT011.gif"));
                        } catch (IOException exp) {
                            exp.printStackTrace();;
                        }
                    }

                    image = background;

                    repaint();

                    timeOut.restart();

                }
            });

        }

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);

            if (image != null) {

                int width = getWidth() - 1;
                int height = getHeight() - 1;

                Graphics2D g2d = (Graphics2D) g;
                int x = (width - image.getWidth(this)) / 2;
                int y = (height - image.getHeight(this)) / 2;

                g2d.drawImage(image, x, y, this);

            }

        }

    }

}

更新

只是对您面临的一些问题的快速概述。

您承认自己是 Java/编程新手,但您已经开始涉足自定义图形和动画。自定义图形已经够难了,动画更是一个数量级。

这是您需要的一些背景元素。

  • 很好地理解基本的编程原则(if、循环等)——这是基本的东西
  • 对面向对象编程有很好的理解。这对大多数人来说都不是微不足道的
  • 对 Swing API 有很好的理解,尤其是绘画的工作原理
  • 对 Graphics/Graphics2D API 有很好的理解。这绝非易事
  • 很好地理解线程以及它们与 Swing API 的关系。这绝非易事
  • 至少对动画原理有基本的了解。

从你所说的看,你似乎在掌握爬行之前就试图飞翔。我并不是说你做不到,但你的理解和知识存在很大差距,这将使你难以实现目标。

说到动画,我使用Timing Framework,但你也可以看看Trident

我将尝试将一些示例放在一起,但是我之前发布的示例将完全按照您的标题要求进行

于 2012-09-22T10:47:28.320 回答