[英]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 個半部分。 我可以通過任何方式檢查我點擊的哪個區域對我有用,所以如果我監督一個更簡單的方法而不是使用它的位置來計算它,那么請告訴我。 提前致謝
很大程度上取決於您對 UI 框架的選擇。 例如 Swing 和 JavaFX 都有一個基於“形狀”的 API,它非常強大並提供了許多有用的功能,包括“命中檢測”
例如...
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.