0

我最近正在处理(http://processing.org/),并希望找出是否有一个库可以帮助我创建两个不同的窗口,它们呈现同一场景的两个视图。还有什么方法可以直接从一个切换到另一个。

4

2 回答 2

1

我不知道 Processing 是否存在这样的库,但是您可以根据最近的 Processing 论坛线程使用以下代码轻松创建两个窗口

import java.awt.Frame;
import java.awt.MouseInfo;
import java.awt.Point;
PFrame f;
secondApplet s;

void setup () {
  size(500, 500);
  PFrame f = new PFrame();
  frame.setTitle("first window");
}


void draw () {
  background(255);
  s.background(0); // Second window background method

// .... //

}

public class PFrame extends Frame {
  public PFrame() {
    setBounds(0, 0, 500, 500);
    s = new secondApplet();
    setResizable(false);
    add(s); 
    s.init(); 
    show();
    setTitle("second window");
  }
}

public class secondApplet extends PApplet {
  public void setup() {
    size(500, 500);
  }
  public void draw() {
  }
}

然后,您可以基于通用数据源和方法在每个窗口中创建图形。我不是专家,但我希望这可以帮助您开始您的项目。

请注意,G4P等 GUI 库也支持创建多个窗口。

编辑:评论相关代码:

//...//
int x=50;
void draw () {
rect(width/2,0,x,x);
s.rect(s.width/2,0,x+10,x+10);
}
//...//
于 2013-07-11T11:17:43.550 回答
1

这是一个快速而简单的示例:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.*;

ImagePanel view2;
PImage viewport2 = new PImage(400,400,RGB);

void setup(){
  size(800,400,P3D);
  noStroke();

  frame.setSize(400,400);
  frame.setTitle("view 1");

  view2 = new ImagePanel((BufferedImage)viewport2.getNative());
  JFrame v2 = new JFrame("view 2");
  v2.setSize(400,400);
  v2.add(view2);
  v2.show();
}
void draw(){
  background(0);
  lights();
  //view1
  pushMatrix();
    translate(200,200,0);
    rotateX(45);
    rotateY(map(mouseX,0,height,-PI,PI));
    renderScene();
  popMatrix();
  //view2
  pushMatrix();
  translate(600,200,0);
  rotateY(45);
  rotateX(map(mouseX,0,height,-PI,PI));
  renderScene();
  popMatrix();
  viewport2 = get(400,0,400,400);//fetch a screenshot from the invisible side (right side);
  view2.setImage((BufferedImage)viewport2.getNative());
}
void renderScene(){
  pushMatrix();
  box(100);//and other elements here
  popMatrix();
}

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel(BufferedImage img) {
       setImage(img);
    }
    public void setImage(BufferedImage img){
      image = img;
      this.repaint();
    }
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);        
    }

}

有 3 件事要看:

  1. 生成单独的视图 - 注意草图大小实际上是双倍的,我使用 push/pop 调用来隔离变换并渲染相同的数据。也可以随意使用camera()perspective()函数。
  2. 生成帧。注意 Processing 使用我调整大小的 java.awt.Frameframe.setSize()并扩展 JPanel 以便我可以绘制到 Graphics 对象中。
  3. 更新图像:我使用 get(x,y,width,height) 在绘制/渲染循环结束时获取渲染场景的快照 PImage。PImage提供了一个getNative()返回 BufferedImage 表示的方法。这可以绘制到 java.awt.Graphics 实例中。我告诉自定义 JPanel 组件重新绘制以更新像素。

这种方法有点老套,但是您使用的是具有相同变量的相同草图,而不是两个 PApplet 实例。

于 2013-07-29T23:09:21.420 回答