今天分享Processing中类的使用和简易粒子系统的案例。在Processing可以先定义一个类,然后调用它,这样的优点在于对于同一个功能的实现,我们可以反复调用,而且可以设置不同的参数互不影响,使代码高效精简。Processing与Java类似使用class来定义一个类。首先去到processing官网的reference找到类class,其给的案例是两根“相互追赶”的线。
//定义一个类 包含两个参数,线所处的y值ypos和线移动的速度speed
class HLine {
float ypos, speed; //定义参数类型
HLine (float y, float s) {
ypos = y;
speed = s;
}
void update() {
ypos += speed;
// 持续增加speed的量保持线向下移动
if (ypos > height) {
ypos = 0;
}
stroke(255);
line(0, ypos, width, ypos);
}
}
// 从类HLine声明并构造两个对象(h1,h2)
HLine h1 = new HLine(20, 2.0);
//设置h1的初始位置在y=20,下降速度为2.0
HLine h2 = new HLine(50, 2.5);
//设置h2的初始位置在y=50,下降速度为2.5
void setup()
{
size(640, 360);
frameRate(30);
}
void draw() {
background(0);
h1.update();
h2.update();
}
粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现真实感的物理运动规律。我第一次觉得Processing很酷就是因为看到粒子系统的模拟。在processing官网的Examples中可以找到Daniel Shiffman做的一个粒子系统的案例;粒子是通过draw()在每个循环中生成的,随着重力的下落而逐渐消失,ParticleSystem对象管理可变大小(ArrayList)的粒子列表。
代码链接
https://www.processing.org/examples/simpleparticlesystem
通过对上面两个案例的研究我计划做一个带色彩并且能与我互动的粒子系统。基本的想法是系统中的粒子是大小不一、颜色不一、而且具有不定向的运动性,如果鼠标点击屏幕,所有的粒子聚集起来,然后散开随机运动,碰到画布边界后无损反弹。
int numPoints; //定义变量粒子的数量
Particle []particles; //引用到类
void setup()
{
size(800, 500);
numPoints = 300;
particles = new Particle[ numPoints];
for (int i = 0; i < numPoints; i++)
//循环连续产生粒子直到预设数量
{
particles[i] = new Particle();
}
}
void draw()
{
background(0);
for (int i = 0; i < numPoints; i++)
{
particles[i].draw(); //绘出粒子
}
}
//定义类Particle
class Particle
{
float xPosition; //定义参数点位置的x值
float yPosition; //定义参数点位置的y值
float size; //定义参数粒子的大小
float speedx; //定义参数粒子移动的速度
float speedy;
Particle()
{
xPosition = random(0, width);
yPosition = random(0, height);
//粒子在画布中随机产生点
size = random(2, 8);
//随机产生粒子大小的区间为(2,8)
speedx = random(-2, 2);
speedy = random(-2, 2);
// 随机产生粒子运动的速度值区间为(-2, 2)
}
void draw()
{
if (size < 5)
{
fill(#FFFFFF);
//如果粒子的size < 5 就填充淡蓝色
}
if (7.0 < size & size <8)
{
fill(#FF4B4B);
//如果粒子的7 < size & size <8 就填充淡红色
} else
{
fill(125, 240, 240); //其它大小的粒子填充蓝色
}
if (dist(xPosition, yPosition, mouseX, mouseY) < 80)
{
fill(#FFE600);
// 如果粒子在距离鼠标范围80之内就会变成黄色
}
noStroke();
ellipse(xPosition, yPosition, size, size);
xPosition += speedx;
yPosition += speedy; //赋予粒子运动的速度
if (xPosition < 0 )
{
xPosition = 0 ;
speedx = -1 * speedx;
}
if (xPosition > width )
{
xPosition = width ;
speedx = -1 * speedx;
}
if (yPosition < 0 )
{
yPosition = 0 ;
speedy = -1 * speedy;
}
if (yPosition > height )
{
yPosition = height ;
speedy = -1 * speedy;
//设定如果粒子碰到画布的边界就会无损反弹
}
if (mousePressed)
{
float xdist = xPosition - mouseX;
float ydist = yPosition - mouseY;
xPosition -= xdist;
yPosition -= ydist;
//如果鼠标点击画布界面所有的粒子聚集起来
}
}
}
效果如下:
如上生成简单的粒子系统是很容易的,但是要生成模拟物理粒子系统或特别炫酷的大神作品需要给简单的粒子系统增加更多的限定条件和属性,当然还需要耐心的调整参数。路漫漫其修远兮,吾将上下而求索。
福利获取:
文章中案例的程序包可以在公众号回复”P3.02"免费获得
欢迎关注CrossSpace