【问题标题】:Processing - void needs to execute on keyPressed but does not delay处理 - void 需要在 keyPressed 上执行但不延迟
【发布时间】:2015-01-10 00:21:05
【问题描述】:

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

比赛开始前。我想显示一张图片。 当按下任何键然后释放时,需要从那里开始操作列表。 我尝试使用 if keyPressed 功能,但电影(带音乐)似乎从头开始播放。 只有当您握住钥匙时,它才会起作用。我希望它在释放随机密钥时工作。

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

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

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

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);
}

【问题讨论】:

    标签: key processing delay pressed


    【解决方案1】:

    最常见的解决方案是提供状态变量并让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;
    }
    

    如您所见 - 某些操作(例如 keyPressed)可以改变 当前状态。 而draw() 方法只绘制依赖于状态的内容。

    您当然可以引入更多状态(STATE_X、STATE_Y 等)并在状态变化时执行更复杂的操作...

    您可以查看我过去关于引入状态以简化draw() 方法的答案: Run Code Inside One Thread In Another

    希望这会有所帮助..

    【讨论】:

      【解决方案2】:

      如果您只有两种状态,您可以使用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);
        }
        ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        相关资源
        最近更新 更多