gpt4 book ai didi

javascript - 拖放无法正常工作processing.js

转载 作者:行者123 更新时间:2023-11-28 10:48:42 25 4
gpt4 key购买 nike

我想做的是,当鼠标按下鼠标位置时,使白色方 block 在 Canvas 上移动,但它不起作用。我知道我遗漏了一些东西,请你帮助我。这是我的代码:

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)在这里:

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;
}
}
}

最佳答案

将来,请准确地告诉我们您的代码的用途,以及当您说它不起作用时的确切含义。

但是让我们运行一下您的代码并弄清楚发生了什么。

首先,将类命名为 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 内。类,然后您需要使用该类中的变量来绘制每个矩形。

如果您在某个特定步骤上遇到困难,请发布另一个问题,其中包含更新后的代码,并详细说明您希望代码做什么、它会做什么以及这两件事有何不同。祝你好运。

关于javascript - 拖放无法正常工作processing.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37776280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com