Processing:数组(下)

12. ok,现在来做100辆车吧:

pr9-3
pr9-3

Car[] cars = new Car[100]; // 由100个cars对象组成的数组!

void setup() {
size(200,200);
smooth();
for (int i = 0; i < cars.length; i ++ ) { // 用for循环初始化100辆车.
cars[i] = new Car(color(i*2),0,i*2,i/20.0);
}
}

void draw() {
background(255);
for (int i = 0; i < cars.length; i ++ ) { // 用for循环跑每一辆车.
cars[i].move();
cars[i].display();
}
}

当然,你的Car类还是放在一边,不需要改动任何参数,无论我们只跑1辆车,还是同时跑100辆,甚至1000辆车。

13. 当你设计你的类的时候,运用布尔变量来变换一个对象的属性是很方便的。例如,一个Car对象是跑还是不跑,Zoog可能高兴或不高兴。

pr9-4
pr9-4

14. 好的,来运用上边说的,继续来看超长晕眩代码。。。
// 一个stripes的数组
Stripe[] stripes = new Stripe[70];

void setup() {
size(200,200);

// Initialize all Stripe objects
for (int i = 0; i < stripes.length; i ++ ) {
stripes[i] = new Stripe();
}
}

void draw() {

background(30);
// 移动并显示所有stripes数组
for (int i = 0; i < stripes.length; i ++ ) { // 检查鼠标是否位于条纹上 stripes[i].rollover(mouseX,mouseY); // 将鼠标坐标传递进入一个对象
stripes[i].move(); stripes[i].display();
}
}

class Stripe {
float x; // 条纹的水平坐标值
float speed; // 条纹的移动速度
float w; // 条纹的宽度
// 一个布尔变量持续捕捉对象的状态.
boolean mouse; // 条纹的状态(鼠标是否位于条纹上?)

Stripe() {
// 所有条纹始于0
x = 0;
// 所有条纹都有一个随机的正向移动速度
speed = random(1);
w = random(10,30);
mouse = false;
}

// 绘制条纹
void display() {
// 布尔变量决定条纹颜色
if (mouse) {
fill(255);
} else {
fill(255-x,100+w,x);
}

noStroke();
rect(x,0,w,height);
}

// 移动条纹
void move() {
x += speed;
if (x > width + 20)
x = -20;
}

// 检查点(mx,my)是否位于条纹内.
void rollover(int mx, int my) {
// 条纹左沿是x, 右沿是x + w
if (mx > x && mx < x + w) {
mouse = true;
} else {
mouse = false;
}
}
}

pr9-5
pr9-5

15. 数组有一些函数可用于控制它的大小,它们是:horten( ), concat( ), subset( ), append( ), splice( ), expand( ) 。此外还有可以改变数组顺序的函数,比如sort( )reverse( ) 。Daniel这里偷懒了,告诉我们这些所有的函数都能在pr的参考里找到(废话。。),然后举了这么一个例子(使用append( )增大数组):
Ball[] balls = new Ball[1]; // 我们从仅有一个元素的数组开始.
float gravity = 0.1;

void setup() {
size(200,200);
smooth();

// 初始化0号球
balls[0] = new Ball(50,0,16);
}

void draw() {
background(255);

// 更新并显示所有的球
for (int i = 0; i < balls.length; i ++ ) {
// 无论数组有多长,更新并显示所有的元素.
balls[i].gravity();
balls[i].move();
balls[i].display();
}
}

void mousePressed() {
// 一个新的ball对象
Ball b = new Ball(mouseX,mouseY,random(10,30)); // 在鼠标位置制造一个新对象.
balls = (Ball[]) append(balls,b);
// 这里,函数append() 在数组的末尾增加了一个元素.
// append() 使用了两个引数. 第一个是你希望附加的数组, 第二是你希望附加的东西.
// 你需要将append() 得到的结果重新分配给最初的数组.
// 另外, append()函数要求你通过向圆括号内填入数组数据类型((Ball[]))的方式再次清楚的表述数组里的数据类型。
//这一过程叫做投掷(casting)
}

class Ball {
float x;
float y;
float speed;
float w;

Ball(float tempX, float tempY, float tempW) {
x = tempX;
y = tempY;
w = tempW;
speed = 0;
}

void gravity() {
// 重力加速度
speed = speed + gravity;
}

void move() {
// 将速度加到y轴
y = y + speed;
// 如果小球到底
// 将速度反向
if (y > height) {
speed = speed * -0.95;
y = height;
}
}

void display() {
// 显示球
fill(random(255));
stroke(0);
ellipse(x,y,w,w);
}
}

Be Sociable, Share!

《Processing:数组(下)》有一个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.