Processing:对象

1. 类(Class)的名字常常以大写开头,用以与变量区分

2. 初始化对象(Object)的方式:myCar = new Car(); 。如果你忘记初始化一个对象,则他会被pr默认为null。null意味着什么也没有,既不是0,也不是负数。如果你遇到类似“NullPointerException”的错误,绝大多数情况下,便是由于忘记初始化一个对象造成的。

3. 使用一个对象的方式:variableName.objectMethod(Method Arguments); 例如:myCar.draw();

4. 看一个对象应用的例子:
Car myCar; // 申明对象car为一个全局变量

void setup() {
size(200,200);
// 初始化Car对象
myCar = new Car(); // 呼叫构造器(constructor)在setup() 内初始化car对象.
}

void draw() {
background(255);
// 操作对象Car.
myCar.move(); // 用.语法(dots syntax)呼叫对象方式(method)在draw( ) 内运行对象car.
myCar.display();
}

class Car { // 定以一个类(class).
color c; // 变量们.
float xpos;
float ypos;
float xspeed;

Car() { // 一个构造器(Constructor).
c = color(175);
xpos = width/2;
ypos = height/2;
xspeed = 1;
}

void display() { // 函数.
// 车就是一个矩形
rectMode(CENTER);
stroke(0);
fill(c);
rect(xpos,ypos,20,10);
}

void move() { // 函数.
xpos = xpos + xspeed;
if (xpos > width) {
xpos = 0;
}
}
}

5. 与自定义函数一样,一个类可以摆放在你程序任意的位置。

New Tab
New Tab

6. 点击pr窗口最右边的箭头按钮,会弹出菜单,选择“New Tab”则可以在当前窗口打开新标签,如上例,你可以将类Car写入新开的标签内,这样更便于阅读。注意,当你保存的时候,将会在你的sketch文件夹内同时保存成两个pde文件。本人经实践证明,必须把从class开始一直到结尾的代码全部拷入新标签中,程序才不会出错,新标签的名字可以随便取,但是最好与你的类一致。

7. 如果需要两个car对象呢?请看下边这段代码:
Car myCar1;
Car myCar2; // 两个对象!

void setup() {
size(200,200);
myCar1 = new Car(color(255,0,0),0,100,2); // 当对象被构造的时候,参数进入圆括号内
myCar2 = new Car(color(0,0,255),0,10,1);
}

void draw() {
background(255);
myCar1.move();
myCar1.display();
myCar2.move();
myCar2.display();
}

class Car { // 尽管有多个对象,我们仍仅需要一个类。就像无论我们制造多少个曲奇,我们都仅需要一台曲奇机。
color c;
float xpos;
float ypos;
float xspeed;

Car(color tempC, float tempXpos, float tempYpos, float tempXspeed) { // 构造器被引数定义.
c = tempC;
xpos = tempXpos;
ypos = tempYpos;
xspeed = tempXspeed;
}

void display() {
stroke(0);
fill(c);
rectMode(CENTER);
rect(xpos,ypos,20,10);
}

void move() {
xpos = xpos + xspeed;
if (xpos > width) {
xpos = 0;
}
}
}

8. 还记得之前那个弹跳小球的例子吗?看看它用对象和类重写的例子(源文件)。(是的,很绕,而且暂时还无法看出这样做的好处。。)

9. 对象是像整数和小数一样的数据类型。因为类是由数据构成的,因此一个对象可以包含另一个对象。例如:
class PlaceSetting {
Fork fork;
Spoon spoon;
PlaceSetting() {
fork = new Fork();
spoon = new Spoon();
}
}

10. 一个函数可以以一个对象作为其引数。

11. 在上一课中,我们知道,函数传递的是一个副本。而对象则不同,当其传递进入一个函数后,任何对被传递对象进行的改动都将影响到整个sketch内其出现的地方。这种现象叫做 参照传递
(pass by reference) 。

12. 什么时候应该使用“基于对象的程序设计”(object-oriented programming)?对于Daniel先生来说,答案是“总是”。对象允许你将一个软件程序内的概念组织成为模块,一个可重复利用的包裹。尽管如此,并不是在创建每一个项目的时候使用基于对象的方式都很方便和必要,尤其当你处于学习阶段的时候。对于你希望通过pr来创建的项目,Daniel老师的建议是:步进式。首先从往setup()和draw()里写代码开始,顺序按逻辑写出你想要的和你想看到的。随着你的项目开始成长,抽时间重新组织你的代码,也许首先从函数开始,然后进入对象。当然,是在不改变最终你想要的结果的前提下。

Be Sociable, Share!

发表评论

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

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