在处理中我正在尝试创建一个显示x个形状的可视化。由于数量可能很大并且不确定,我想以编程方式创建它们(使用循环)。这看起来像这样:
First firstDot1;
float offset;
float radius = 0;
float endRad = 100;
float speed = 0.1;
String[] lines,colors;
void setup(){
size(800,600);
smooth();
background(255);
firstDot1 = new First(5);
}
void draw(){
background(255);
for(int z=0; z<36; z++){
offset = z * 10;
firstDot1.display();
firstDot1.start(offset);
}
}
class First{
float angle;
int id;
float eRad = 5;
float xpos, ypos, rad, i;
Boolean start = true;
First(float tempAngle){
angle = tempAngle;
}
void display(){
noStroke();
fill(247,147,30);
ellipseMode(CENTER);
ellipse(xpos, ypos, eRad, eRad);
}
void start(float offset){
if(i<endRad){
i = i+speed/2;
xpos = width/2 + cos(radians(-angle+offset))*(radius+i);
ypos = height/2 + sin(radians(-angle+offset))*(radius+i);
}
else{
turn(offset);
}
}
void turn(float offset){
angle = angle-speed/50;
xpos = width/2 + cos(radians(-angle+offset))*(endRad);
ypos = height/2 + sin(radians(-angle+offset))*(endRad);
}
}
这可以通过显示36个椭圆来实现。让我们说为了简单起见,我想通过点击它来改变一个圆圈的颜色。
如何使用当前代码实现此目的?或者,我可以以何种方式以编程方式创建这些对象(而不是手动定义它们),以便我可以单独与它们进行交互?
答案 0 :(得分:3)
您需要创建First对象数组:
First[] dots = new First[36];//declare and initialize an array of First object with size/length 36
然后你需要数组中的初始化对象:
for(int i = 0 ; i < dots.length; i++) dots[i] = new First(5);
之后,您可以使用数组表示法([]
)按名称访问数组中的对象。
请务必查看示例&gt;基础知识&gt;数组&gt; ArrayObjects 即可。
这正是你要找的东西。
关于与对象的交互,您可以跟踪每个对象的鼠标位置和鼠标状态(是否按下它)以基于此更新对象的状态。悬停的基本方法是检查鼠标到对象的距离是否小于对象的半径(适用于对象)。如果鼠标足够接近并按下它,则可以更新对象的状态以显示按下。
以下是一些尝试的代码:
First[] dots;
float offset;
float radius = 0;
float endRad = 100;
float speed = 0.1;
String[] lines,colors;
void setup(){
size(800,600);
smooth();
background(255);
dots = new First[36];
for(int i = 0 ; i < dots.length; i++) dots[i] = new First(5);
}
void draw(){
background(255);
for(int z=0; z<36; z++){
offset = z * 10;
dots[z].update(mouseX,mouseY,mousePressed);
dots[z].display();
dots[z].start(offset);
}
}
class First{
float angle;
int id;
float eRad = 5;
float xpos, ypos, rad, i;
Boolean start = true;
color up = color(247,147,30);
color over = color(0);
color down = color(217,117,0);
boolean isOver,isDown;
First(float tempAngle){
angle = tempAngle;
}
void update(int mx,int my,boolean pressed){
isOver = (dist(mx,my,xpos,ypos) < eRad);
isDown = pressed;
}
void display(){
noStroke();
fill(up);//default
if(isOver) fill(over);
if(isOver && isDown) fill(down);
ellipseMode(CENTER);
ellipse(xpos, ypos, eRad, eRad);
}
void start(float offset){
if(i<endRad){
i = i+speed/2;
xpos = width/2 + cos(radians(-angle+offset))*(radius+i);
ypos = height/2 + sin(radians(-angle+offset))*(radius+i);
}
else{
turn(offset);
}
}
void turn(float offset){
angle = angle-speed/50;
xpos = width/2 + cos(radians(-angle+offset))*(endRad);
ypos = height/2 + sin(radians(-angle+offset))*(endRad);
}
}
另外,请查看示例&gt;主题&gt; GUI&gt;按钮强>