处理 - void 需要在按键上执行,但不会延迟



我正在处理一个文件,它作为一个卡拉OK系统工作。卡拉OK本身就是一部电影。它也适用于积分。

在游戏开始之前。我想显示一张图片。当按下任何键然后释放时,需要从那里开始操作列表。我尝试了 if keyPress 函数,但电影(带音乐)似乎从一开始就播放。只有当您握住钥匙时,它才有效。我希望它在释放随机密钥时工作。

游戏开始前需要显示的部分是:

image(beginscherm, 0, 0, 1280, 720);

释放密钥后需要工作的部分来自:

image(mov, 0, 0, 1280, 720);

谁来帮我..

import ddf.minim.*;
import processing.video.*;
Movie mov;
Minim minim;
AudioInput input;
int inputNiveau;
float scoreH = 600;
boolean fotomaken = true;
Capture cam;
int x = 0;
PImage beginscherm;
void setup() {
  size(1280, 720);
  mov = new Movie(this, "karaoke_4.mp4");
  mov.play();
  cam = new Capture(this, 320, 180, 30);
  cam.start();
  textSize(28);
  minim = new Minim (this);
  input = minim.getLineIn (Minim.STEREO, 512); 
  beginscherm = loadImage("beginscherm.jpg"); 
}
void movieEvent(Movie m) {
  m.read();
}
void draw() {
  image(beginscherm, 0, 0, 1280, 720);
  image(mov, 0, 0, 1280, 720);
  if (cam.available()) {
      cam.read();
  }
  if ((scoreH >= 448.98) && (scoreH <= 451.00)){
    pushMatrix();
    scale(-1,1);
    image(cam, -320, 0);
    popMatrix();
  }
  if ((scoreH >= 449.99) && (scoreH <= 450.00) && (fotomaken == true)){
    saveFrame("images/sing-##.png");
    fotomaken = false;
  }
  inputNiveau = int(input.mix.level()*800);
  fill(137,197,255,127);
  text(inputNiveau, 800, 700);
  rect(900, 680, inputNiveau, 20);
  scoreH = constrain(scoreH, 0, 600);
  scoreH = constrain(scoreH, 0, 580);
  noStroke();
  fill(49,127,203);
  rect(1090,61,85,605,100);
  fill(137,197,255,127);
  rect(1090,61,85,scoreH,100,100,0,0);
  rotate(0.2);
  fill(252,209,22);
  rect(1070,-210,150,57);
  fill(0,56,147);
  rect(1070,-154,150,28);
  fill(206,17,38);
  rect(1070,-126,150,28);
  if(inputNiveau >= 0 && inputNiveau <= 150){
  scoreH = scoreH - 0.02; 
  }      
  if(inputNiveau >= 150 && inputNiveau <= 500){
  scoreH = scoreH - 0.06; 
  }      
  if(inputNiveau >= 500 && inputNiveau <= 900){
  scoreH = scoreH - 0.16; 
  }
  if(inputNiveau >= 900 && inputNiveau <= 1000){
  scoreH = scoreH - 0.5; 
  }
  println(scoreH);
}

最常见的解决方案是提供状态变量draw()并根据当前状态绘制方法。

尝试这样的事情:

int STATE_BEFORE = 1;
int STATE_AFTER = 2;
int state = STATE_BEFORE;
draw() {
  if (state == STATE_BEFORE) {
    drawBefore();
  }
  else if (state == STATE_AFTER) {
    drawAfer()
  }
  else if ...
}
void drawBefore() {
  image(beginscherm, 0, 0, 1280, 720);
  ...
}
void drawAfter() {
  image(mov, 0, 0, 1280, 720);
  ...
}
void keyReleased(KeyEvent e) {
  char key = e.getKeyChar();
  int code = e.getKeyCode();
  if (key == ' ') {
    changeState( STATE_AFTER );
  }
}
void changeState(int newState) {
  if (state == STATE_BEFORE) {
     // actions when leaving this state
  }
  if (state == STATE_AFTER) {
    // actions when leaving this state
  }
  state = newState;
}

如您所见 - 某些操作(例如按键)可以更改当前状态draw()方法只绘制取决于状态的内容。

当然,您可以引入更多状态(STATE_X、STATE_Y 等)和状态更改时执行的更复杂的操作......

您可以看到我过去关于引入状态以简化draw()方法的答案:在一个线程内运行代码

希望这有帮助..

如果只有两种状态,则可以使用boolean变量来定义密钥是否已释放以及视频是否正在运行。 初始化一些全局变量:

boolean kye_released = false;

你也从乞讨开始,因为你在setup里面开始了它。您需要mov.play()移动到keyReleased()事件句柄函数。

void keyReleased(){
  kye_released = true;  
  theMov.play();  
}

最后你需要做的是将它们分开draw()

void draw() {
  if(kye_released){    
    image(mov, 0, 0, 1280, 720);
  else{
    image(beginscherm, 0, 0, 1280, 720);
  }
  ...

最新更新