gpt4 book ai didi

java - 如何在处理中的不同时间间隔后触发不同的事件?

转载 作者:行者123 更新时间:2023-12-01 23:16:17 27 4
gpt4 key购买 nike

我正在创建一个“模拟”界面来“扫描”你的大脑,我想在我的草图中的某些时间点显示某些视觉效果、图像、视频、声音等。

我已经尝试了在多个论坛中找到的许多计时器解决方案 - 如果间隔恒定,这些解决方案就有效。但我对如何编写多个条件感到困惑,因为我的间隔不是恒定的,并且我希望在不同时间显示多个媒体。

我首先只用文本来测试它。这是我到目前为止所拥有的:

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;
}
}

但是它不起作用,最终显示“链接已创建”在屏幕上每 5 秒闪烁一次。

最佳答案

我发现您正在为文本添加动画。有很多方法可以做到这一点,但在这种情况下,我认为使用毫秒来计时你的动画可以做到这一点。也可能是相反的情况,但对于纯文本,我认为对您来说越简单越好。

对于更复杂的目的,我建议您 learn about a design pattern named "States" 。然而,对于这个动画,我们将以一种接近您已经做过的方式,但更适合您的目的的方式完成它。

我们将使用一个简单的开关,以及类似状态的逻辑。

switch 是一个简单的语句,它将变量与一系列可能的值进行比较。一旦它达到它所识别的值,它就会“进入”这个案例并执行其中写入的任何操作。

您可以将其想象为更基本的 If ... Else If ... Else 语句。它并不完全相同,因为可以读取开关内的一个 case,因为您必须“打破”一个 case 以避免其他 case 也运行,但最终它非常相似,但是通常更容易阅读。

我们将使用开关,因为它易于使用,而且您可以清晰地阅读和理解。

“状态”是一种定义特定对象(即本例中的整个动画)当前发生的情况的方法。

我们需要一个新变量来保存当前状态。我想我们称之为“状态”。这将是一个字符串。我想它可以是任何东西,但是字符串对你来说很容易阅读,正如一位智者曾经说过的:代码是为人类编写的,作为副作用,计算机将能够读取它。

开关将检查当前状态,并采取相应措施。这样,您每次更改为新状态时都可以重置计时器。我将修改您当前的代码以反射(reflect)这一点,并让您完成大部分工作。

另外,最后一件事:为了让事情变得更容易,我给你上这门课:延迟。这是我在学生时代编写的代码,现在我仍然时不时地使用它。它充当计时器。此类将允许您设置时间量并检查它是否已过期。

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 类):

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;
}
}

请注意,由于不知道您想要什么时间(或如何订购),我做了一些近似的事情。您必须弄清楚如何使其按照您想要的方式工作。我认为您现在将拥有可以使用的所有工具来执行此操作。另外,如果您需要更多信息,我会在这里。

玩得开心!

关于java - 如何在处理中的不同时间间隔后触发不同的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58351274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com