一.数组
数组是一组拥有一个共同名称的变量。数组非常有用,因为它们让工作变得更简单,无需为每个变量创建一个新的名称。这让代码变得更加简短、更容易理解、更方便更新。
1.1从变量到数组
当一个程序只需要追踪一两个变量时,它不需要使用数组。因为事实上,如果添加一个没有必要使用的数组可能会让程序变得更加复杂。如果需要更多的元素时就需要使用数组。
1.2两个变量
案例代码如图1
图1
保存并运行如图2
图2
1.3许多变量
1.2案例中只有两个变量,运行时有两个图形,如果我们需要四个图形,那我们需要在之前的基础上添加更多的变量。
案例代码如下
float x1=-20;
float x2=10;
float x3=50;
float x4=90;
void setup(){
size(240,120);
noStroke();
}
void draw(){
background(0);
x1+=0.5;
x2+=0.5;
x3+=0.5;
x4+=0.5;
arc(x1,20,40,40,0.52,5.76);
arc(x2,50,40,40,0.52,5.76);
arc(x3,70,40,40,0.52,5.76);
arc(x4,90,40,40,0.52,5.76);
}
保存并运行如图3
图3
4个变量看起来还好,如果越来越多呢?这时候就需要引入数组了。
1.4使用数组,让代码变得简单。
案例代码如下
float x1=-20;
float x2=10;
float []x=new float[3000];
void setup(){
size(240,120);
noStroke();
fill(255,200);
for(int i=0;i<x.length;i++){
x[i]=random(-1000,200);
}
}
void draw(){
background(0);
for(int i=0;i<x.length;i++){
x[i]+=0.5;
float y=i*0.4;
arc(x[i],y,12,12,0.52,5.76);
}
}
保存并运行如图4
图4
二.创建数组
每一个在数组里面的项目被称为元素,每一个元素都有索引值,用来标记其在数组中的位置。索引值从数组的0开始计数。第一个元素在数组中的索引值为0,第二个是1.以此类推,如果有20个数值在数组中,那么最有一个元素的索引值为19.
2.1创建数组步骤
(1)声明数组,定义数据类型。
(2)利用关键字new创建数组,并且定义数组长度。
(3)给每个元素赋值。
2.2给一个数组声明和赋值
首先我们现在setup()函数的外面声明数组,然后再setup()函数里面创建并赋值。语法x[0]指向数组里面的第一个元素,语法x[1]指向第二个元素。
案例代码如下:
int[ ] x; //声明数组
void setup(){
size(200,200);
x=new int[2];//创建数组
x[0]=12;//给数组第一个元素赋值
x[1]=2;//给数组第二个元素赋值
}
2.3简化数组赋值
案例代码如下:
int[ ] x=new int[2]; //声明和创建数组
void setup(){
size(200,200);
x[0]=12;//给数组第一个元素赋值
x[1]=2;//给数组第二个元素赋值
}
2.4同时声明、创建、赋值
案例代码如下:
int[ ] x={12,2}; //声明、创建、赋值数组
void setup(){
size(200,200);
}
注意:避免在draw()函数里创建数组,因为在每一帧上新建一个数组都会降低帧率。
2.5使用数组修改1.1案例
修改后案例代码如图5
图5
保存并运行如图6
图6
三.循环和数组
写一个循环遍历数组中每一个元素。为了实现效果需要知道数组的长度。与数组相关关键词存储着这些元素的个数。我们使用数组的名称和点操作符(.)来获取这个值。
例如:
int[ ] x=new int[2];//声明和创建数组
println(x.length);//在控制台中输出2
3.1一个循环里填入一个数组
案例代码如图7
图7
保存并运行如图8
图8
在本例中数组先是在setup()函数中被一些随机的数字填充,接下来这些数字被用来设置draw()函数内的stroke()值。每运行一次,一组新的随机数字都会放入这个数组。
3.2追踪鼠标移动
案例代码如下:
int num=60;
int[]x=new int[num];
int[]y=new int[num];
void setup(){
size(240,120);
noStroke();
}
void draw(){
background(0);
//从后往前复制数组
for(int i=x.length-1;i>0;i--){
x[i]=x[i-1];
y[i]=y[i-1];
x[0]= mouseX;//设置第一个元素
y[0]= mouseY;//设置第一个元素
for(int i=0;i<x.length;i++){
fill(i*4);
ellipse(x[i],y[i],40,40);
}
}
保存并运行如图9
图9
本案例中,有两个数组用来存储鼠标状态,一个是存储x,一个存储y。这些数据存储鼠标在过去60帧内的位置。每出现新的一帧,保存最旧的x坐标、y坐标都会清除并被现在的mouseX和mouseY代替,新的值则是被添到数组的第一个位置。
3.3管理多个对象
案例代码如图下
JitterBug[] bugs=new JitterBug[33];
void setup(){
size(240,120);
for(int i=0;i<bugs.length;i++){
float x=random(width);
float y=random(height);
int r=i+2;
bugs[i]=new JitterBug(x,y,r);
}
}
void draw(){
for(int i=0;i<bugs.length;i++){
bugs[i].move();
bugs[i].display();
}
}
class JitterBug{
float x;
float y;
int diameter;
float speed=2.5;
JitterBug(float tempX,float tempY,int tempDiameter){
x=tempX;
y=tempY;
diameter=tempDiameter;
}
void move(){
x+=random(-speed,speed);
y+=random(-speed,speed);
}
void display(){
ellipse(x,y,diameter,diameter);
}
}
保存并运行如图10
图10