我目前正在開發一款 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 回答

守著一只汪
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
為繪制多邊形,然后將其還原。
添加回答
舉報
0/150
提交
取消