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();

まず、Threadwill の作成は何もしません (それ以外の場合は、スレッドが開始され、何もしないためにすぐに終了します)。

第二に、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 に答える