如何只在某个区域画东西?

时间:2014-06-02 03:27:09

标签: java canvas draw area

我正在进行塔防游戏,我会有一些标记,可以根据放置的位置在游戏网格之外绘制。我一直在一个画布上绘制一切,这是我的游戏类,我想知道是否有一种方法我只能在一个设定区域绘制某些东西(在这种情况下是我的游戏网格)。

为了更好地解释它,如果要在游戏网格的边缘绘制一个圆圈,就像要切断的悬垂一样。

我的gui是什么样的:

Maze

1 个答案:

答案 0 :(得分:0)

一种方法可能是调整Graphics上下文的剪辑。我个人而言,不喜欢弄乱这个片段,因为如果你不小心的话,它会严重搞砸你。

请查看Clipping the Drawing Region了解详情

剪辑示例

Clipping

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestClip {

    public static void main(String[] args) {
        new TestClip();
    }

    public TestClip() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage img;

        public TestPane() {
            setBackground(Color.BLACK);
            try {
                img = ImageIO.read(new File("Lurk.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.RED);
            g2d.drawRect(100, 100, 200, 200);
            g2d.setClip(101, 101, 199, 199);
            g2d.drawImage(img, 300 - (img.getWidth() / 2), (getHeight() - img.getHeight()) / 2, this);
            g2d.dispose();
        }
    }

}

另一种方法可能是生成一个透明的BufferedImage作为一个图层,你可以确保你想要限制绘画的正确尺寸,将那些额外的元素绘制到它上面并绘制结果{ {1}}位于地图顶部

图层示例

Layer

BufferedImage