Processing-对象(class)
Processing 允许使用面向对象编程(OOP)技术来使 Processing 应用程序更易于开发和维护。与其他面向对象的语言一样,Processing 使用 Class
的概念来定义对象模板。
我们先来看一个例子:假设平坦的马路上跑着一辆轿车,轿车的颜色为白色,当前速度为1公里每小时,轿车类型为自动挡。现在我们想在Processing里绘制这样一个场景,如何做呢?
// 定义轿车的颜色
color c;
// 定义轿车的x坐标位置
float xpos;
// 定义轿车的y坐标位置
float ypos;
// 定义轿车的车速
float xspeed;
// 环境初始化。
// 此方法在软件启动时,被系统调用一次。
void setup() {// 初始化窗口大小size(200, 200);// 初始化轿车颜色c = color(255);// 初始化轿车的x坐标xpos = width/2;// 初始化轿车的y坐标ypos = height/2;// 初始化轿车的车速xspeed = 1;
}
// 画图。
// 此方法被系统默认循环调用。
void draw() {// 设置窗体背景色为黑色background(0);// 调用display()方法display();// 调用drive()方法drive();
}
// 自定义显示轿车的方法
void display(){// 设置轿车的锚定点为矩形中心rectMode(CENTER);// 设置轿车的颜色fill(c);// 将轿车画成矩形rect(xpos, ypos, 20, 10);
}
// 自定义轿车的制动方法
void drive(){// 轿车将在x轴上向前移动,// 移动的速度为xspeedxpos = xpos + xspeed;// 判断轿车是否超出了窗体的右侧,// 若超出,则轿车将从窗体左侧重新驶入。if(xpos > width){// 将轿车的位置重新设置为窗体的左侧xpos = 0;}
}
上面的这段代码,就是我们通常最先想到的方法。这种方式很显然不太友好,为什么这么说呢?假设我们想要再创建一辆轿车,颜色为红色,速度为2公里每小时,那岂不是还要再定义一遍上面用到的变量?比如,车的颜色为了分别记录两辆车,所以要定义两个color
,位置记录也要重新定义一遍,车速的变量也要重新定义一遍。以此类推,要是定义五辆轿车,那就要写五遍同样的变量。嗯,这确实是个问题。那应该怎么办呢?
嗯,这就涉及到今天所要讲的内容,对象。
真实的世界里,每个具体的事物都是对象,某一辆轿车,是一个对象,再一辆轿车,又是一个对象,多辆轿车,就是多个对象,以此类推。如果我们定义一个模具,通过这个模具可以马上定制出,具有不同属性的轿车,那不就方便了么?到那个时候,我们想要多少轿车,就可以很容易的定制出多少轿车。那这个模具,在Processing这里,称之为class
,也就是类。我们定义一个类,也就是定义了一个模具,以后想要多少轿车,就可以用这个模具定制出多少轿车。妙哉吧!好,让我们看看这个类都包括哪些内容,具体怎么定义?
一般来说,一个类包括四部分,分别为,类名,数据,构造器,方法。那么,接下来让我们讲上面的示例改造成一个轿车的类,方便我们以后使用。
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() {rectMode(CENTER);fill(c);rect(xpos, ypos, 20, 10);}void drive(){xpos = xpos + xspeed;if (xpos > width) {xpos = 0;}}
}
上面代码中,分别定义数据、定义构造器、定义方法。
1)构造器:
其命名要与类名保持一样,然后会在定义对象的时候,自动调用。除此之外,构造器还可以进行初始化变量。定义一个新的对象,需要用到new
关键字,紧接着就是类名,类名后面的括号,可以传入构造器中,括号里定义的参数。比如定义一个新的轿车对象,示例代码如下:
myCar = new Car(color(255, 0, 0), 0, 100, 1);
2)方法:
每个方法都有返回数值,关键字void
比较特殊,它定义了此方法可以没有返回值,或者说,返回值可以为空。紧接着,后面的display()
为方法名,括号里可以放传入的参数,此处为空。如果方法的返回类型不是void
,则需要在方法的最后一行添加一条return
语句,return
后面有一个空格,然后是需要返回的结果。由于此方法的返回类型为void
,所以方法的最后一行的省掉了return
语句。
好了,回到项目主体
// 声明轿车变量myCar
Car myCar1;
Car myCar2;
// 环境初始化。
// 此方法在软件启动时,被系统调用一次。
void setup() {// 设置窗口size(200, 200);// 创建myCar对象。// 并传入四个参数:// tempC = color(255, 0, 0)// tempXpos = 0// tempYpos = 100// tempXspeed = 1myCar1 = new Car(color(255, 0, 0), 0, 100, 1);// 参见上面myCar1的注释myCar2 = new Car(color(0, 255, 0), 0, 150, 1.5);
}
// 画图
// 此方法被系统默认循环调用
void draw() {// 设置背景色为黑色background(0);// 调用myCar1对象的drive()方法myCar1.drive();// 调用myCar对象的display()方法myCar1.display();// 调用myCar2对象的drive()方法myCar2.drive();// 调用myCar2对象的display()方法myCar2.display();
}
在上面的主体框架中,创建了两个轿车对象,一个是myCar1
,另一个是myCar2
。在框架setup
中进行创建,并初始化相应参数。在框架draw()
方法中,对两个对象的drive()
方法和display()
方法分别进行了调用。这里要说的一点是,调用对象的方法需要在对象后面加一个.
,然后紧跟方法名。
参考:http://ohcoder.com/blog/2016/03/18/processing-fun-object/
最后,我们举一个水滴扩散的例子:
class Drop {int x, y; // Coordinate (center of circle)int diameter; // Diameter of circle (unused == 0).void init( int ix, int iy ) {x = ix;y = iy;diameter = 1;}void spread() {if (diameter > 0) diameter += 1;}void show() {if (diameter > 0) {ellipse( x, y, diameter, diameter );if (diameter > 500) diameter = 0;}}}
现在我们来看一下如何使用 Drop
类来构建一些利用用户输入的图形。清单 4 给出使用 Drop
类的应用程序。第一步是创建一个水滴数组(称为 drops
)。之后进行几个定义(drops
数组中的水滴数和工作索引)。在 setup
函数中,您可以创建显示窗口并初始化 drops
数组(所有直径为 0 或未使用)。draw
函数相当简单,因为水滴的核心功能在类本身内部(清单 3 中的 spread
和 show
)最后,添加 UI 部分,该部分允许用户定义水滴从何处开始。mousePressed
回调函数通过当前鼠标位置(目前有一个直径且是使用过的)初始化水滴,然后递增当前水滴索引。
Drop[] drops;
int numDrops = 30;
int curDrop = 0;void setup() {size(400, 400);ellipseMode(CENTER);smooth();drops = new Drop[numDrops];for (int i = 0 ; i < numDrops ; i++) {drops[i] = new Drop();drops[i].diameter = 0;}
}void draw() {background(0);for (int i = 0 ; i < numDrops ; i++) {drops[i].spread();drops[i].show();}
}void mousePressed() {drops[curDrop].init( mouseX, mouseY );if (++curDrop == numDrops) curDrop = 0;
}
参考:
https://www.ibm.com/developerworks/cn/opensource/os-datavis2/index.html
Processing-对象(class)相关推荐
- uvc摄像头代码解析6
10.扫描视频设备链和注册视频设备 10.1 uvc视频链 struct uvc_video_chain { //uvc视频链 struct uvc_device *dev; //uvc设备 stru ...
- java_B站_面试题
Java面向对象有哪些特征,如何应用 面向对象编程是利用类和对象编程的一种思想.万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间有不同的关系 ,一个类自身与外界的封装关系,一个父类和子类的 ...
- 史上最详细的23中设计模式解析,一个不落,理论搭配简单案例,更好理解哦
目录 一.软件设计模式的产生背景 二.软件设计模式的概念与意义 1. 软件设计模式的概念 2. 学习设计模式的意义 三.23 种设计模式的分类和功能 1. 根据目的来分 2. 根据作用范围来分 3. ...
- Windows APO(Audio Processing Objects, 音频处理对象)
"Windows音频驱动"翻译系列总目录: https://blog.csdn.net/danteLiujie/article/details/102530417 原文时间是:20 ...
- 【hortonworks/registry 】type为对象An exception was thrown while processing request with message: [null]
1.背景 先创建一个user {"type": "record","name": "user","namesp ...
- TensorFlow中的对象检测教程:实时对象检测
导言 创建能够在单个图像中识别和定位多个对象的精确机器学习模型仍然是计算机视觉中的核心挑战.但随着最近深度学习的进步,对象检测应用程序比以往更容易开发.TensorFlow的对象检测API是一个构建与 ...
- 可以获取python中输出函数帮助的是_Python帮助函数调试函数 用于获取对象的属性及属性值...
Python帮助函数调试函数 用于获取对象的属性及属性值 刚接触Python,上篇 <Python入门>第一个Python Web程序--简单的Web服务器 中调试非常不方便,不知道对象详 ...
- java 日志 生成器_自动生成 java 测试 mock 对象框架 DataFactory-01-入门使用教程
项目简介 Data-Factory 用于根据对象,随机自动生成初始化信息,避免了手动创建对象的繁琐,便于测试. 特性 8 大基本类型的支持 String.Date.金额,日期等常见类型的支持 java ...
- Stream Processing: S4系统模型分析和关键源码读解
S4(Simple Scalable Stream System) 流数据处理系统是Yahoo!公司提出的,在2011年的时候成为Apache软件基金下的一个孵化项目,可惜的是在2014年的时候该孵化 ...
- SAP中的BOPF(Business Object Processing Framework)
https://www.cnblogs.com/DicksonJYL/p/9945986.html 目录 BOPF代表什么? 谁在使用BOPF? 怎样才能使用BOPF? 应用基础设施的主要组件有哪些? ...
最新文章
- iOS NSObject对象内存大小
- 重磅~ 深度学习中的图像分割:方法和应用
- 【干货分享】32本优秀的 JavaScript 免费电子书
- #39;git pull#39;和#39;git fetch#39;有什么区别?
- NYOJ 士兵杀敌(四) 树状数组
- debian8.8安装谷歌浏览器
- 减少HTTP请求之合并图片详解(大型网站优化技术)
- 能用计算机解决的问题十个,计算机常见问题及解决方法,计算机十项常见故障...
- 硬件基础知识(7)---电容1
- python搭建django环境_在BAE上搭建python,django环境小记
- Mysql 全局锁入门
- git 日常 常用命令
- 目前,有哪些云计算平台,值得我们选择
- android6.0原生brower_Android原生下载组件DownloadManager
- 给非天才准备的 GRE 单词背诵方案
- js 十六进制,八进制,二进制
- (二)史玉柱:我的营销心得有感------主要关注网络游戏策划
- 【AIOT】2-2 物联网案例分享
- 计算机课代表专业演讲稿,语文课代表发言稿(精选多篇)
- Apache Hudi的编译及安装