我正在开发一款带有Processing和Fiducials的游戏。基本上这个游戏包括提出与某些国家相关的问题。每个问题的每个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();
}
答案 0 :(得分:0)
计时器的实现表明它是一个繁忙的计时器。这意味着它依赖于被多次调用并检查它是否晚于其他时间。繁忙计时器的简单实现如下:
while(getTime() < someTime) { do nothing; }
这种计时器并不好。你应该尝试产生一个线程,并使用睡眠。这有点像javascript事件处理程序。操作系统在询问时唤醒线程,然后您可以提醒程序计时器已启动。如果你不需要在同一时间做任何事情,你可以轻松地睡觉你的主要,但它看起来像你正在做的事情,而你在跟踪时间。
PS:根据您的“导入”,您似乎正在使用Java ...它是否正确?如果是这样,我可以为你确定一些参考文献。
答案 1 :(得分: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);
}
}
我建议不要在处理草图中使用delay()
,而是在一段时间后想要发生不同事件时使用不同的计时器。
我发现Daniel Shiffman的例子非常简单,有助于理解如何在Processing中实现计时器。 Here是一个面向对象的计时器,在这种情况下对你更有帮助。以下是链接中的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;
}
}
这样,每次用户进入他们选择的级别时,您都会启动级别计时器。只是一个想法。