При обработке собития нажатия клавиши движение происходит не сразу - Java

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Пробую создавать движение объектов по нажатию клавиш, и вот не могу понять норма или нет, если нажать клавишу то объет сначала дернется потом через секунду побежит как нужно. Нужно что бы сразу было движение без первого рывка.
package base;
 
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
 
public class star
{
    public JFrame window = new JFrame("Super Owl");  
    public JLabel Owl = new JLabel();
    private JLabel fon0 = new JLabel();
    public int yOwl = 260;
    public int xOwl = 50;
    
    public star()
    {
        window.setSize(800, 600);   
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().setBackground(Color.white);
        window.setLayout(null);
        window.setResizable(false);
        window.setLocationRelativeTo(null);
        
        general();
        
        window.setVisible(true);
    }

    public void general()
    {
        creatOwl();
        creatFon();
    }

    public void creatOwl()
    {
        Owl.setBounds(xOwl, yOwl, 80, 80);
        ImageIcon owlPic = new ImageIcon("data/Owlalpha.png");
        Owl.setIcon(owlPic);
        Owl.setHorizontalAlignment(SwingConstants.CENTER);
        Owl.setLayout(null);
        Owl.setOpaque(true);
        
        window.add(Owl);
        
        KeyListener InputHand = new push();
        window.addKeyListener(InputHand);
    }

    public class push implements KeyListener
    {
        public void keyTyped(KeyEvent e)
        {
            //...
        }
 
        public void keyPressed(KeyEvent e)
        {
            //if (e.getKeyCode() == KeyEvent.VK_UP)
            //{
                //Owl.setLocation(xOwl,yOwl -= 5);
                //System.out.println("Up key pressed");
            //}
            switch (e.getKeyCode()) 
            {
            case KeyEvent.VK_UP:
                Owl.setLocation(xOwl,yOwl -= 5);
                window.repaint();
                break;
            case KeyEvent.VK_DOWN:
                Owl.setLocation(xOwl,yOwl += 5);
                break;
            case KeyEvent.VK_LEFT:
                //...
                break;
            case KeyEvent.VK_RIGHT:
                //...
                break;
            }
        }
 
        public void keyReleased(KeyEvent e)
        {
            //...
        }
    }

    public void OwlFlyX()
    {
        Owl.setLocation(xOwl,yOwl -= 5);
    }

    private void creatFon()
    {
        fon0.setBounds(0, 0, 800, 600);
        ImageIcon Fon0 = new ImageIcon("data/fon0.jpg");
        fon0.setIcon(Fon0);
        fon0.setHorizontalAlignment(SwingConstants.CENTER);
        fon0.setLayout(null);
        
        window.add(fon0);
    }

    public static void main(String[] args) 
    {
        new star();
        //System.out.println("Hello World!");
    }
}

Решение задачи: «При обработке собития нажатия клавиши движение происходит не сразу»

textual
Листинг программы
package base;
 
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.Timer;
 
 
public class OwlAdv 
{
    private JFrame window = new JFrame("Super Owl");
    public int collisioX;
    public int collisioY;
    
    
    public OwlAdv()
    {
        window.setSize(800, 600);   
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().setBackground(Color.white);
        window.setLayout(null);
        window.setResizable(false);
        window.setLocationRelativeTo(null);
        
        general();
        
        window.setVisible(true);
    }
    
    
    private void general()
    {   
        for (int i = 0; i < 3; i++)
        {
            window.add(new baseEnemy());
        }
        window.add(new baseOwl());
        window.add(new baseFon());
    }
    
    
    //@SuppressWarnings("serial")//serial - отключение предупреждений, связанных с недостающим полем serialVersionUID в классе, допускающем сериализацию
    public class baseFon extends JLabel
    {
        private static final long serialVersionUID = 1L;
 
 
        public baseFon()
        {
            makeFon();
        }
        
        
        private void makeFon()
        {
            setBounds(0, 0, 800, 600);
            ImageIcon Fon0 = new ImageIcon("data/fon0.jpg");
            setIcon(Fon0);
            setHorizontalAlignment(SwingConstants.CENTER);
            setLayout(null);
        }
    }
    
    
    
    public class baseOwl extends JLabel
    {
        private static final long serialVersionUID = 1L;
        private int speed = 4;
        public int yOwl = 260;
        public int xOwl = 50;
        private String controlMoveOwl = "stay";
        
        
        public baseOwl()
        {
            setFocusable(true);
            
            fps_keys();
            makeOwl();
        }
        
        
        private void fps_keys()
        {
            KeyListener InputHand = new fpsListener();
            addKeyListener(InputHand);
            
            Timer fpsTimer = new Timer(10, new fpsListener());
            fpsTimer.start();
        }
        
        
        public class fpsListener implements ActionListener, KeyListener
        {
            public void actionPerformed(ActionEvent e)
            {
                if (controlMoveOwl == "up" && yOwl > 5)
                {
                    setLocation(xOwl,yOwl -= speed);
                }
                if (controlMoveOwl == "down" && yOwl < 480)
                {
                    setLocation(xOwl,yOwl += speed);
                }
                
                collisioX = xOwl;
                collisioY = yOwl;
            }
            
            
            public void keyPressed(KeyEvent e)
            {
                switch (e.getKeyCode()) 
                {
                case KeyEvent.VK_UP:
                    controlMoveOwl = "up";
                    System.out.println("Up key pressed");
                    break;
                case KeyEvent.VK_DOWN:
                    controlMoveOwl = "down";
                    System.out.println("Down key pressed");
                    break;
                }
            }
 
            
            public void keyReleased(KeyEvent e)
            {
                switch (e.getKeyCode()) 
                {
                case KeyEvent.VK_UP:
                    controlMoveOwl = "stay";
                    System.out.println("Up key released");
                    break;
                case KeyEvent.VK_DOWN:
                    controlMoveOwl = "stay";
                    System.out.println("Down key released");
                    break;
                }
            }
 
 
            public void keyTyped(KeyEvent e)
            {
                //...
            }
        }
        
        
        private void makeOwl()
        {
            setBounds(xOwl, yOwl, 80, 80);
            ImageIcon owlPic = new ImageIcon("data/Owlalpha.png");
            setIcon(owlPic);
            setHorizontalAlignment(SwingConstants.CENTER);
            setLayout(null);
            setOpaque(false);
        }
    }
    
 
    public class baseEnemy extends JLabel
    {
        private static final long serialVersionUID = 1L;
        //private int speed = 4;
        private Random PosY = new Random();
        private Random PosS = new Random();
        private int[] arrY = new int[]{5,260,480};
        private int yEnemy = arrY[PosY.nextInt(arrY.length)];;
        private int[] arrS = new int[]{2,6,12};
        private int speed = arrS[PosS.nextInt(arrS.length)];;
        //public int yEnemy = 260;
        public int xEnemy = 880;
        //baseOwl i = new baseOwl();
        
        public baseEnemy()
        {       
            fps();
            makeEnemy();
        }
        
        
        private void fps()
        {         
            Timer fpsTimer = new Timer(8, new fpsListener());
            fpsTimer.start();
        }
        
        
        public class fpsListener implements ActionListener
        {       
            public void actionPerformed(ActionEvent e)
            {
                if (xEnemy > -120)
                {   
                    setLocation(xEnemy -= speed,yEnemy);
                }
                else
                {
                    xEnemy = 880;
                    yEnemy = arrY[PosY.nextInt(arrY.length)];;
                    speed = arrS[PosS.nextInt(arrS.length)];;
                }
                if (collisioX + 40 > xEnemy - 40 && collisioX - 40 < xEnemy + 40 && collisioY + 40 > yEnemy - 40 && collisioY - 40 < yEnemy + 40)
                {
                    System.out.println("ah ah ah");
                }
                //System.out.println(i.xOwl);
            }
        }
        
        
        private void makeEnemy()
        {
            setBounds(xEnemy, yEnemy, 80, 80);
            ImageIcon enemyPic = new ImageIcon("data/Enemyalpha.png");
            setIcon(enemyPic);
            setHorizontalAlignment(SwingConstants.CENTER);
            setLayout(null);
            setOpaque(true);
        }
    }
    
    public static void main(String[] args) 
    {
        new OwlAdv();
    }
}

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы