0

そのため、キーパッドのどのボタンが押されているかに応じて、ボール (楕円) を左、右、上、または下に正常に移動するアプリケーションがあります。しかし、ボールを斜めに動かすのに苦労しています。ユーザーが2つの方向キーを保持すると、ボールが斜めに入ると言うことでこれをやろうとしています. たとえば、左キーと上キーをクリックすると、ボールが北西方向に移動するようにします。問題の原因がわかる方がいらっしゃいましたら、お力添えをいただければ幸いです。

エンジン

class KeyClickListener implements KeyListener
        {
        public void keyPressed(KeyEvent e)
        {
            if (e.getKeyCode() == KeyEvent.VK_DOWN )
                {
                    component.moveCircle(1);
                }
            else if (e.getKeyCode() == KeyEvent.VK_UP)
                {
                    component.moveCircle(2);
                }
            else if (e.getKeyCode() == KeyEvent.VK_RIGHT)
                {
                    component.moveCircle(3);
                }
            else if (e.getKeyCode() == KeyEvent.VK_LEFT)
                {
                    component.moveCircle(5);
                }   
            //this is my attempt at telling whether or not the user was holding two keys
            else if (e.getKeyCode() == KeyEvent.VK_LEFT && e.getKeyCode() == KeyEvent.VK_UP)
                {
                    component.moveCircle(5);
                }
        }
        public void keyReleased(KeyEvent e){}
        public void keyTyped(KeyEvent e){}
    }

CircleComponent

 public void moveCircle(int w)
 {
    dir = w;
    if (dir == 1)
        {
            y+=20;
            repaint();
            if (y>=560)
                {
                    dir=2;
                }
        }
.  
.
.

else if (dir == 5)
        {
            x-=10;
            y-=10;
            repaint();
            if(x<=0 )
                {
                    dir=3;
                }   
        }
}
4

2 に答える 2

3

キー イベントは、イベントをトリガーした最後のキーのみを報告するため、イベントをトリガーした最後のキーとのみ等しいため、最後のifステートメントは機能しません。keyCode

代わりに、各キーの「状態」を維持し、その状態に対して処理する必要があります。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestKeyListener01 {

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

    public TestKeyListener01() {
        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 TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private boolean arrowUp = false;
        private boolean arrowDown = false;
        private boolean arrowLeft = false;
        private boolean arrowRight = false;

        public TestPane() {
            setFocusable(true);
            addKeyListener(new KeyAdapter() {

                @Override
                public void keyReleased(KeyEvent e) {
                    switch (e.getKeyCode()) {
                        case KeyEvent.VK_DOWN:
                            arrowDown = false;
                            break;
                        case KeyEvent.VK_UP:
                            arrowUp = false;
                            break;
                        case KeyEvent.VK_LEFT:
                            arrowLeft = false;
                            break;
                        case KeyEvent.VK_RIGHT:
                            arrowRight = false;
                            break;
                    }
                    repaint();
                }

                @Override
                public void keyPressed(KeyEvent e) {
                    switch (e.getKeyCode()) {
                        case KeyEvent.VK_DOWN:
                            arrowDown = true;
                            break;
                        case KeyEvent.VK_UP:
                            arrowUp = true;
                            break;
                        case KeyEvent.VK_LEFT:
                            arrowLeft = true;
                            break;
                        case KeyEvent.VK_RIGHT:
                            arrowRight = true;
                            break;
                    }
                    repaint();
                }
            });
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            FontMetrics fm = g2d.getFontMetrics();
            String text = "Up";
            int x = (getWidth() - fm.stringWidth(text)) / 2;
            int y = ((getHeight() / 2) - fm.getHeight());
            draw(g2d, text, x, y, arrowUp);

            text = "Down";
            x = (getWidth() - fm.stringWidth(text)) / 2;
            y = ((getHeight() / 2) + fm.getHeight()) + fm.getAscent();
            draw(g2d, text, x, y, arrowDown);

            text = "Left";
            x = (getWidth() / 2) - fm.stringWidth(text) - 4;
            y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            draw(g2d, text, x, y, arrowLeft);

            text = "Right";
            x = (getWidth() / 2) + 4;
            y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            draw(g2d, text, x, y, arrowRight);

            g2d.dispose();
        }

        protected void draw(Graphics2D g2d, String text, int x, int y, boolean pressed) {
            g2d.setColor(pressed ? Color.BLACK : Color.GRAY);
            g2d.drawString(text, x, y);
        }
    }
}

の代わりに、代わりにキーバインディングKeyListenerを使用することもお勧めします。彼らは悩まされている厄介な焦点の問題を解決しますKeyListener

于 2013-04-30T01:09:12.470 に答える
0

KeyClickListener を に変更して、魔法を観察してください! 次に、これをチェックしてください http://zetcode.com/tutorials/javagamestutorial/movingsprites/

    class KeyClickListener implements KeyListener, Runnable
    {
        private boolean moveLeft, moveRight, moveUp, moveDown;
        private Thread runThread;
        public KeyClickListener() {
            moveLeft = moveRight = moveUp = moveDown = false;
            runThread = new Thread(this);
            runThread.start();
        } 
        public void keyPressed(KeyEvent e) {assessKeycodes(e, true);}
        public void keyReleased(KeyEvent e){assessKeycodes(e, false);}
        public void keyTyped(KeyEvent e){}

        private void assessKeycodes(KeyEvent e, boolean setTo) {
            switch(e.getKeyCode()) {
                case KeyEvent.VK_DOWN:
                    moveDown = setTo;
                    break;
                case KeyEvent.VK_UP:
                    moveDown = setTo;
                    break;
                case KeyEvent.VK_LEFT:
                    moveDown = setTo;
                    break;
                case KeyEvent.VK_RIGHT:
                    moveDown = setTo;
                    break;
            }
        }

        public void run() {
            while(true) {
                if (moveDown)
                        component.moveCircle(1);
                if (moveUp)
                        component.moveCircle(2);
                if (moveRight)
                        component.moveCircle(3);
                if (moveLeft)
                        component.moveCircle(5);
            }
        }
    }
于 2013-04-30T01:10:26.163 に答える