因此,我在使用继承JComponent的一个名为装饰的对象进行鼠标检测时遇到了问题,我正在使用java进行鼠标点击。awt。事件MouseEvent。
我和我的团队最好的解决方案是比较每个装饰品与鼠标的距离,如果它小于50(这是装饰品的半径),它会做些什么。
private class ME implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
for(int i = 0; i < ORNAMENT_AMOUNT; i++) {
Ornament current = oh.getOrnament(i);
int distance = (int)(Math.sqrt(((e.getX() - current.getX()) * (e.getX() - current.getX())) + ((e.getY() - current.getY()) * (e.getY() - current.getY()))));
if(distance <= 50) {
System.out.println("CIRCLE CLICKED!");
current.reset();
}
}
}
我所遇到的问题是,它根本无法正常工作。我多次点击同一个点,最终它会在其中一个装饰物上触发事件。它的随机性和混乱性。
这是装饰课
//ornament class to define the game object ornament
public class Ornament extends JComponent{
private int xPos;
private int yPos;
private int velocity;
private int screenWidth;
private int screenHeight;
private Random rand;
public Ornament(int screenWidth, int screenHeight, int velocity) {....}
public int getY() { return yPos; }
public int getX() { return xPos; }
@Override
public void paintComponent(Graphics graphics) {
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
super.paintComponent(graphics);
graphics.setColor(new Color(r, g, b));
graphics.fillOval(0, 0, 50, 50);
}
....
public void reset() {
this.yPos = -(int)(Math.random()*500);
this.xPos = (int)(Math.random()*screenWidth);
this.velocity += 1;
update();
}
}
我的整个方法可能是错误的,但它似乎在我的头脑中,所以帮助将不胜感激!:)
*注意:oh是我创建的一个objecthandler类,用于在具有一系列装饰的不同线程中运行游戏循环
public class ObjectHandler implements Runnable {
private int size;
private Ornament[] list;
private GUI game;
public ObjectHandler(int size, GUI game) {
....
list = new Ornament[size];
//init object list
for(int i = 0; i < size; i++) {
list[i] = new Ornament(game.getFrameX(), game.getFrameY(), game.getStartingVel());
game.add(list[i]);
}
}
public Ornament getOrnament(int index) { return list[index]; }
public void run() {
while(true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) { e.printStackTrace(); }
game.loadBackground();
for(int i = 0; i < size; i++) {
if(list[i].getY() >= game.getFrameY())
list[i].reset();
else
list[i].update();
}
}
}
}
谢谢大家的帮助!我使用了吉尔伯特·勒布朗的方法来实现这一点。
我从装饰类中删除了JComponent,而是创建了一个继承JPanel的类
ublic class GamePanel extends JPanel{
private Ornament[] objectList;
......
public GamePanel(GUI game) {
....
MouseListener ml = new MouseListener();
addMouseListener(ml);
this.setBounds(0, 0, 500, 500);
}
然后,我添加了一个绘制组件,并使用for循环渲染objectList数组中的每个装饰
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
.....
for(int i = 0; i < objectList.length; i++) {
Color c = new Color(objectList[i].r, objectList[i].g, objectList[i].b);
g2.setColor(c);
g2.fillOval(objectList[i].getX(), objectList[i].getY(), 50, 50);
}
}
}
此外,我还将mouselistener添加到JPanel组件中。使用相同的技术进行鼠标到对象的碰撞,效果很好!
class MouseListener extends MouseAdapter
{
@Override
public void mousePressed(MouseEvent e)
{
if(!gameOver) {
for(int i = 0; i < objectList.length; i++) {
int distance = (int)(Math.sqrt(((e.getX() - objectList[i].getX()) * (e.getX() - objectList[i].getX())) + ((e.getY() - objectList[i].getY()) * (e.getY() - objectList[i].getY()))));
if(distance <= 50) {
game.incScore();
objectList[i].reset();
}
}
...
}
}
向赫芬塔内斯和吉尔伯特·勒布朗克大声呼救!:)
问题内容: 有2个课程- 我试图在侦听器上设置鼠标单击,但是当我运行它然后按鼠标单击时,没有任何反应。 如何使其工作? 问题答案: 为了在框架上获得鼠标点击,您还需要添加到的框架列表中。创建后尝试添加以下行:
问题内容: 我有一个子类,正在使用它在屏幕上绘制形状。在构造函数中,我试图将和的 X 和 Y 大小值设置为一半,并且我认为做错了。我已经对此进行了很多查找,但找不到补救措施。代码如下。请记住,这是我第一次真正的Swing / Graphics2D创业。 问题答案: 覆盖您以返回您的首选大小,并从其宽度和高度的一半开始。为此,它在中调用。 附录:通过解释,当前的方法失败,因为从结果和是 无效的 ,直
Postgres 10和11的插入说明: 关于冲突[冲突目标]冲突行动 我有一张桌子: 而我想做的 但是我得到一个错误: ON CONFLICT DO UPDATE需要推理规范或约束名称提示:例如,ON CONFLICT(column_name) 为什么我必须提供一个确定的目标?如何提供主键或其他列集?
现在这种情况仍然发生,但很少发生,就像100次碰撞中有1次发生,而在100次碰撞中有20次发生之前
本文向大家介绍解决IDEA鼠标点击光标变大问题,包括了解决IDEA鼠标点击光标变大问题的使用技巧和注意事项,需要的朋友参考一下 这一定是困扰刚开始使用idea工具同学的一个大问题。 三种情况会导致这种问题出现。 1、你不小心按了键盘上的insert按键 解决: 再按一次吧 2、你idea上面装了vim插件,会产生冲突的 解决: 赶紧卸载了 3、你setting里面设置的 解决: 看下图,去掉勾 补
本文向大家介绍详解django模板与vue.js冲突问题,包括了详解django模板与vue.js冲突问题的使用技巧和注意事项,需要的朋友参考一下 问题: django模板与vue.js的变量都是使用“{{”和“}}”包裹起来的,在渲染django模板时会先替代掉所有的“{{”和“}}”及被包裹在其中的内容,使得vue.js没有使用”{{“、”}}”来绑定变量。 处理方法: 方法1:修改vue.j