0

言語学および心理学の実験用にjsPsychライブラリのスクリプトを変更しようとしています。これは、画像を連続して表示し、ユーザーが回答できるコードです。

画像が表示される時間を設定できますが、グループでのみ (= すべての画像で同じ時間)、最後の画像と最後の画像の前の画像を異なる時間で表示する必要があります。誰かがそれを達成する方法を教えてくれますか?

  var animate_interval = setInterval(function() {
    display_element.html(""); // clear everything
    animate_frame++;

    //zobrazeny vsechny obrazky
    if (animate_frame == trial.stims.length) { 
      animate_frame = 0;
      reps++;
      // check if reps complete //
      if (trial.sequence_reps != -1 && reps >= trial.sequence_reps) {
        // done with animation
        showAnimation = false;
      }
    }

    // ... parts of plugin, showing answers and so on.

  }, 
  3000); // <---------------- how to change this value for the last and one before lastelement?

これで十分かどうかはわかりませんが、そうでない場合は、最善を尽くしますので、お問い合わせください。よろしくお願いします!

4

2 に答える 2

1

setInterval を使用して、異なる時間間隔で画像を表示できます。次の点を考慮してください。

制御システムは、同じ時間間隔を使用して画像 1、2、…n-2 を表示し、別の時間間隔 (「setInterval」、2015) を使用して画像 n-1、n を表示します。図 1 は、ペトリ ネットによる制御システムのプロセス モデルです。この返信の PDF 版は、インタラクティブなペトリ ネットです。

ここに画像の説明を入力 図1

P_1 (m_1) のマークは、変数 animate_frame に相当します。m_1=0 の場合、画像は表示されません。m_1=1 の場合、最初の画像が表示されます。m_1=2 の場合、2 番目の画像が表示されます。等々。合計 10 個の画像が表示される場合、初期値は〖 m〗_0=8、〖 m〗_1=0、〖 m〗_2=2.m_0 が最初の時間間隔の使用を制御するために使用されます。 . m_2 は、2 番目の時間間隔の使用を制御するために使用されます。m_1 は画像を表示するために使用されます。

2 つの実行または実行ロジックがあります。

  1. 最初の実行または実行ロジック (rn1) は、最初の時間間隔 (1 秒など) を使用します。画像 1 ~ n-1 を表示します。画像 n-1 を表示した後、間隔オブジェクトを削除し、2 番目の実行ロジック用に新しい間隔オブジェクトをスケジュールします。

  2. 2 番目の実行または実行ロジック (rn2) は、2 番目の時間間隔 (4 秒など) を使用します。最後の画像を表示し、最後の画像をディスプレイから削除します。

画像を表示するには 3 つの方法があります。最初の方法 (T_0) は、次の画像の表示を、m_1 を 1 ずつ増やし、m_(0) を 1 ずつ減らすことと組み合わせます。 . 3 番目の方法 (T_2) は空白を表示し、最後の画像を削除します。任意の時点で、計算ロジック T_0、T_1、および T_2 のいずれかまたは 1 つだけが発生する可能性があります。どの計算ロジックも実行できない場合、実行ロジックは終了します。つまり、間隔オブジェクトがクリアされます (例: clearInterval())。

図 1 のペトリネットをガイドとして使用すると、制御システムのコンピューター プログラムは次のように編成できます。

rn1

if (m_0≥1)  {
  // T_0
  m_0=m_0-1
  m_1=m_1+1
  // update image using plugin API
} else if ((m_0==0)  && (m_2≥1))  {
  // T_1
  m_2=m_2-1
  m_1=m_1+1
  // update image using plugin API
  clearInterval(ai);
  ai=setInterval(rn2,4000);
} else
  clearInterval(ai);

rn2

if (m_2≥1)  {
  // T_1
  m_2=m_2-1
  m_1=m_1+1
  // update image using plugin API
} else if (m_2==10)  {
  // T_2
  m_1=m_1-1
  // hide image using plugin API
} else
  clearInterval(ai);

制御システムを開始するには:

ai=startInterval(rn1,1000);

その後、rn1 は最終的に st2 を呼び出し、rn2 は最終的にプロセスを終了します。追加の計算 (display_element.html("") など) が必要な場合は、それらを rn1 と rn2 に追加します。

参考文献

「setInterval、最後の要素と最後の要素の 1 つ前の異なる間隔 (jsPsych)」(2015)。スタックオーバーフロー。2015 年 11 月 5 日にsetInterval から取得、最後の要素と最後の要素の 1 つ前の間隔が異なります (jsPsych)

于 2015-11-08T02:11:52.987 に答える
1

setInterval の代わりに、setTimeout コールバックをチェーンできます。これにより、各関数呼び出し間の遅延を操作できます。関数を構成し、ロジックを実装して最後の 2 つのテストの遅延を決定する方法を次に示します。

var showImage = function(currTest, lastTest) {
    display_element.html(""); // clear everything
    animate_frame++;

    //zobrazeny vsechny obrazky
    if (animate_frame == trial.stims.length) { 
        animate_frame = 0;
        reps++;
        // check if reps complete //
        if (trial.sequence_reps != -1 && reps >= trial.sequence_reps) {
            // done with animation
            showAnimation = false;
        }
    }
    // ... parts of plugin, showing answers and so on.

    // create a wrapper function so we can pass params to showImage
    var wrapper = function() {
        showImage(currTest + 1, lastTest);
    }

    if (currTest === lastTest) {
        setTimeout(wrapper, your_other_desired_delay);
    } else if (currTest - 1 === lastTest) {
        setTimeout(wrapper, your_desired_delay);
    } else if (currTest < lastTest) {
        setTimeout(wrapper, standard_delay);
    }
}

showImage(0, trials.length);
于 2015-11-05T23:09:52.087 に答える