如何在 Processing 中的不同时间间隔后触发不同的事件?
How do I trigger different events after different time intervals in Processing?
我正在创建一个 "mock" 界面,"scans" 你的大脑,我想在草图中的特定时间点显示特定的视觉效果、图像、视频、声音等。
我已经尝试了很多我在多个论坛中找到的定时器解决方案——如果间隔是恒定的,它们就可以工作。但我对如何编写多个条件感到困惑,因为我的间隔不是恒定的,我希望在不同时间显示多个媒体。
我先用文本测试它。这是我目前所拥有的:
int per = 0;
int time;
String headband = "Clip band around your head to begin";
String access = "Welcome to Brain Frame -- an intersection between the mind and the virtual. Please press the blue button to proceed a neural link. Press the red button to exit.";
String Y ="Establishing pre-cursory neural link. Do not remove headband.";
String N ="Shutting Down. Do not remove headband until prompted - may result in memory distortion otherwise.";
boolean yes = false;
boolean no = false;
boolean head = false;
void setup() {
size(1080, 720);
time = millis();
}
void draw () {
background(0);
fill(0,255,255);
text (headband, 540, 360);
textSize(30);
textAlign(CENTER);
if(head) {
background(0);
text(access, 540, 360);
}
if(yes) {
background(0);
text(Y + "\n" + per + "%", 540, 360);
if (per < 100) {
per +=1;
} else {
per = 100;
background(0);
if (millis() - time >= 5000) {
text("Link created", 540, 360);
time = millis();
if (millis() - time >= 3000) {
background(0);
text("think about your childhood", 540, 360);
time = millis();
}
}
if (no) {
background(0);
text(N, 540, 360);
}
}
}
}
void keyPressed(){
if (key == 'j' || key == 'J'){
head = true;
}
if (key == 'y' || key == 'Y'){
yes = true;
}
if (key == 'n' || key == 'N'){
no = true;
}
}
但是它不起作用,最终显示 "Link created" 每 5 秒在屏幕上闪烁一次。
我看到你在为文本添加动画效果。有很多方法可以做到这一点,但在这种情况下,我认为使用毫秒来为动画计时会很合适。本来可以反过来,但对于纯文本,我认为对您来说越简单越好。
为了更复杂的目的,我建议你learn about a design pattern named "States"。然而,对于这个动画,我们将以一种接近您已经完成的方式,但更符合您的目的。
我们将使用一个简单的 switch
,具有类似状态的逻辑。
switch 是一个简单的语句,它将一个变量与一系列可能的值进行比较。一旦它达到它识别的值,它就会 "enters" 这种情况并执行那里写的任何事情。
您可以将其想象成更基本的 If ... Else If ... Else
语句。它并不完全相同,因为你必须 "break" 才能读取 switch 中的一个 case
来避免其他的也被 运行 ,但最终它是相当的相似,但通常更容易阅读。
我们将使用 switch
,因为它易于使用,而且对您阅读和理解来说很干净。
"state" 是一种定义特定对象(在本例中是整个动画)当前发生的情况的方法。
我们需要一个新变量来保存当前状态。我想我们会称之为 "state"。它将是一个字符串。它可以是任何东西,我想,但是一个字符串对你来说很容易阅读,正如一位智者曾经说过的:人类的代码,作为一种副作用,计算机将能够阅读它。
开关将检查当前状态,并采取相应措施。这样,每次更改为新状态时,您都可以重置计时器。我正在修改您当前的代码以反映这一点,并让您完成大部分工作。
另外,最后一件事:为了让事情变得更容易,我给你这个 class:延迟。这是我作为学生编码的东西,我仍然不时使用它。它充当计时器。 class 将允许您设置时间并检查它是否已过期。
class Delay {
protected int limit;
public Delay() {limit = millis();}
public Delay (int l) {
limit = millis() + l;
}
public boolean expired () {
if (millis() > limit) { return true; }
return false;
}
}
这是修改后的代码(包括 Delay
class):
int per = 0;
String state = "beginning";
String currentText = "";
Delay delay;
String headband = "Clip band around your head to begin";
String access = "Welcome to Brain Frame -- an intersection between the mind and the virtual. Please press the blue button to proceed a neural link. Press the red button to exit.";
String Y ="Establishing pre-cursory neural link. Do not remove headband.";
String N ="Shutting Down. Do not remove headband until prompted - may result in memory distortion otherwise.";
boolean yes = false;
boolean no = false;
boolean head = false;
class Delay {
protected int limit;
public Delay() {limit = millis();}
public Delay (int l) {
limit = millis() + l;
}
public boolean expired () {
if (millis() > limit) { return true; }
return false;
}
}
void setup() {
size(1080, 720);
delay = new Delay();
}
void draw () {
SetText();
background(0);
fill(0,255,255);
text (currentText, 540, 360);
textSize(30);
textAlign(CENTER);
}
void SetText() {
// This method will check what text you should display and set it. The draw() method will... well, just "draw" everything.
// The switch "choose" what to do by checking what you set the "state" variable to.
switch(state) {
case "beginning":
currentText = headband;
if (head) {
state = "head";
}
break;
case "head":
currentText = access;
if (yes) {
state = "yes";
} else if (no) {
state = "no";
}
break;
case "yes":
currentText = Y + "\n" + per + "%";
if (per < 100) {
if (delay.expired()) {
// the delay timer will expire every 100 milliseconds until the 'per' variable is 100, kinda like you did but with a timer
per += 1;
delay = new Delay(100);
}
} else {
state = "childhood";
delay = new Delay(3000);
}
break;
case "no":
currentText = N;
break;
case "childhood":
currentText = "Think about your childhood";
if (delay.expired()) {
state = "link";
delay = new Delay(3000);
}
break;
case "link":
currentText = "Link created";
break;
}
}
void keyPressed(){
if (key == 'j' || key == 'J'){
head = true;
}
if (key == 'y' || key == 'Y'){
yes = true;
}
if (key == 'n' || key == 'N'){
no = true;
}
}
请注意,由于不知道您想要什么时间(或如何安排),我大致做了一些事情。您必须弄清楚如何按照您希望的方式进行这项工作。我认为您现在可以使用所有工具来完成这项工作。另外,如果您需要更多信息,我会在这里。
玩得开心!
我正在创建一个 "mock" 界面,"scans" 你的大脑,我想在草图中的特定时间点显示特定的视觉效果、图像、视频、声音等。
我已经尝试了很多我在多个论坛中找到的定时器解决方案——如果间隔是恒定的,它们就可以工作。但我对如何编写多个条件感到困惑,因为我的间隔不是恒定的,我希望在不同时间显示多个媒体。
我先用文本测试它。这是我目前所拥有的:
int per = 0;
int time;
String headband = "Clip band around your head to begin";
String access = "Welcome to Brain Frame -- an intersection between the mind and the virtual. Please press the blue button to proceed a neural link. Press the red button to exit.";
String Y ="Establishing pre-cursory neural link. Do not remove headband.";
String N ="Shutting Down. Do not remove headband until prompted - may result in memory distortion otherwise.";
boolean yes = false;
boolean no = false;
boolean head = false;
void setup() {
size(1080, 720);
time = millis();
}
void draw () {
background(0);
fill(0,255,255);
text (headband, 540, 360);
textSize(30);
textAlign(CENTER);
if(head) {
background(0);
text(access, 540, 360);
}
if(yes) {
background(0);
text(Y + "\n" + per + "%", 540, 360);
if (per < 100) {
per +=1;
} else {
per = 100;
background(0);
if (millis() - time >= 5000) {
text("Link created", 540, 360);
time = millis();
if (millis() - time >= 3000) {
background(0);
text("think about your childhood", 540, 360);
time = millis();
}
}
if (no) {
background(0);
text(N, 540, 360);
}
}
}
}
void keyPressed(){
if (key == 'j' || key == 'J'){
head = true;
}
if (key == 'y' || key == 'Y'){
yes = true;
}
if (key == 'n' || key == 'N'){
no = true;
}
}
但是它不起作用,最终显示 "Link created" 每 5 秒在屏幕上闪烁一次。
我看到你在为文本添加动画效果。有很多方法可以做到这一点,但在这种情况下,我认为使用毫秒来为动画计时会很合适。本来可以反过来,但对于纯文本,我认为对您来说越简单越好。
为了更复杂的目的,我建议你learn about a design pattern named "States"。然而,对于这个动画,我们将以一种接近您已经完成的方式,但更符合您的目的。
我们将使用一个简单的 switch
,具有类似状态的逻辑。
switch 是一个简单的语句,它将一个变量与一系列可能的值进行比较。一旦它达到它识别的值,它就会 "enters" 这种情况并执行那里写的任何事情。
您可以将其想象成更基本的 If ... Else If ... Else
语句。它并不完全相同,因为你必须 "break" 才能读取 switch 中的一个 case
来避免其他的也被 运行 ,但最终它是相当的相似,但通常更容易阅读。
我们将使用 switch
,因为它易于使用,而且对您阅读和理解来说很干净。
"state" 是一种定义特定对象(在本例中是整个动画)当前发生的情况的方法。
我们需要一个新变量来保存当前状态。我想我们会称之为 "state"。它将是一个字符串。它可以是任何东西,我想,但是一个字符串对你来说很容易阅读,正如一位智者曾经说过的:人类的代码,作为一种副作用,计算机将能够阅读它。
开关将检查当前状态,并采取相应措施。这样,每次更改为新状态时,您都可以重置计时器。我正在修改您当前的代码以反映这一点,并让您完成大部分工作。
另外,最后一件事:为了让事情变得更容易,我给你这个 class:延迟。这是我作为学生编码的东西,我仍然不时使用它。它充当计时器。 class 将允许您设置时间并检查它是否已过期。
class Delay {
protected int limit;
public Delay() {limit = millis();}
public Delay (int l) {
limit = millis() + l;
}
public boolean expired () {
if (millis() > limit) { return true; }
return false;
}
}
这是修改后的代码(包括 Delay
class):
int per = 0;
String state = "beginning";
String currentText = "";
Delay delay;
String headband = "Clip band around your head to begin";
String access = "Welcome to Brain Frame -- an intersection between the mind and the virtual. Please press the blue button to proceed a neural link. Press the red button to exit.";
String Y ="Establishing pre-cursory neural link. Do not remove headband.";
String N ="Shutting Down. Do not remove headband until prompted - may result in memory distortion otherwise.";
boolean yes = false;
boolean no = false;
boolean head = false;
class Delay {
protected int limit;
public Delay() {limit = millis();}
public Delay (int l) {
limit = millis() + l;
}
public boolean expired () {
if (millis() > limit) { return true; }
return false;
}
}
void setup() {
size(1080, 720);
delay = new Delay();
}
void draw () {
SetText();
background(0);
fill(0,255,255);
text (currentText, 540, 360);
textSize(30);
textAlign(CENTER);
}
void SetText() {
// This method will check what text you should display and set it. The draw() method will... well, just "draw" everything.
// The switch "choose" what to do by checking what you set the "state" variable to.
switch(state) {
case "beginning":
currentText = headband;
if (head) {
state = "head";
}
break;
case "head":
currentText = access;
if (yes) {
state = "yes";
} else if (no) {
state = "no";
}
break;
case "yes":
currentText = Y + "\n" + per + "%";
if (per < 100) {
if (delay.expired()) {
// the delay timer will expire every 100 milliseconds until the 'per' variable is 100, kinda like you did but with a timer
per += 1;
delay = new Delay(100);
}
} else {
state = "childhood";
delay = new Delay(3000);
}
break;
case "no":
currentText = N;
break;
case "childhood":
currentText = "Think about your childhood";
if (delay.expired()) {
state = "link";
delay = new Delay(3000);
}
break;
case "link":
currentText = "Link created";
break;
}
}
void keyPressed(){
if (key == 'j' || key == 'J'){
head = true;
}
if (key == 'y' || key == 'Y'){
yes = true;
}
if (key == 'n' || key == 'N'){
no = true;
}
}
请注意,由于不知道您想要什么时间(或如何安排),我大致做了一些事情。您必须弄清楚如何按照您希望的方式进行这项工作。我认为您现在可以使用所有工具来完成这项工作。另外,如果您需要更多信息,我会在这里。
玩得开心!