0

現在、処理とフィデューシャルを使用してゲームを開発しています。基本的に、このゲームは特定の国に関連する質問をすることで構成されています。各質問の各 ANS は国です。例は、ピサの塔と ASN イタリアです。ユーザーは、イタリアの国旗を表す指標を表示する必要があります

カウントダウンタイマーを実行しましたが、新しいレベルが開始されたときにリセットできません。スイッチに各レベルがあります。

どうもありがとうございました!

コードは次のとおりです。

        import ddf.minim.*;
    import TUIO.*;
    TuioProcessing tuioClient;

    HashMap<Integer, String> symbolWordMap=new HashMap<Integer, String>();

    //The below variables are used to show the background image
    PImage bg;
    PImage start;
    PImage q1;
    PImage q2;
    PImage correct;
    PImage wrong;

    //The following are the variables used fro playing the sounds
    AudioPlayer player;
    AudioPlayer playerfail;
    Minim minim;

    int level = 0;

    int objSize=50;

    //This variable will be reduced everytime the player gets the answer wrong
    int lives = 5;

    //This variable will keep track of the score of the player
    int score = 0;

    //Declaring the font variable so as to display text on the screen
    PFont font;

    //Declaring the variable to be used for the timer
    //Timer t;


    //Below is the timer that will be used  
    void time(){
      int c;
      int csec;
      int climit = 20; //defined for a 20 second countdown

      c = climit*1000 - millis();
      csec = (c/(1000));

      if (csec > 0){
        text("TIME: "+csec+" secs",1800,50);
      } else {
        background(bg);
        text("TIME: 0 secs",1800,50);
        text("Time is up!",950,488);
      }
    }



    void setup()
    {
      symbolWordMap.put(0, "Start");  
      symbolWordMap.put(1, "Italy");
      symbolWordMap.put(2, "France");
      symbolWordMap.put(3, "Spain");
      symbolWordMap.put(4, "UK");
      symbolWordMap.put(5, "USA");
      symbolWordMap.put(6, "Malta");
      symbolWordMap.put(7, "Australia");
      symbolWordMap.put(8, "Germany");

      size(1920,976);

      //This is an instance of Minim
      minim = new Minim(this);

      //Load the applause mp3 file
      player = minim.loadFile("applause.mp3",2048);
      //Load the fail mp3 file
      playerfail = minim.loadFile("fail.mp3",2048);

      //Creating an instance of the Timer class
      //t = new Timer(20000);

      //savedTime = millis();

      //The below statement will load the image to be placed as a background from the Data folder. This image must be the same size as the window in which the program will run
      bg = loadImage("map.png");
      //Load the image for correct answer
      correct = loadImage("correct.png");
      //Load image for the incorrect answer
      wrong = loadImage("wrong.jpg");
      //Load the image for Question 1
      q1 = loadImage("Question1.png");
      //Load the image for Question 2
      q2 = loadImage("question2.png");
      //Load the image for the welcome page
      start = loadImage("Intro.png");

      //Creating the font of text to be displayed on screen;
      font = createFont("Arial",24,true);

      rectMode(CENTER);
      textAlign(CENTER, CENTER);

      // an instance of the TuioProcessing
      // since we ad "this" class as an argument the TuioClient expects
      // an implementation of the TUIO callback methods 
      tuioClient  = new TuioProcessing(this);
    }

    void draw()
    {

      //The following command will present the background
      background(bg);

      //Specifying the font to be used for text that is displayed on screen
      textFont(font,24);
      //Specifying the colour of the text that will be displayed on screen
      fill(0);

      if (level>0){
        text("SCORE: "+score,100,50);
        //text("Lives: "+lives,100,100);
      }

      //Creating the different levels
      switch(level){
        case 0:
        //Welcome Screen

        // get all the tuio objects detected by reactivision
        Vector<TuioObject> tuioObjectList =tuioClient.getTuioObjects();

        image(start,550,160);
        // Process each fiducial in turn
        for (int i=0;i<tuioObjectList.size();i++) {
          TuioObject tobj = tuioObjectList.get(i);

          pushMatrix();
          // Move origin to location of TUI object and rotate
          translate(tobj.getScreenX(width), tobj.getScreenY(height));
          rotate(tobj.getAngle());

          // draw the box
          fill(255);
          rect(0, 0, objSize, objSize);

          // Write the text inside the box 
          fill(0);

          int id = tobj.getSymbolID();
          String txt;
          if (symbolWordMap.containsKey(id)) {
            // if ID is in symbolWordMap, then look it up to find word
            txt = symbolWordMap.get(id);
          } 
          else { // otherwise, we'll just display the id number with a dot after
            txt = id+".";
          }
          text(txt, 0, 0);
          popMatrix();

          if (id == 0){
           level = 1;
           delay(2000);
          }
        }   

    break;

    case 1:
    //Level 1

        //Start timer
        //time();
        //noLoop();

        // get all the tuio objects detected by reactivision
        Vector<TuioObject> tuioObjectList1 =tuioClient.getTuioObjects();

        image(q1,550,160);
        // Process each fiducial in turn
        for (int i=0;i<tuioObjectList1.size();i++) {
          TuioObject tobj = tuioObjectList1.get(i);

          pushMatrix();
          // Move origin to location of TUI object and rotate
          translate(tobj.getScreenX(width), tobj.getScreenY(height));
          rotate(tobj.getAngle());

          // draw the box
          fill(255);
          rect(0, 0, objSize, objSize);

          // Write the text inside the box 
          fill(0);

          int id = tobj.getSymbolID();
          String txt;
          if (symbolWordMap.containsKey(id)) {
            // if ID is in symbolWordMap, then look it up to find word
            txt = symbolWordMap.get(id);
          } 
          else { // otherwise, we'll just display the id number with a dot after
            txt = id+".";
          }
          text(txt, 0, 0);
          popMatrix();

          if (id == 1){
            //Displays the text Correct on screen
            //text("Correct",500,500);
            score=score+10;
            background(bg);
            image(correct,800,300);
            player.play();
            player.rewind();
            //Time delay before advancing to next level
            delay(5000);            
            //Advance to level 2
            level++;
          } else {
            //Display the text Wrong to the left of the screen
            //text("Wrong",500,500);
            lives=lives-1;
            background(bg);
            image(wrong,700,300);
            playerfail.play();
            playerfail.rewind();
          }
        }   

    break;

    case 2:
    //Level 2

        //Start timer
        //time();
        //noLoop();


        // get all the tuio objects detected by reactivision
        Vector<TuioObject> tuioObjectList2 =tuioClient.getTuioObjects();

        //Load image for question 2
        image(q2,550,160);
        // Process each fiducial in turn
        for (int i=0;i<tuioObjectList2.size();i++) {
          TuioObject tobj = tuioObjectList2.get(i);

          pushMatrix();
          // Move origin to location of TUI object and rotate
          translate(tobj.getScreenX(width), tobj.getScreenY(height));
          rotate(tobj.getAngle());

          // draw the box
          fill(255);
          rect(0, 0, objSize, objSize);

          // Write the text inside the box 
          fill(0);

          int id = tobj.getSymbolID();
          String txt;
          if (symbolWordMap.containsKey(id)) {
            // if ID is in symbolWordMap, then look it up to find word
            txt = symbolWordMap.get(id);
          } 
          else { // otherwise, we'll just display the id number with a dot after
            txt = id+".";
          }
          text(txt, 0, 0);
          popMatrix();

           if (id == 8){
           //Displays the text Correct on screen
           //text("Correct",500,500);
           score=score+10;
           background(bg);
           image(correct,900,500);
           player.play();
           player.rewind();
           //Time delay before advancing to next level
           delay(5000);            
           //Advance to level 2
           level++;
         } else {
           //Display the text Wrong to the left of the screen
           //text("Wrong",500,500);
           lives=lives-1;
           background(bg);
           image(wrong,700,300);
           playerfail.play();
           playerfail.rewind();
         }
       }  

    break;

    case 3:
    //Level 3
    break;

    case 4:
    //Level 4
    break;

    case 5:
    //Level 5
    break;

  }
  //End of switch
}


void stopSound()
{
  player.close();
  playerfail.close();
  minim.stop();

  super.stop();
}
4

2 に答える 2

0

タイマーの実装は、タイマーがビジーであることを示しています。これが意味することは、複数回呼び出され、他の時間よりも遅いかどうかを確認することに依存していることです。ビジー タイマーの単純な実装は次のようになります。

while(getTime() < someTime) { do nothing; }

このタイプのタイマーは良くありません。スレッドを生成し、スリープを使用してみてください。これは、JavaScript のイベント ハンドラのようなものです。OS は、スレッドが要求された時点でスレッドを起動します。その後、タイマーが作動していることをプログラムに警告できます。その間に何もする必要がない場合は、メインを簡単にスリープ状態にすることもできますが、時間を追跡しながら何かをしているように見えました.

PS:「インポート」に基づいて、Javaを使用しているようです...。これは正しいです?もしそうなら、私はあなたのためにいくつかの参考文献を特定することができます.

于 2013-05-07T17:46:54.997 に答える
0

プログラムでタイマーが発生している場所を完全に理解していません。タイマー クラスが表示されます。

//Declaring the variable to be used for the timer
//Timer t;

しかし、コードで使用されているクラスが表示されません。時間のみの関数:

//Below is the timer that will be used  
void time(){
  int c;
  int csec;
  int climit = 20; //defined for a 20 second countdown

  c = climit*1000 - millis();
  csec = (c/(1000));

  if (csec > 0){
    text("TIME: "+csec+" secs",1800,50);
  } else {
    background(bg);
    text("TIME: 0 secs",1800,50);
    text("Time is up!",950,488);
  }
}

Processing スケッチでは使用delay()しないことをお勧めします。代わりに、一定時間後に別のイベントを発生させたい場合に別のタイマーを使用します。

Daniel Shiffman の例は、Processing にタイマーを実装する方法を理解するのに非常にシンプルで役立つと思います。これはオブジェクト指向のタイマーです。この場合、これがより役に立ちます。以下は、リンクの Timer クラスです。

class Timer {

  int savedTime; // When Timer started
  int totalTime; // How long Timer should last

  Timer(int tempTotalTime) {
    totalTime = tempTotalTime;
  }

  // Starting the timer
  void start() {
    // When the timer starts it stores the current time in milliseconds.
    savedTime = millis(); 
  }

  // The function isFinished() returns true if 5,000 ms have passed. 
  // The work of the timer is farmed out to this method.
  boolean isFinished() { 
    // Check how much time has passed
    int passedTime = millis()- savedTime;
    if (passedTime > totalTime) {
      return true;
    } else {
      return false;
    }
  }
}

ユーザーはどのようにレベルを切り替えていますか? 次のレベルをトリガーするキーの押下またはマウスの押下はありますか? それとも完全にタイマーに基づいていますか?キープレスに基づいている場合は、次のコードを組み込むことができます。

int level;
Timer levelTimer;

void setup() {
  levelTimer = new Timer(5000);
}

void draw() {
  println(levelTimer.isFinished());
}

void keyPressed() {
  switch(key) {
  case '1':
    level = 1;
    levelTimer.start();
    break;
  case '2':
    level = 2;
    levelTimer.start();
    break;
  case '3':
    level = 3;
    levelTimer.start();
    break;
  }
}

このようにして、ユーザーが選択したレベルに進むたびにレベル タイマーを開始します。ちょっとした考え。

于 2013-05-08T16:19:46.863 に答える