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



程序

主程序:

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. codeforces1849 D. Array Painting

    题目链接 https://codeforces.com/problemset/problem/1849/D 题意 输入 \(n(1 \leq n \leq 2e5)\) 和长为 \(n\) 的数组 \ ...

  2. docker-compose安装mysql

    0. 安装docker-compose,参见:[Amadeus原创]docker compose的安装 1. 目录结构:按以下目录结构mkdir文件夹和相关文件 mysql 目录下的 data 为数据 ...

  3. docker compose的安装

    1,安装docker ### CentOS8 默认是会读取centos.org的mirrorlist的,所以一般来说是不需要配置镜像的. # step 1: 安装必要的一些系统工具 sudo yum ...

  4. 动态 import()

    动态 import() https://v8.dev/features/dynamic-import Dynamic import() 引入了一个新的类似函数的功能,相比静态的 import 提供了新 ...

  5. Teams 无法访问的问题

    排除以下 login.partner.microsoftonline.cn; login.microsoftonline.com; microsoft.com; live.com; hotmail.c ...

  6. C#字符串拼接的几种方式及其性能分析对比

    前言 在C#编程中字符串拼接是一种常见且基础的操作,广泛应用于各种场景,如动态生成SQL查询.构建日志信息.格式化用户显示内容等.然而,不同的字符串拼接方式在性能和内存使用上可能存在显著差异.今天咱们 ...

  7. git log 常用方法

    • git log --all 查看所有分支的历史• git log --all --graph 查看图形化的 log 地址• git log --oneline 查看单行的简洁历史.• git lo ...

  8. Base58在java程序中应用

    Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址. 相比Base64,Base58不使用数字"0",字母大写"O" ...

  9. vue3 封装axios

    1添加一个新的 http.js文件 封装axios 引入axios //引入Axios import axios from 'axios' 定义一个根地址 //视你自己的接口地址而定 var root ...

  10. 融云技术分享:全面揭秘亿级IM消息的可靠投递机制

    本文由融云技术团队原创分享,原题"IM 消息同步机制全面解析",为使文章更好理解,对内容进行了重新归纳和细节修订. 1.内容概述 即时通讯(IM)系统最基础.最重要的是消息的及时性 ...