亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Swing 中正確移動繪制的多邊形

如何在 Swing 中正確移動繪制的多邊形

郎朗坤 2022-07-20 21:02:57
我目前正在開發一款 2D 游戲,這將是一個難題。我把所有東西都設置好了,把我所有的部分都添加到我的板上(稱為View),它們都正確對齊。我的下一步是選擇一塊,MouseEvent#mousePressed以便能夠使用箭頭鍵移動它KeyEvent#keyPressed。我目前遇到的問題是,每當我移動或調整窗口大小時,我的作品都會自行重新繪制。如果我點擊一個塊并想要移動它,其他塊也會移動(在某種程度上,它們不應該移動,因為一個步驟等于大約 100 像素)。如果有人能告訴我我的問題在哪里并給我一些建議,我將不勝感激。import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Polygon;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.util.ArrayList;import java.util.List;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.SwingUtilities;public class Puzzle {    public static void main(String[] args) {    SwingUtilities.invokeLater(Puzzle::new);    }    public Puzzle() {    JFrame frame = new JFrame("Puzzle");    frame.setSize(400, 600);    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    View view = new View();    view.createPieces();    frame.setContentPane(view);    view.setFocusable(true);    MouseAdapterMod listener = new MouseAdapterMod(view);    view.addMouseListener(listener);    view.addKeyListener(listener);    frame.setVisible(true);    }}class View extends JPanel {    final List<Piece> pieces = new ArrayList<>();    public View() {    }    void createPieces() {    Piece topLeft = new Piece(100, 100, 0, Color.YELLOW);    pieces.add(topLeft);    }    @Override    protected void paintComponent(Graphics g) {    super.paintComponent(g);    Graphics2D gc = (Graphics2D) g;    for (Piece needle : pieces) {        needle.translate(needle.getLocation().x, needle.getLocation().y);        gc.setColor(needle.color);        gc.fill(needle);        gc.draw(needle);    }    }}編輯:但問題是,最終我想移動我的作品Piece#setLocation以始終跟蹤它們當前的 x/y 坐標。我想,我需要Piece#getLocation在我的繪畫中調用以根據位置繪制它們,但我不知道如何。從字面上使用Piece#setLocation什么都不做。
查看完整描述

2 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

如果您從這個問題恢復到您的Piece代碼,您可以通過以下方式移動片段:


@Override

public void keyPressed(KeyEvent e) {

    switch (e.getKeyCode()) {

    case KeyEvent.VK_UP:

        view.translatePiece(0, -100);

        break;

    case KeyEvent.VK_DOWN:

        view.translatePiece(0, +100);

        break;

    case KeyEvent.VK_LEFT:

        view.translatePiece(-100, 0);

        break;

    case KeyEvent.VK_RIGHT:

        view.translatePiece(+100, 0);

        break;

    }

}

并添加到您的視圖中:


void translatePiece(int dx, int dy) {

    if (current != null) {

        current.x += dx;

        current.y += dy;

        repaint();

    }

}

如果您在單擊某個片段之前按下箭頭鍵,該if (current != null) { ... }測試將防止您的應用程序崩潰,它目前正在執行此操作。


查看完整回答
反對 回復 2022-07-20
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

你可以,而不是翻譯多邊形,翻譯位置,并將其用于繪畫:

keyPressed中,替換current.translate以平移位置而不是整個多邊形(例如,您可以覆蓋Piece#translate調用current.getLocation().translate)。

View#paintComponent中,替換:

needle.translate(needle.getLocation().x, needle.getLocation().y);

gc.translate(needle.getLocation().x, needle.getLocation().y);

并添加

gc.translate(-needle.getLocation().x, -needle.getLocation().y);

在你的 for 循環結束時。這會將整體轉換Graphics2D為繪制多邊形,然后將其還原。


查看完整回答
反對 回復 2022-07-20
  • 2 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號