猿问

如何在 Swing 中正确移动绘制的多边形

我目前正在开发一款 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什么都不做。


郎朗坤
浏览 139回答 2
2回答

繁星coding

如果您从这个问题恢复到您的Piece代码,您可以通过以下方式移动片段:@Overridepublic void keyPressed(KeyEvent e) {&nbsp; &nbsp; switch (e.getKeyCode()) {&nbsp; &nbsp; case KeyEvent.VK_UP:&nbsp; &nbsp; &nbsp; &nbsp; view.translatePiece(0, -100);&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case KeyEvent.VK_DOWN:&nbsp; &nbsp; &nbsp; &nbsp; view.translatePiece(0, +100);&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case KeyEvent.VK_LEFT:&nbsp; &nbsp; &nbsp; &nbsp; view.translatePiece(-100, 0);&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; case KeyEvent.VK_RIGHT:&nbsp; &nbsp; &nbsp; &nbsp; view.translatePiece(+100, 0);&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; }}并添加到您的视图中:void translatePiece(int dx, int dy) {&nbsp; &nbsp; if (current != null) {&nbsp; &nbsp; &nbsp; &nbsp; current.x += dx;&nbsp; &nbsp; &nbsp; &nbsp; current.y += dy;&nbsp; &nbsp; &nbsp; &nbsp; repaint();&nbsp; &nbsp; }}如果您在单击某个片段之前按下箭头键,该if (current != null) { ... }测试将防止您的应用程序崩溃,它目前正在执行此操作。

守着一只汪

你可以,而不是翻译多边形,翻译位置,并将其用于绘画:在keyPressed中,替换current.translate以平移位置而不是整个多边形(例如,您可以覆盖Piece#translate调用current.getLocation().translate)。在View#paintComponent中,替换:needle.translate(needle.getLocation().x,&nbsp;needle.getLocation().y);和gc.translate(needle.getLocation().x,&nbsp;needle.getLocation().y);并添加gc.translate(-needle.getLocation().x,&nbsp;-needle.getLocation().y);在你的 for 循环结束时。这会将整体转换Graphics2D为绘制多边形,然后将其还原。
随时随地看视频慕课网APP

相关分类

Java
我要回答