我要做的是当用鼠标位置按下鼠标但是它不起作用时,使白色方块在画布上移动。我知道我错过了什么并请你帮助我。这是我的代码:
Object o;
int[][] back =new int[3][3];
int pad = 10, bs=100; //len=pad*(back.length+1)+bs*back.length; za dinamichno resaizvane na ekrana
boolean drag = false;
void setup() {
size(400, 400);
noStroke();
o = new Object();
}
void draw() {
rectt(0, 0, width, height, color(100));
for (int row=0; row<back.length; row++)
for (int coll=0; coll<back[row].length; coll++) {
float x = pad+(pad+bs)*coll;
float y = pad+(pad+bs)*row;
rectt(x, y, bs, bs, color(150));
if (mouseX >=x && mouseX<=x+width/x*coll+bs
&& mouseY>=y && mouseY<=y+height/y*row+bs) {
rectt(x, y, bs, bs, color(255, 0, 0));
}
}
o.show();
//o.over();
}
void rectt(float x, float y, float w, float h, color c) {
fill(c);
rect(x, y, w, h);
}
void mousePressed() {
o.drag();
}
并且课程在这里:
class Object {
float size = 50;
float x;
float y;
// boolean d = false;
Object() {
x = width -60;
y = height -60;
}
void show() {
fill(255);
rect(x, y, size, size);
}
void drag() {
if ( mouseX >= x && mouseX <= x+size && mouseY <= y+size && mouseY >= y && mousePressed ) {
x = mouseX;
y = mouseY;
}
}
}
答案 0 :(得分:0)
将来,请准确告诉我们您的代码的作用,以及当您说它不起作用时的确切含义。
但是,让我们查看您的代码,找出正在发生的事情。
首先,为您的班级Object
命名是个不错的主意。它可能实际上不会伤害任何东西,特别是使用Processing.js,但更安全而不是遗憾。所以我要将其重命名为Rectangle
。
之后,您的主要问题来自于您拥有两个的x
和y
坐标集。第一个来自你的循环:
float x = pad+(pad+bs)*coll;
float y = pad+(pad+bs)*row;
使用第一组坐标绘制矩形。但是你在Rectangle
类中有第二组坐标:
x = width -60;
y = height -60;
您在拖动逻辑中使用第二个集合,但之后您永远不会使用它们来绘制矩形。更一般地说,您似乎根本不使用show()
函数。你希望那个矩形出现在哪里?
此外,您只能实例化一个Rectangle
实例。您在for循环中绘制的矩形与您创建的Rectangle
无关。
因此,要解决您的问题,您需要做一些事情。
第1步:为要绘制到屏幕的每个矩形创建一个Rectangle
实例。换句话说,您需要创建一个ArrayList
来保存9个Rectangle
个实例,而不是一个。
将它放在草图的顶部:
ArrayList<Rectangle> rectangles = new ArrayList<Rectangle>();
你永远不会使用你的back
变量,所以你可以摆脱它。
将其放入setup()
功能:
for (int row=0; row<back.length; row++) {
for (int coll=0; coll<back[row].length; coll++) {
float x = pad+(pad+bs)*coll;
float y = pad+(pad+bs)*row;
Rectangle rectangle = new Rectangle(x, y);
rectangles.add(rectangle);
}
}
此代码遍历坐标并在该位置创建Rectangle
的实例,然后将其添加到ArrayList
。您还必须将参数添加到Rectangle
构造函数。
第2步:然后,您可以缩短draw()
功能,只需循环遍历Rectangle
中的ArrayList
个实例并绘制它们:
void draw() {
background(100);
for (Rectangle r : rectangles) {
r.show();
}
}
第3步:修改您的show()
功能,以包含基于鼠标位置为Rectangle
着色的逻辑:
void show() {
if (mouseX >=x && mouseX<=x+size && mouseY>=y && mouseY<=y+size) {
//mouse is inside this Rectangle
rectt(x, y, size, size, color(255, 0, 0));
} else {
rectt(x, y, size, size, color(150));
}
}
了解每个Rectangle
如何根据其位置以及鼠标是否位于其中来了解自己。我们所有的逻辑都在这个类中,而不是分成两个地方。
第4步:然后,您可以在if语句中添加拖动逻辑。如果光标位于Rectangle
内并且正在按下鼠标,则表示用户正在拖动Rectangle
:
//mouse is inside this Rectangle
if (mousePressed) {
x = mouseX - size/2;
y = mouseY - size/2;
}
请注意,我是在常规处理中执行此操作,而不是在Processing.js中执行此操作,因此您可能需要进行一些小的调整,例如使用mouseIsPressed
而不是mousePressed
。但基本步骤是相同的:您需要在Rectangle
类中移动逻辑,然后需要使用该类中的变量来绘制每个矩形。
如果您遇到某个特定步骤,请发布另一个问题,其中包含您的更新代码以及您希望代码完成的内容,代码的作用以及这两者的不同之处。祝你好运。
答案 1 :(得分:-1)
您可以在此处找到答案:https://processing.org/examples/mousefunctions.html
但我会记住你不能在Object中使用鼠标事件。 mouse-click-on-object