簡體   English   中英

如何檢查我在 Java 中單擊了這 4 個三角形中的哪一個?

[英]How can I check in which of these 4 triangles I clicked in Java?

所以我有一個游戲,我想檢查玩家點擊了哪個一般區域。 我打算使用 4 個三角形,它們在玩家位置上都有 1 個點,在當前可見區域的角上有另外 2 個點。 我有一種方法可以為我提供 Click 的 xPos 和 yPos,而且我還知道我的 Player 的 xPos 和 yPos。 現在,無論我如何嘗試計算點擊在哪個三角形中,我都無法區分將屏幕切成四個的 4 個矩形的 2 個半部分。 我可以通過任何方式檢查我點擊的哪個區域對我有用,所以如果我監督一個更簡單的方法而不是使用它的位置來計算它,那么請告訴我。 提前致謝

4 個三角形的粗略草圖

很大程度上取決於您對 UI 框架的選擇。 例如 Swing 和 JavaFX 都有一個基於“形狀”的 API,它非常強大並提供了許多有用的功能,包括“命中檢測”

例如...

ClicityClack

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

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

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private List<Triangle> triangles;
        private Triangle selectedTriangle;

        public TestPane() {
            triangles = new ArrayList<>(128);
            triangles.add(new Triangle(10, 10, 50, 50, 0));
            triangles.add(new Triangle(70, 10, 50, 50, 180));
            triangles.add(new Triangle(130, 10, 50, 50, 0));

            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    selectedTriangle = null;
                    Point p = e.getPoint();
                    for (Triangle triangle : triangles) {
                        Shape shape = triangle.getTransformedShape();
                        if (shape.contains(p)) {
                            selectedTriangle = triangle;
                            break;
                        }
                    }
                    repaint();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            Area area = new Area();
            for (Triangle triangle : triangles) {
                area.add(new Area(triangle.getTransformedShape()));
            }

            Rectangle bounds = area.getBounds();
            int width = 10 + bounds.x + bounds.width;
            int height = 10 + bounds.y + bounds.height;

            return new Dimension(width, height);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            for (Triangle triangle : triangles) {
                Shape shape = triangle.getTransformedShape();

                if (triangle == selectedTriangle) {
                    g2d.setColor(Color.GREEN);
                } else {
                    g2d.setColor(Color.YELLOW);
                }

                g2d.fill(shape);
                g2d.setColor(Color.RED);
                g2d.draw(shape);
            }
            g2d.dispose();
        }

    }

    public class Triangle extends Path2D.Double {

        private double x;
        private double y;

        private double angle;

        public Triangle(double x, double y, double width, double height, double angle) {
            this.x = x;
            this.y = y;
            this.angle = angle;

            moveTo(width / 2, 0);
            lineTo(width, height);
            lineTo(0, height);
            lineTo(width / 2, 0);
            closePath();
        }

        public Shape getTransformedShape() {
            AffineTransform at = AffineTransform.getTranslateInstance(getX(), getY());
            at.rotate(Math.toRadians(angle), getBounds().width / 2, getBounds().height / 2);
            return at.createTransformedShape(this);
        }

        public double getX() {
            return x;
        }

        public double getY() {
            return y;
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM