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多窗口程序范例(三)的更多相关文章
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- Windows程序设计笔记(二) 关于编写简单窗口程序中的几点疑惑
在编写窗口程序时主要是5个步骤,创建窗口类.注册窗口类.创建窗口.显示窗口.消息环的编写.对于这5个步骤为何要这样写,当初我不是太理解,学习到现在有些问题我基本上已经找到了答案,同时对于Windows ...
- win32程序之窗口程序,以及消息机制
win32程序值窗口程序,以及消息机制 一丶简介 通过上一讲.我们了解了窗口其实是绘制出来的.而且是不断绘制的过程. 所以窗口的本质是绘制. 但是我们现在看到的窗口程序.都可以点击关闭按钮. 使用鼠标 ...
- 第一个手写Win32窗口程序
第一个手写Win32窗口程序 一 Windows编程基础 1 Win32应用程序的基本类型 1.1 控制台程序 不需要完善的Windows窗口,可以使用DOS窗口 的方式显示. 1.2 Win32窗口 ...
- 使用Qt生成第一个窗口程序
一.打开QtCreater,点击New Project 二.在Qt中,最常用的窗口程序为widgets控件程序,这里我们选择Qt Widgets Application 三.Qt生成的debug和re ...
- HTML5浏览器嵌入窗口程序解决方案
浏览器嵌入窗口程序一直以来就是WEB应用程序的首选方案,这种方案只需要实现一个主窗口,并提供一些接口供脚本调用,内部的界面和逻辑处理全部用html,css,javascript去实现.我最早看到的相关 ...
- QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...
- 第15.35节 PyQt编程实战:结合QDial实现的QStackedWidget堆叠窗口程序例子
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.案例说明 本案例是老猿在学习QStackedWidget中的一个测试案例,该案例使用QStack ...
- Cocos2dx集成于windows桌面窗口程序的步骤
2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场 ...
随机推荐
- ADB安装与环境配置
前言 ADB(Android debug bridge)是可以操作Android设备的命令行工具 安装 点击链接即可直接下载 Windows https://dl.google.com/android ...
- idea中yaml文件中文乱码问题解决
idea打开yaml,或是properties文件,出现中文乱码. 解决步骤: 打开notepad++ ,新建iso-8859-1编码的空文件 将乱码文件通过notepad++直接打开,把正常显示的代 ...
- 你应该了解的hooks式接口编程 - useSWR
什么是 useSWR ? 听名字我们都知道是一个 React 的 hooks,SWR 是stale-while-revalidate的缩写, stale 的意思是陈旧的, revalidate 的意思 ...
- iOS - 利用 UIBezierPath 绘制圆弧
iOS - 利用 UIBezierPath 绘制圆弧 API UIBezierPath 绘制圆弧主要利用以下方法: open func addArc(withCenter center: CGPoin ...
- SpringSecurity认证流程分析
重要组件 SecurityContext 上下文对象,Authentication(认证)对象会放在里面 SecurityContextHolder 用于拿到上下文对象的静态工具类 Authentic ...
- Nginx漏洞修复:SSL/TLS 服务器瞬时 Diffie-Hellman 公共密钥过弱
SSL/TLS 服务器瞬时 Diffie-Hellman 公共密钥过弱[原理扫描]. 需编辑 nginx.conf 解决. 1.生成 dhparams.pem. cd /usr/local/nginx ...
- Windows 11 下 Virtualbox 6.1.34 出现 End kernel panic - not syncing: attempted to kill the idle task
前言小半年没用 Virtualbox 了,切换到了 VMware,今天又切换回去(无聊),但是安装虚拟机出现这个错误. 解决方法根据 Virtualbox 论坛的讨论[1]和[2],首先明确 系统必须 ...
- debian/ubuntu系统vi无法删除字符的解决办法
之前在 Linux 下操作,一直使用的是 Centos 系统,使用 vi 编辑命令一直很顺畅. 最近,入手了一台 debian 操作系统的 vps.在操作 vi 命令时,发现当输入 i 要进行文件编辑 ...
- .NET 窗口置于最顶层
本文介绍如何将窗口置于最顶层,以及解决在顶层显示时对锁屏登录界面的影响 一般情况下的窗口置顶,可以设置WPF窗口属性Topmost=true 也可以使用WIN32-SetWindowPos函数SetW ...
- Solution Set -「LOCAL」冲刺省选 Round X
\(\mathscr{Summary}\) 时间利用效率? 同学,你的效率呢? 我真不知道中途几个小时干了啥,我也不知道我实在划水.神游还是真的在自闭想题. 虽然真实考场肾上腺素不会允 ...