[英]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。 看看如何使用鍵綁定了解更多詳細信息
不要忘記在重寫的paintComponent()
方法中調用super.paintComponent()
來清除預覽視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.