再来一例~另一种叠加方式呈现。。。看图:



程序

主程序:

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多窗口程序范例(三)的更多相关文章

  1. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  2. 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...

  3. Windows程序设计笔记(二) 关于编写简单窗口程序中的几点疑惑

    在编写窗口程序时主要是5个步骤,创建窗口类.注册窗口类.创建窗口.显示窗口.消息环的编写.对于这5个步骤为何要这样写,当初我不是太理解,学习到现在有些问题我基本上已经找到了答案,同时对于Windows ...

  4. win32程序之窗口程序,以及消息机制

    win32程序值窗口程序,以及消息机制 一丶简介 通过上一讲.我们了解了窗口其实是绘制出来的.而且是不断绘制的过程. 所以窗口的本质是绘制. 但是我们现在看到的窗口程序.都可以点击关闭按钮. 使用鼠标 ...

  5. 第一个手写Win32窗口程序

    第一个手写Win32窗口程序 一 Windows编程基础 1 Win32应用程序的基本类型 1.1 控制台程序 不需要完善的Windows窗口,可以使用DOS窗口 的方式显示. 1.2 Win32窗口 ...

  6. 使用Qt生成第一个窗口程序

    一.打开QtCreater,点击New Project 二.在Qt中,最常用的窗口程序为widgets控件程序,这里我们选择Qt Widgets Application 三.Qt生成的debug和re ...

  7. HTML5浏览器嵌入窗口程序解决方案

    浏览器嵌入窗口程序一直以来就是WEB应用程序的首选方案,这种方案只需要实现一个主窗口,并提供一些接口供脚本调用,内部的界面和逻辑处理全部用html,css,javascript去实现.我最早看到的相关 ...

  8. QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)

    使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...

  9. 第15.35节 PyQt编程实战:结合QDial实现的QStackedWidget堆叠窗口程序例子

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.案例说明 本案例是老猿在学习QStackedWidget中的一个测试案例,该案例使用QStack ...

  10. Cocos2dx集成于windows桌面窗口程序的步骤

    2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...

随机推荐

  1. codeforces 1978 D. Elections

    题目链接 https://codeforces.com/problemset/problem/1978/D 题意 对于每个测试用例,共有 \(n\) 个人,每个人的号码分别是 \(1,2,...,n\ ...

  2. Java线程 interrupt 方法使用异常

    背景 需要在异步任务中中断任务的执行,故选择通过调用 interrupt 方法对线程设置中断信号. 在比较耗时的业务代码增加判断 Thread.currentThread().isInterrupte ...

  3. kubectl cp

    简介 将文件.目录复制到容器:或从容器复制文件.目录. kubectl cp <file-spec-src> <file-spec-dest> 示例 # !!!重要提示!!! ...

  4. Qt编写安防视频监控系统59-子模块3图文警情

    一.前言 图文警情子模块是为了适应现在各种人脸识别报警应用而增加的,参照现在各种视频监控手机app报警提示信息,基本上都是带了时间.内容.图片缩略图(单击可以查看大图),这种信息排列形式在现代的软件中 ...

  5. U盘或光盘启动的Win7-8-10的PE系统制作步骤

    U盘或光盘启动的Win7-8-10的PE系统制作步骤 1.打开http://www.ushendu.com/下载PE制作工具 2.下载完成后安装到我的电脑, 把准备好的U盘插到电脑上,打开U深度PE制 ...

  6. 首次公开,最新手机QQ客户端架构的技术演进实践

    本文由腾讯技术何金源分享,原题"不畏移山,手机QQ技术架构升级变迁史",本文进行了排版和内容优化等. 1.引言 接上篇<总是被低估,从未被超越,揭秘QQ极致丝滑背后的硬核IM ...

  7. HUAWEI MindStudio安装配置

    HUAWEI MindStudio安装配置 官网: 链接 安装流程 获取软件包 软件包 说明 获取链接 MindStudio_{version}_linux.tar.gz MindStudio软件包, ...

  8. 特殊数据类型的深度分析:JSON、数组和 HSTORE 的实用价值

    title: 特殊数据类型的深度分析:JSON.数组和 HSTORE 的实用价值 date: 2025/1/4 updated: 2025/1/4 author: cmdragon excerpt: ...

  9. Windows安全加固(四)

    七.服务安全 1.禁用TCP/IP上的NetBIOS(协议所用端口139) 作用:禁用TCP/IP上的NetBIOS协议,可以关闭监听的UDP137.UDP138.UDP139端口. (1)使用快捷键 ...

  10. 今天记录一下管理系统中预览pdf的方法

    在管理系统中,有很多需要预览文件的操作,既方便用户查看又可以不用打开新的页面,我发现一个不错的方法,记录一下 <el-dialog title="" :visible.syn ...