2015-01-09 4 views
0

Я работаю над файлом обработки, он работает как караоке-система. Караоке - это фильм. Он также работает с очками.Обработка - void необходимо выполнить на keyPressed, но не задерживается

Перед началом игры. Я хочу показать изображение. Когда нажата любая клавиша, а затем отпустите, список действий должен начинаться оттуда. Я попытался использовать функцию if, нажав кнопку, но фильм (с музыкой), кажется, воспроизводится с самого начала. Он работает только тогда, когда вы держитесь за ключ. Я хочу, чтобы он работал, когда был освобожден случайный ключ.

Та часть, которая должна отображать до начала игры:

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

ответ

0

Наиболее распространенным решением является создание состояния Varia ble и сделать способ 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

Надеется, что это помогает ..

0

Если у вас есть только два состояния, которые можно использовать 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); 
    } 
    ... 

 Смежные вопросы

  • Нет связанных вопросов^_^