Processing学习到一定程度必定会关注源码,关注扩展功能,其中窗口创建是值得关注的技术点(实现多窗口)。下面就以一个简单范例来展开讨论。
范例代码
主程序先上:
package syf.demo.multiwindow;
import processing.core.PApplet;
import processing.core.PGraphics;
public class TwoWindowApp extends PApplet {
ChildWindow childwindow;
Canvas canvas;
PGraphics pg; //最为重要的成员变量---这个graphics 是子窗口画画的对象,然后平铺展现在主窗口中
@Override
public void settings() {
size(800,800);
}
@Override
public void setup() {
pg = createGraphics(200,200);
pg.beginDraw();
pg.clear();
pg.background(0,0);
pg.endDraw();
canvas = new Canvas(this,pg);
childwindow = new ChildWindow(pg);
}
@Override
public void draw() {
background(20);
canvas.update();
canvas.draw();
}
public static void main(String[] args) {
String[] appletArgs = new String[] {"syf.demo.multiwindow.TwoWindowApp"};
PApplet.main(appletArgs);
}
}
PGraphics pg
是最为重要的成员变量,这个graphics
是子窗口画画的对象,然后平铺展现在主窗口中。其他都很简单,没有注解了,有问题欢迎留言。
然后是子窗口类:
package syf.demo.multiwindow;
import processing.core.PApplet;
import processing.core.PGraphics;
public class ChildWindow extends PApplet{
PGraphics pg;
ChildWindow(PGraphics _pg){
super();
pg = _pg;
PApplet.runSketch(new String[]{this.getClass().getName()},this);
}
@Override
public void settings() {
size(pg.width, pg.height);
}
@Override
public void setup() {
background(0);
}
@Override
public void draw() {
pg.beginDraw();
pg.ellipse(mouseX,mouseY,50,50);
pg.endDraw();
set(0,0,pg); //据说比 image()效率好高
}
}
将那张graphics
传进来初始化大小,目的是让该窗口作为这个graphics
的监事窗口,一会儿在子窗口内画圆,即在graphics
上作画。
最后是主程序类中的画布类:
package syf.demo.multiwindow;
import processing.core.PApplet;
import processing.core.PGraphics;
import java.util.Set;
public class Canvas {
private PApplet app;
PGraphics pg;
Canvas(PApplet _app, PGraphics _pg){
app = _app;
pg = _pg;
}
void update(){
}
void draw(){
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
//app.image(pg,10,10);
app.set(i*app.width/4, j*app.height/4, pg);
}
}
}
}
很简单,draw()
中两层for平铺画面。注意要执行相关绘制函数,必须将最顶层的PApplet对象传入,比如代码中设的app
即为TwoWindowApp的对象引用,那么要绘制调用set()
、image()
应该这样写:
app.set();
app.image();
结果
笔者觉得这是具有典型的多窗口例子,初学者值得好好研习的,更多的范例会在之后发布,感谢阅读!