簡體   English   中英

將矩形繪制到屏幕后如何清除矩形?

[英]how can i clear my rectangle after drawing it to the screen?

我意識到游戲中缺少的一個主要因素是時間感,滴答聲或FPS。 我正計划很快實現這一目標,但想獲得一些有關如何設置“項目符號”的反饋。 我希望用戶按下空格鍵,並在屏幕上發射子彈。 現在我已經沒有FPS的感覺了。 但是,它只是畫出一條巨大的線,這意味着子彈“蹤跡”永遠不會消失。 我想知道為什么,當我調用repaint時,矩形可以通過鍵盤在屏幕上移動,但是只要我設置了自動移動的東西,即使我調用repaint(); ,它也會留下一個“痕跡” repaint(); 在每種方法中。

另外,如何從另一個班級創建子彈?

public class drawingComponent extends JComponent implements KeyListener {

    public Rectangle hello = new Rectangle(300, 100, 50, 50);
    Rectangle bullet = new Rectangle(310,75, 10,10);
    boolean goingon = false;

    public drawingComponent(){
        addKeyListener(this);
    }

    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(new Color(255,25,0));
        g2.setFont(new Font("monospace", Font.BOLD+Font.ITALIC, 30));
        g2.drawString("nothing yet",300,320);
        g2.fill(hello);
        setFocusable(true);
        requestFocus();
        g2.setColor(new Color(0,25,0));
        if (goingon == true){
            while (bullet.y < 1000){
                bullet.y=bullet.y+10;
                g2.fill(bullet);
            }
            bullet.y=300;
        }   
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W){
            hello.y=hello.y-1;
            hello.setLocation(hello.x,hello.y);
            repaint(); 
            System.out.println(hello.y);
        }
        if(e.getKeyCode() == KeyEvent.VK_S){
            hello.y=hello.y+1;
            hello.setLocation(hello.x,hello.y);
            repaint();  
        }
        if(e.getKeyCode() == KeyEvent.VK_A){
            hello.x=hello.x-1;
            hello.setLocation(hello.x,hello.y);
            repaint();      
        }
        if(e.getKeyCode() == KeyEvent.VK_D){
            hello.x=hello.x+1;
            hello.setLocation(hello.x,hello.y);
            repaint();

        }
        if(e.getKeyCode() == KeyEvent.VK_SPACE){
            goingon = true;
            repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_SPACE){
            goingon = false;
            repaint();
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }
}

首先修復油漆鏈...

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(new Color(255,25,0));
    g2.setFont(new Font("monospace", Font.BOLD+Font.ITALIC, 30));
    g2.drawString("nothing yet",300,320);
    g2.fill(hello);

接下來,停止在Paint方法中更改組件的狀態。

    //setFocusable(true);
    //requestFocus();
    g2.setColor(new Color(0,25,0));
    if (goingon == true){
    while (bullet.y < 1000){
        bullet.y=bullet.y+10;
        g2.fill(bullet);
    }
    bullet.y=300;



}

繪畫應該簡單地繪制組件的當前狀態,而絕不要嘗試修改組件的狀態,否則可能會觸發另一個繪制請求,這將使您的代碼陷入無限的繪制循環,並消耗您的CPU周期。

Swing使用被動渲染算法,這意味着僅在重新繪制管理器認為需要完成繪制時才執行繪制,這意味着可以隨意進行繪制,並且大多數情況下無需您干預。

基於您試圖將注意力集中到組件這一事實,我認為您正在嘗試克服與KeyListener相關的問題。 相反,您應該使用按鍵綁定API。 看看如何使用鍵綁定了解更多詳細信息

有關更多詳細信息,請參閱AWT中的繪畫以及“搖擺執行自定義繪畫 ”。

不要忘記在重寫的paintComponent()方法中調用super.paintComponent()來清除預覽視圖。

閱讀更多...

暫無
暫無

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

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