2017-11-04 119 views
0

我正在用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); 
    } 

} 

回答

0

請嘗試發佈一個MCVE,而不是你的整個項目。只需組合一個能夠證明問題的小例子。這使我們更容易幫助你。

但是,您的問題是由您的savedTime,totalTimepassedTime變量在Timer類之外造成的。基本上這意味着它們在Timer類的所有實例之間共享。您可以使用println()語句來確認這一點。

要解決您的問題,只需在Timer類中移動這些變量,以便每個實例都有自己的副本。

如果仍有問題,請在新的問題文章中發帖MCVE,我們將從此處開始。祝你好運。

+0

對不起,我是Stack Overflow的新手。感謝您的回答,但問題仍然存在。我會發一個新帖子。 – tarlyo