为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号