0

私は処理ファイルに取り組んでいます。これはカラオケ システムとして機能します。カラオケそのものが映画です。ポイントにも対応しています。

ゲーム開始前。写真を表示したい。いずれかのキーを押して離すと、そこからアクションのリストを開始する必要があります。if keyPressed 関数で試してみたのですが、ムービー(音楽あり)が最初から再生されるようです。キーを握っている時だけ作動します。ランダムキーを離したときに動作させたい。

ゲーム開始前に表示する必要がある部分は次のとおりです。

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

2 に答える 2

0

最も一般的な解決策は、状態変数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 Thed In Another

お役に立てれば..

于 2015-01-09T14:05:23.420 に答える
0

状態が 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);
  }
  ...
于 2015-01-09T16:21:05.197 に答える