Processing多窗口程序范例(三)
2021/4/14 12:27:28
本文主要是介绍Processing多窗口程序范例(三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
再来一例~另一种叠加方式呈现。。。看图:
程序
主程序:
package syf.demo.multiwindow3; import processing.core.PApplet; import processing.core.PGraphics; import processing.core.PImage; public class TwoWindowApp extends PApplet { ChildWindow childwindow; Canvas canvas; PGraphics pg; PImage star; PImage star2; @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(this,pg); String addr = this.getClass().getClassLoader().getResource("").getPath()+"data/"; star = loadImage(addr+"ic_menu_star.png"); star2 = loadImage(addr+"star_empty.png"); background(0); } @Override public void draw() { //background(20); canvas.update(); canvas.draw(); } public static void main(String[] args) { String[] appletArgs = new String[] {"syf.demo.multiwindow3.TwoWindowApp"}; PApplet.main(appletArgs); } }
子窗口:
package syf.demo.multiwindow3; import processing.core.PApplet; import processing.core.PConstants; import processing.core.PGraphics; import processing.event.MouseEvent; import java.awt.*; public class ChildWindow extends PApplet{ PGraphics pg; PApplet app; TwoWindowApp app0; Dimension screen; ChildWindow(PApplet _app,PGraphics _pg){ super(); pg = _pg; app = _app; PApplet.runSketch(new String[]{this.getClass().getName()},this); Toolkit toolkit = Toolkit.getDefaultToolkit(); screen = toolkit.getScreenSize(); } @Override public void settings() { size(pg.width, pg.height); } @Override public void setup() { background(0); surface.setLocation(screen.width/2-app.width/2-this.width,screen.height/2-app.height/2); // 让其app变量指向我们设的类,这样方便调取其中的成员 if(app instanceof TwoWindowApp) app0 = (TwoWindowApp)app; pg.imageMode(CENTER); pg.colorMode(HSB,360,100,100); } @Override public void draw() { pg.beginDraw(); pg.background(0,0); pg.endDraw(); set(0,0,pg); //image(pg, 0, 0); } /* 增设鼠标点击事件,左右键点击画出不同的image 【貌似blendmode 有点问题,依旧是blend形式 有待研究!】 还有最后重复了 set绘制方法,不这样的话没有画面。。。 */ @Override public void mousePressed(MouseEvent event) { println(event.getButton()); if(event.getButton() == 37) { if(app0 != null) { pg.beginDraw(); pg.blendMode(PConstants.ADD); pg.tint(frameCount%360,100,100,200); pg.image(app0.star,mouseX,mouseY,frameCount%100+10,frameCount%100+10); pg.endDraw(); } } if(event.getButton() == 39) { if(app0 != null) { pg.beginDraw(); pg.blendMode(PConstants.ADD); pg.tint(frameCount%360,100,100,200); pg.image(app0.star2,mouseX,mouseY,frameCount%50+100,frameCount%50+100); pg.endDraw(); } } set(0,0,pg); } }
画布类:
package syf.demo.multiwindow3; import processing.core.PApplet; import processing.core.PConstants; import processing.core.PGraphics; import processing.core.PVector; public class Canvas { private PApplet app; PGraphics pg; /* 这个向量数组是为了将一个画面覆盖到整个画面而设立的随机位置(posx,posy) */ PVector[] randomvalues; Canvas(PApplet _app, PGraphics _pg){ app = _app; pg = _pg; randomvalues = new PVector[100]; //初始化随机数组 不然的话放在draw中每次都会随机,画面呈现闪烁的结果 for (int i = 0; i < randomvalues.length; i++) { float r1 = app.random(-pg.width,app.width); float r2 = app.random(-pg.width,app.width); PVector pv = new PVector(r1,r2); randomvalues[i] = pv; } //设置主画面叠加的混合模式 app.blendMode(PConstants.ADD); } void update(){ } void draw(){ int index = 0;//遍历随机数组的索引值,每次都归0 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { app.image( pg, (int)randomvalues[index].x, (int)randomvalues[index].y ); index++; } } } }
其中要点已在源码中注释了,这里还要强调几点:
① 程序中实质上有三个画面系统:主画面、子画面以及PQraphics自己的画面。每个画面都有自身的刷新方法、混合叠加方式
② 要随机分布子画面,就需要考虑随机数的刷新问题,一般随机画面位置初始好就不动了,除非想要闪烁的效果
③ 所有的绘制相关方法都必须考虑清楚基于哪个对象实施的(如 PApplet、PQraphics)
结尾
如果能够理清子父窗口关系了,那就可以通过这种方式提升创作的环境了,加载进来的图片信息也可以在子窗口中实时显示,实时检测变化效果。如有问题,欢迎留言。
这篇关于Processing多窗口程序范例(三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升