मैं एक साधारण खेल लिख रहा हूँ और मैं JFrame में जावा के साथ काम कर रहा हूँ। जब तक मैं प्लेटफॉर्म को नीचे नहीं ले जाता, तब तक मेरा आउटपुट बहुत खराब दिखता है, ऐसा लगता है कि जब तक मैं एक बटन अपडेट नहीं दबाता, तब तक यह अपडेट दर पर विचार नहीं करता है और जब मैं कुंजी जारी करता हूं तो यह वही काम करता है। तो यह 2 वर्गों के साथ पूरा कोड है:

public class BrickBreaker {
    private static final String TITLE = "break ball";
    private static final int X = 200, Y = 200, WIDTH = 700, HEIGHT = 600;

    public static void main(String[] arg){
        JFrame window = new JFrame();
        GamePlay gp = new GamePlay();
        window.setBounds(X,Y,WIDTH,HEIGHT);
        window.setTitle(TITLE);
        window.setResizable(false);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(gp);

    }
}

public class GamePlay extends JPanel implements KeyListener, ActionListener {

    private boolean play = false;
    private int score = 0, totalBricks = 21, delay = 10;
    private int playerX = 310;
    private int ballX = 120, ballY = 350, ballDirX = -1, ballDirY = -2;
    private final Timer TIMER;

    public GamePlay(){
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        TIMER = new Timer(delay, this);
        TIMER.start();
    }

    public void paint(Graphics g){
        //Background
        g.setColor(Color.BLACK);
        g.fillRect(1,1,700,592);

        //Borders
        g.setColor(Color.YELLOW);
        g.fillRect(0,0,3,592);
        g.fillRect(697,0,3,592);
        g.fillRect(0,0,697,3);

        //Paddle
        g.setColor(Color.GREEN);
        g.fillRect(playerX, 550, 100, 8);

        //Ball
        g.setColor(Color.YELLOW);
        g.fillOval(ballX, ballY, 20, 20);

        g.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        TIMER.start();
        if (play){
            TIMER.start();
            ballX += ballDirX;
            ballY += ballDirY;

            if(ballX <= 0 || ballX >= 700){
                ballDirX = - ballDirX;
            }

            if(ballY <= 0 || ballY >= 600){
                ballDirY = -ballDirY;
            }
        }

        repaint();
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyReleased(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT){
            if(playerX >= 590){
                playerX = 590;
            }else{
                moveRight();
            }
        }else if(e.getKeyCode() == KeyEvent.VK_LEFT){
            if(playerX <= 10){
                playerX = 10;
            }else{
                moveLeft();
            }
        }
    }

    private void moveLeft() {
        play = true;
        playerX -= 20;
    }

    private void moveRight() {
        play = true;
        playerX += 20;
    }


}

मैं जानना चाहता हूं कि गेंद की गति को हमेशा कीप्रेस्ड अवस्था की दर से कैसे सुचारू किया जाए।

0
Krzysztof Witkowski 23 नवम्बर 2020, 21:31

1 उत्तर

सबसे बढ़िया उत्तर

सबसे पहले एक्शन लिस्टनर में टाइमर शुरू करने की कोई जरूरत नहीं है। आप कंस्ट्रक्टर में टाइमर पहले ही शुरू कर चुके हैं।

जब तक मैं कोई कुंजी नहीं दबाता JFrame मेरी स्क्रीन को धीमी गति से अपडेट करता है

जब मैं कोड चलाता हूं तो कोई एनीमेशन नहीं होता है।

आइए कुछ बुनियादी डिबगिंग करें:

public void actionPerformed(ActionEvent e) {
    System.out.println(Play); // basic debugging

क्या देखती है?

तब क्या होता है जब आप एक तीर कुंजी दबाते हैं?

आप केवल play वेरिएबल को moveRight/moveLeft विधियों में क्यों सेट करते हैं?

0
camickr 23 नवम्बर 2020, 19:02