0

だから、私はビート検出を必要とするゲームに取り組んでいます。この時点で、ビート検出コードは動作していますが、ゲーム コード内で問題が発生しないように作業を進めている間、それは独自のスタンドアロン Java アプレットにあります。私の問題は、コードがビートを検出すると、ユーザーが画面をタップするよりも速くビートにならないように切り替わることです。

ビートが発生するたびにisBeatをfalseからtrueに切り替える単純なブール値を作成し、「True」と「False」という単語を出力しています。プログラムを実行すると、「True」という単語が画面に表示されるのはほんの一瞬なので、ほとんど見えません。isBeat の true から false への切り替えを遅らせる方法はありますか?

基本的に、この時点で、「True」(ビートが発生したことを意味する) という単語が画面に 1 秒間表示されるようにします。1 秒経過すると「False」に切り替わり、次の拍を待ちます。1 秒は少し長いですが、今のところ、この方法でより適切にテストできます。画面上の描画を単に変更するのを遅らせることはできませんが、最後のゲームで isBeat Boolean を使用するため、Boolean 全体の切り替えを遅らせる必要があります。ビートが発生すると、isBeat は true に切り替わり、プレイヤーが画面をタップするためのわずかな時間を与えてから、false に戻します。現在のようにビートが発生したことを知らせるテキストは画面に表示されません。

これがコードです。これは、Eclipse内での処理とともにminimライブラリを使用しています。

import processing.core.*;
import ddf.minim.*;
import ddf.minim.analysis.*;

public class MyProcessingSketch extends PApplet {

Minim minim;
AudioPlayer song;
BeatDetect beat;
BeatListener bl;

float kickSize, snareSize, hatSize;
float playPos, playLen, xpos;

int kickCount = 0;
int snareCount = 0;
int hatCount = 0;
int beatCount = 0;
boolean isBeat = false;

public void setup()
{
    size(600, 500);
    minim = new Minim(this);
    song = minim.loadFile("mainmenumusic.mp3");
    song.play();
    playPos = song.position();
    playLen = song.length();
    xpos = (playPos / playLen) * width;
    beat = new BeatDetect(song.bufferSize(), song.sampleRate());
    beat.setSensitivity(24);
    kickSize = snareSize = hatSize = 16;
    bl = new BeatListener(beat, song);
    textFont(createFont("Helvetica", 16));
    textAlign(CENTER);
}

public void draw()
{
    background(0);
    fill(255);
    beat.detect(song.mix);
    if(beat.isKick()) kickSize = 32;
    if(beat.isKick()) kickCount++;
    if(beat.isSnare()) snareSize = 32;
    if(beat.isSnare()) snareCount++;
    if(beat.isSnare() == true)
    {
        isBeat = true;      
        beatCount++;
    }
    else
    {
        isBeat = false;
    }
    if(beat.isHat()) hatSize = 32;
    if(beat.isHat()) hatCount++;
    textSize(kickSize);
    text("isBeat", width/4, height/4);
    if(isBeat == true)
        text("True", width/4, height/2);
    if(isBeat == false);
        text("False", width/4, height/2);
    textSize(snareSize);
    text("SNARE", width/2, height/4);
    text(snareCount, width/2, height/2);
    textSize(hatSize);
    text("HAT", 3*width/4, height/4);
    text(hatCount, 3*width/4, height/2);
    kickSize = constrain((int) (kickSize * 0.95), 16, 32);
    snareSize = constrain((int) (snareSize * 0.95), 16, 32);
    hatSize = constrain((int) (hatSize * 0.95), 16, 32);

}

public void stop()
{
    song.close();
    minim.stop();
    super.stop();
}

}

私はいくつかのグーグル検索を行い、wait() のようなことをいくつか試しましたが、私はそれらをすべて間違っているか、または私が望むように動作することを意図していません。私には理解できない単純な問題のように思えます...

4

2 に答える 2

1

コードに論理エラーがあると思います

if(isBeat == true)
        text("True", width/4, height/2);
    if(isBeat == false);    // <---- here you have ; so
        text("False", width/4, height/2); //<---- this will always be executed even if isBeat == true
    textSize(snareSize);
    text("SNARE", width/2, height/4);

それ以外は、スリープや待機などの使用はお勧めしません。待機中にスレッドがハングするためです。

私があなたに与えることができる提案は、現在の時間を利用して追加の条件を使用することです

long previous_beat = System.currentTimeMillis(); //<--- class variable
.
.

public void draw()
   {
    .
    .
        textSize(kickSize);
        text("isBeat", width/4, height/4);
        if(isBeat == true || previous_beat+10*1000> System.currentTimeMillis())
        {
          text("True", width/4, height/2);
          previous_beat = System.currentTimeMillis();
        }
        else if(isBeat == false)
            text("False", width/4, height/2);
        textSize(snareSize);
        text("SNARE", width/2, height/4);
        .
        .
   }
于 2013-09-09T16:12:27.630 に答える