- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试开发一个谜题。我得到的只是我的应用程序以及我的游戏 field 和游戏组件。下一步是单击我的一个游戏 block 以选择它,并能够使用箭头键移动它(此外,我希望它们仅移动,如果下一步(将是 100 像素)不包含任何其他游戏件)。
我当前遇到的问题:在我的主 JPanel
上使用 addMouseListener()
,然后使用 getSource()
仅返回我的Playing-field(在我的代码中称为 View
),但我需要它返回所需的游戏 block (例如 topLeft
)。我已经尝试将 getSource()
转换为 Piece
,但这不起作用(无法将 View 转换为 Piece
)。
因此,我需要找到一种方法来添加鼠标监听器,该监听器返回被单击的游戏 block ,以便我可以更改位置并检查与任何其他游戏 block 的任何碰撞。提前致谢!
感谢@camickr编辑了代码。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
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.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);
}
private final static int[] SHAPE_X = { -100, 100, 100, 0, 0, -100 };
private final static int[] SHAPE_Y = { -100, -100, 0, 0, 100, 100 };
public Puzzle() {
JFrame frame = new JFrame("Puzzle");
frame.setSize(400, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
View view = new View();
frame.setContentPane(view);
view.addMouseListener(new MouseAdapterMod(view));
Shape polyShape = new Polygon(SHAPE_X, SHAPE_Y, SHAPE_X.length);
Piece topLeft = new Piece(Color.YELLOW, polyShape, 0, 100, 100);
view.pieces.add(topLeft);
Piece topRight = new Piece(Color.CYAN, polyShape, 90, 300, 100);
view.pieces.add(topRight);
Piece bottomRight = new Piece(Color.GREEN, polyShape, 180, 300, 300);
view.pieces.add(bottomRight);
Piece bottomLeft = new Piece(Color.RED, polyShape, 270, 100, 300);
view.pieces.add(bottomLeft);
Piece square = new Piece(Color.ORANGE, new Rectangle(200, 200), 0, 100, 100);
view.pieces.add(square);
frame.setVisible(true);
}
}
class View extends JPanel {
final List<Piece> pieces = new ArrayList<>();
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gc = (Graphics2D) g;
for (Piece piece : pieces) {
piece.draw(gc);
}
}
}
class Piece {
final Color color;
final Shape shape;
final int angle;
int x;
int y;
Piece(Color color, Shape shape, int angle, int x, int y) {
this.color = color;
this.shape = shape;
this.angle = angle;
this.x = x;
this.y = y;
}
void draw(Graphics2D gc) {
AffineTransform tf = gc.getTransform();
gc.translate(x, y);
gc.rotate(Math.toRadians(angle));
gc.setColor(color);
gc.fill(shape);
gc.setTransform(tf);
}
Shape getShape() {
return shape;
}
}
class MouseAdapterMod extends MouseAdapter {
final View view;
public MouseAdapterMod(View view) {
this.view = view;
}
@Override
public void mousePressed(MouseEvent e) {
for(Piece piece : view.pieces) {
if(piece.getShape().contains(e.getX(), e.getY())) {
System.out.println("yes");
}
}
}
}
最佳答案
So, I need to find a way to add a mouse listener which returns the gaming-piece that was clicked
您可以使用 MouseEvent 中的 getX() 和 getY() 方法。
然后,您迭代“ block ”ArrayList,并对每个 Piece
中包含的 Shape
调用 contains(...
方法查看鼠标点是否包含在棋子中。
因此,您还需要向“Piece”类添加一个 getShape(...)
方法,以便可以访问每个 Piece 的
.Shape
编辑:
所以你的基本逻辑可能是这样的:
//Shape polyShape = new Polygon(SHAPE_X, SHAPE_Y, SHAPE_X.length);
//Piece topLeft = new Piece(Color.YELLOW, polyShape, 0, 100, 100);
Polygon topLeftPolygon = new Polygon(SHAPE_X, SHAPE_Y, SHAPE_X.length);
topLeftPolygon.translate(100, 100);
//topLeftPolygon = ShapeUtils.rotate(...); // do rotation when required
Piece topLeft = new Piece(Color.YELLOW, topLeftPolygon);
那么draw(..)方法中的绘画代码就是:
gc.setColor(color);
gc.fill(shape);
无需转换或翻译。
编辑2:
所以使用形状:
//topLeftPolygon = ShapeUtils.rotate(...); // do rotation when required
//Piece topLeft = new Piece(Color.YELLOW, topLeftPolygon);
Shape topLeftShape = ShapeUtils.rotate(...); // do rotation when required
Piece topLeft = new Piece(Color.YELLOW, topLeftShape);
这当前与您的 Piece 类匹配,无论如何它都需要一个 Shape 对象。请考虑所建议的概念,不要假设发布的代码是完美的,因为它显然尚未经过测试。
关于Java Swing mousePressed 和 getSource() 未在 JPanel 上显示绘制的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55003607/
如何检查用户是否在按下鼠标的同一按钮上释放了鼠标? 我想处理用户单击button1,继续按住鼠标按钮,然后拖动到button2并在button2上释放鼠标的情况,其中 button1 和 button
在 Twig 中,您可以使用函数 getSource() 获取模板的源代码。 但是有没有办法获取特定块的源代码,而不是使用 {% verbatim %} (我希望模板可以工作,但也要读取块的源代码)
我不知道我在这里做错了什么。只是制作一个简单的程序来测试游戏的概念,我试图让三个按钮在单击时具有三个不同的输出。但是,对于按钮一、二和三,我收到一条错误消息,指出它们无法解析为变量。我不知道该怎么办。
我决定是时候学习如何用 java 制作 GUI 了。一切进展顺利,直到我开始设置我的 ActionListener。 这是我的actionListener类: import java.awt.even
我想了解更多关于 e.getSource() 如何在 ActionListener 类中工作的信息,我的代码在这里: public class ActionController implements
我正在尝试制作一个小程序来计算您单击按钮的次数,但 ActionListener 似乎无法正常工作。这段代码看起来可以工作,但由于某种原因,当我单击小程序中的按钮时,控制台中没有打印任何内容,也没有在
我有一个带有 2 个 JButton 的 GUI,我想知道哪一个正在使用 getSource 方法触发事件。我在 Google 上查找了问题的解决方案,但找不到,这是我的代码: @Override p
我想跟踪按特定顺序单击的特定组件。 我正在使用 getSource 和这样的标志: public void actionPerformed(ActionEvent e) { JButton q = (
运行这个文件 foo.py import inspect class Parent(object): def source1(self): class A(object):
什么是 getSource?它返回什么? 什么是 getActionCommand() 以及它返回什么?? 我对这两者感到困惑,任何人都可以给我或区分它们吗? UI 中的 getSource 和 ge
本文整理了Java中javafx.concurrent.WorkerStateEvent.getSource()方法的一些代码示例,展示了WorkerStateEvent.getSource()的具体
我有一个包含 JButton 的类。这是无法更改的。 问题是这样的:actionListener 调用 getSource() 并获取 JButton,而不是容器类。 在添加 actionListen
我正在创建一个KeyListener类,这样我就可以控制任何我想要的JTextField,但我不知道如何获取任何JTextField我打电话以便可以按转义键并清除 JTextField?这是我当前的代
我正在尝试为我遇到的问题创建一个看起来不错的解决方案。我可以用文字解释,但是代码会更清晰: public void actionPerformed(ActionEvent e) {
我在尝试插入时收到以下错误: java.lang.NoSuchMethodError : org.hibernate.event.PreInsertEvent.getSource()Lorg/hibe
我在 Java 代码中经常遇到问题。每当我尝试在程序上使用按钮时,它们都不起作用,我认为问题出在 event.getSource() 但我找不到它。这是我的完整代码: import java.awt.
我做了两个文件: #test_func.py def test(): print('hello') 和 #test_inspect.py import inspect import test_
我尝试使用 inspect 检索 list 类的源代码模块,没有成功: >>> import inspect >>> inspect.getsource(list) Traceback (most r
我用了simpl.info代码为例。在他们的示例中,我可以在“视频源”选择中看到“TOSHIBA Web Camera - HD (13d3:5606)”。因此,他们可以检索源的标签属性。我可以很容易
本文整理了Java中org.apache.woden.XMLElement.getSource()方法的一些代码示例,展示了XMLElement.getSource()的具体用法。这些代码示例主要来源
我是一名优秀的程序员,十分优秀!