两个类的实例混在一起了吗?

问题描述:

我正在用Arduino和Processing创建一种游戏。在我的代码中,我使用Daniel Shiffman的类Timer,但是想使用两个不同类的实例创建两个不同的计时器。两个类的实例混在一起了吗?

我的问题是,这两个实例似乎混在一起,每个人都在做其他人应该做的事情的一部分。

例如,计时器应该运行10秒,并且correctTimer应该运行3秒,但它们都运行10秒。此外,定时器完成后,应将背景设置为红色,并在正确定时器完成时,应将背景设置为蓝色。但是,两台计时器在完成后将背景设置为蓝色。

有没有人有任何想法如何解决这个问题?

import processing.serial.*; 
int end = 10; 
String serial; 
Serial port; 
float[] array; 

// -------------------------------------------------- 

PImage img; 
PImage correct; 
PImage incorrect; 
float thumb; 
float index; 
float middle; 
float ring; 
float pinky; 

// -------------------------------------------------- 

String alphabet; 
int randomNum; 
String letter; 

// -------------------------------------------------- 

int savedTime; 
int totalTime; 
int passedTime; 
boolean quit = false; 
class Timer { 
    Timer(int tempTotalTime) { 
    totalTime = tempTotalTime; 
    } 
    void start() { 
    savedTime = millis(); 
    //quit = false; 
    } 
    boolean isFinished() { 
    passedTime = millis() - savedTime; 
    if (passedTime > totalTime) { 
     return true; 
    } else { 
     return false; 
    } 
    } 
} 
Timer timer; 
Timer correctTimer; 

// -------------------------------------------------- 

boolean checkLetter(String letterPicked, float flexR_THUMB, float flexR_INDEX, float flexR_MIDDLE, float flexR_RING, float flexR_PINKY) { 
    if (letterPicked == "A") { 
    if (flexR_THUMB > 12000 && flexR_THUMB < 22000 && 
     flexR_INDEX > 27958 && flexR_INDEX < 38500 && 
     flexR_MIDDLE > 26035 && flexR_MIDDLE < 41650 && 
     flexR_RING > 16492 && flexR_RING < 26000 && 
     flexR_PINKY > 37528 && flexR_PINKY < 53500) { 
      return true; 
     } else { 
      return false; 
    } 
    } 
return false; } 

// -------------------------------------------------- 

void setup() { 
    size(1280, 950); 
    background(255); 

    port = new Serial(this, "/dev/tty.usbmodem1421", 9600); 
    port.clear(); 
    serial = port.readStringUntil(end); 
    serial = null; 

    correct = loadImage("img/RIGHT.png"); 
    incorrect = loadImage("img/WRONG.png"); 
    correctTimer = new Timer(3000); 

    startOver(); 
} 

// -------------------------------------------------- 

void startOver() { 
    background(255); 

    letter = "A"; 

    img = loadImage("img/" + letter +".png"); 
    image(img, 0, 0, 1280, 950); 
    timer = new Timer(10000); 
    timer.start(); 
} 

// --------------------------------------------------  

void draw() { 
    while(port.available() > 0) { 
    serial = port.readStringUntil(end); 
    } 

    if (serial != null) { 
    float[] array = float(split(serial, ',')); 
    thumb = array[0]; 
    index = array[1]; 
    middle = array[2]; 
    ring = array[3]; 
    pinky = array[4]; 
    } 

    if (checkLetter(letter, thumb, index, middle, ring, pinky) == true && quit == false) { 
    image(correct, 0, 0, 1280, 950); 
    quit = true; 
    correctTimer.start(); 
    } else if (timer.isFinished() && quit == false) { 
    background(255, 0, 0); 
    quit = true; 
    correctTimer.start(); 
    } 

    if (correctTimer.isFinished()) { 
    background(0, 0, 255); 
    } 

} 

请尝试发布一个MCVE,而不是你的整个项目。只需组合一个能够证明问题的小例子。这使我们更容易帮助你。

但是,您的问题是由您的savedTime,totalTimepassedTime变量在Timer类之外造成的。基本上这意味着它们在Timer类的所有实例之间共享。您可以使用println()语句来确认这一点。

要解决您的问题,只需在Timer类中移动这些变量,以便每个实例都有自己的副本。

如果仍有问题,请在新的问题文章中发帖MCVE,我们将从此处开始。祝你好运。

+0

对不起,我是Stack Overflow的新手。感谢您的回答,但问题仍然存在。我会发一个新帖子。 – tarlyo