一.函数基础
函数是processing程序中最基本的结构。经常使用的函数有draw()、line()、size()等。计算机每次运行程序的一行。当一个函数运行时,计算机跳到函数定义的位置,运行到哪里的代码,然后在跳回它离开的位置。
1.1掷骰子
案例代码如图1:
图1
保存并运行如图2
图2
图2中rollDice()中的两行代码选择一个1到骰子面数之间的随机数,然后将数字输出到控制台。由于数字是随机的,随意程序每次运行时我们会看到不同的数字。
1.2另一个掷骰子方法
如果写一个功能相同的程序但是不用rollDice()函数,代码如图3
图3
注意:用第一种方法比较好,第二种较麻烦,比如说想修改输出内容需要修改三次,而第一种只需要修改一次。
二.写一个函数
2.1绘制猫头鹰
案例代码如下
void setup(){
size(480,120);
}
void draw(){
background(176,204,226);
translate(110,110);
stroke(138,138,125);
strokeWeight(70);
line(0,-35,0,-65);
noStroke();
fill(255);
ellipse(-17.5,-65,35,35);
ellipse(17.5,-65,35,35);
arc(0,-65,70,70,0,PI);
fill(51,51,30);
ellipse(-14,-65,8,8);
ellipse(14,-65,8,8);
quad(0,-58,4,-51,0,-44,-4,-51);
}
保存并运行如图5
图5
注意:translate()函数将原点(0,0)移动到距上边110像素、距左边110像素的位置,猫头鹰的形象根据移动过的(0,0)来绘制,坐标有时取正,有时取负,因为它的中心点在新的(0,0)点。
2.2绘制一对猫头鹰
案例代码如下:
void setup(){
size(480,120);
}
void draw(){
background(176,204,226);
translate(110,110);
stroke(138,138,125);
strokeWeight(70);
line(0,-35,0,-65);
noStroke();
fill(255);
ellipse(-17.5,-65,35,35);
ellipse(17.5,-65,35,35);
arc(0,-65,70,70,0,PI);
fill(51,51,30);
ellipse(-14,-65,8,8);
ellipse(14,-65,8,8);
quad(0,-58,4,-51,0,-44,-4,-51);
//right
translate(70,0);
stroke(138,138,125);
strokeWeight(70);
line(0,-35,0,-65);
noStroke();
fill(255);
ellipse(-17.5,-65,35,35);
ellipse(17.5,-65,35,35);
arc(0,-65,70,70,0,PI);
fill(51,51,30);
ellipse(-14,-65,8,8);
ellipse(14,-65,8,8);
quad(0,-58,4,-51,0,-44,-4,-51);
}
将第一个代码复制粘贴然后修改translate()函数的值就可以实现绘制两只猫头鹰,但如果数量变多呢?复制粘贴显得麻烦,因此我们需要编写一个函数来实现绘制。
2.3一个猫头鹰函数
案例代码如下
void setup(){
size(480,120);
}
void draw(){
background(176,204,226);
owl(110,110);
owl(180,110);
}
void owl(int x,int y){
pushMatrix();
translate(x,y);
stroke(138,138,125);
strokeWeight(70);
line(0,-35,0,-65);
noStroke();
fill(255);
ellipse(-17.5,-65,35,35);
ellipse(17.5,-65,35,35);
arc(0,-65,70,70,0,PI);
fill(51,51,30);
ellipse(-14,-65,8,8);
ellipse(14,-65,8,8);
quad(0,-58,4,-51,0,-44,-4,-51);
popMatrix();
}
保存并运行如图6
图6
效果和图5是一样的,但是运用了owl()函数,这使得代码显得干净利落。首先猫头鹰的代码只出现了一次,并被命名为owl()函数。这段代码运行两次是因为draw()函数调用了它两次。猫头鹰绘制在不同的位置是因为函数中的参数值被传递到x和y中了。
2.4增加超多的猫头鹰
有了函数后,我们可以用for循环依次改变第一个参数的值,排列绘制很多猫头鹰。
案例代码如下
void setup(){
size(480,120);
}
void draw(){
background(176,204,226);
for(int x=35;x<width+70;x+=70){
owl(x,110);
}
}
void owl(int x,int y){
pushMatrix();
translate(x,y);
stroke(138,138,125);
strokeWeight(70);
line(0,-35,0,-65);
noStroke();
fill(255);
ellipse(-17.5,-65,35,35);
ellipse(17.5,-65,35,35);
arc(0,-65,70,70,0,PI);
fill(51,51,30);
ellipse(-14,-65,8,8);
ellipse(14,-65,8,8);
quad(0,-58,4,-51,0,-44,-4,-51);
popMatrix();
}
保存并运行如图7
图7
2.5不同尺寸的猫头鹰
我们可以在上一个案例中添加两个参数来改变每只猫头鹰的灰度值和尺寸。案例代码如下
void setup(){
size(480,120);
}
void draw(){
background(176,204,226);
randomSeed(0);
for(int i=35;i<width+40;i+=40){
int gray=int(random(0,102));
float scalar=random(0.25,1.0);
owl(i,110,gray,scalar);
}
}
void owl(int x,int y,int g,float s){
pushMatrix();
translate(x,y);
scale(s);
stroke(138-g,138-g,125-g);
strokeWeight(70);
line(0,-35,0,-65);
noStroke();
fill(255);
ellipse(-17.5,-65,35,35);
ellipse(17.5,-65,35,35);
arc(0,-65,70,70,0,PI);
fill(51,51,30);
ellipse(-14,-65,8,8);
ellipse(14,-65,8,8);
quad(0,-58,4,-51,0,-44,-4,-51);
popMatrix();
}
保存并运行如图8
图8
三.返回值
函数可以做计算并向主函数返回一个值。例如random()和sin()函数,当这类函数出现时,它返回的值通常被赋给一个变量。
float r=random(1,10);
在这个例子中random()函数可以返回1~10之间的数值,这个值随后被赋予r变量。一个函数的返回值也可以经常被用作另一个函数的参数,例如:
point(random(width,rrandom(height));
在这里它们没有被赋予一个变量而是作为point()的参数传入,并用于定位窗口中点的位置。
3.1返回一个值
为了写一个带返回值的函数,将关键词void替换成需要返回的数据类型。一般使用retrun()来返回数据。案例代码如图9
图9
保存并运行如图10
图10
calculateMars()函数是计算我们临近星球上的人或者物体的重量。函数名前是float,所以会返回一个float的数值。在代码的最后一行这个函数的返回变量newWeight,在setup()的第二行,返回值被赋予marsWeight。如果想看自己在火星的体重,可以将yourWeight改为我们自己的体重。
四.案例函数之机器人
案例代码如下:
void setup(){
size(720,480);
strokeWeight(2);
ellipseMode(RADIUS);
}
void draw(){
background(0,153,204);
drawRobot(120,420,110,140);
drawRobot(270,460,260,95);
drawRobot(420,310,80,10);
drawRobot(570,390,180,40);
}
void drawRobot(int x,int y,int bodyHeight,int neckHeight){
int radius=45;
int ny=y-bodyHeight-neckHeight-radius;//脖子的y值
//脖子
stroke(255);
line(x+2,y-bodyHeight,x+2,ny);
line(x+12,y-bodyHeight,x+12,ny);
line(x+22,y-bodyHeight,x+22,ny);
//天线
line(x+12,ny,x-18,ny-43);
line(x+12,ny,x+42,ny-99);
line(x+12,ny,x+78,ny+15);
//身体
noStroke();
fill(255,204,0);
ellipse(x,y-33,33,33);
fill(0);
rect(x-45,y-bodyHeight,90,bodyHeight-33);
fill(255,204,0);
rect(x-45,y-bodyHeight+17,90,6);
//头部
fill(0);
ellipse(x+12,ny,radius,radius);
fill(255);
ellipse(x+24,ny-6,14,14);
fill(0);
ellipse(x+24,ny-6,3,3);
}
保存并运行如图11
图11