Processing多窗口程序范例(一)

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();

结果

image

笔者觉得这是具有典型的多窗口例子,初学者值得好好研习的,更多的范例会在之后发布,感谢阅读!

原文地址:https://www.cnblogs.com/sharpeye/p/14655291.html