簡體   English   中英

按下鍵即可更改球的方向

[英]change the direction of the ball as the key is pressed

我一直試圖使一個球改變其方向,因為按下任何鍵。 如果在按下鍵時球正在向側面移動,則球將開始向下移動,並且當它觸摸底部時,它將向后移回向上位置...我想我寫的是正確的代碼,我找不到任何錯誤。 所以有人可以告訴我這段代碼有什么問題嗎?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ASS2 extends JFrame {

    public static void main(String args[]) {
        ASS2 g = new ASS2();
        g.setLayout(new BorderLayout());
        g.setSize(500, 500);
        MyPanel mp = new MyPanel();
        g.add(mp);
        mp.setSize(500, 500);
        mp.setBackground(Color.black);
//mp.addKeyListener(mp);
        g.setVisible(true);
        g.setDefaultCloseOperation(EXIT_ON_CLOSE);

    }
}

class MyPanel extends JPanel implements KeyListener {

    {
        addKeyListener(this);
    }
    int xpos = 20, ypos = 200;
    int xtop = 15, ytop = 15;
    int xtemp = 250, ytemp = 250;
    int xbot = 450, ybot = 400;
    int flag = 1, flag1 = 1;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.white);
        g2d.fill(new Ellipse2D.Double(xpos, ypos, 50, 50));
        if (xpos < xbot && flag == 1) {
            xpos++;
            if (xpos == xbot) {
                flag = 0;
            }
        } else if (xpos > xtop && flag == 0) {
            xpos--;
            if (xpos == xtop) {
                flag = 1;
            }
        }

        try {
            Thread.sleep(05);
        } catch (Exception e) {
        }
        repaint(1000);

    }

    public void keyPressed(KeyEvent ae) {

    }

    public void keyReleased(KeyEvent ae) {
        Object t = ae.getKeyCode();
        if (t.equals(KeyEvent.VK_DOWN)) {
            if (ypos < ybot && flag1 == 1) {
                ypos++;
                if (ypos == ybot) {
                    flag1 = 0;
                }
            } else if (ypos > ytop && flag1 == 0) {
                ypos--;
                if (ypos == ytop) {
                    flag1 = 1;
                }
            }
            repaint();
        } else if (t.equals(KeyEvent.VK_RIGHT)) {
            if (xpos < xbot && flag == 1) {
                xpos++;
                if (xpos == xbot) {
                    flag = 0;
                }
            } else if (xpos > xtop && flag == 0) {
                xpos--;
                if (xpos == xtop) {
                    flag = 0;
                }
            }
            repaint();
        }

    }
}

歡迎來到“為什么不應該使用KeyListener ”的奇妙世界。

基本上, KeyListener僅在偵聽器所連接的組件可聚焦且具有焦點時才引發事件。

相反,您應該使用按鍵綁定 ,該按鍵綁定可讓您控制觸發按鍵事件的焦點級別。

  • 不要在EDT中調用的任何方法(尤其是paint方法)中使用Thread.sleep
  • 不要調用repaint(1000); 在任何paint方法內部或調用任何可能從paint方法內部觸發repaint paint方法
  • 不要在paint方法內修改狀態, paint方法就是這樣。
  • 使用某種“更新”線程/進程負責更新游戲模型並請求更新視圖。 java.swing.Timer是一個很好的簡單選擇。 請參閱如何使用Swing計時器
  • 當Swing Timer限制您要嘗試的操作並且開始探索Thread的使用時,請不要在EDT之外修改任何UI組件。 有關更多詳細信息,請參見Swing中的並發。
  • 始終從EDT上下文中啟動程序,有關更多詳細信息,請參見初始線程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM