6

必要な条件が同時に満たされている場合、matlab スクリプトが 2 つの異なる関数を同時に実行することは可能ですか?

この例では、プロジェクトとして matlab で 2 人用の格闘ゲームを作成しています。

for ループを含む個別の if ステートメントを介してこれを実行すると、一方のプレーヤーが空中で停止し、もう一方のプレーヤーがジャンプを完了してから、最初のプレーヤーが通常どおりジャンプを続けます。

現在、アクションを「ハードコーディング」しており、それらを関数に変換したいと考えています。

2 つのジャンプの例を以下に示します。
2 人のプレイヤーも現在ブロックであり、スプライトに変換する必要があるため、前後に歩くなどのすべてのアクションにも原則として for ループがあるため、この質問は私のプロジェクトにとって最も重要です。

if double(c(1)) == 30 &&  double(c(2)) == 0 && jump == 0 % up
        jump=1;
        for dt=0:18
            dy=dy+20*0.1;
            y = y + dy;
            set(player,'Position',[x y w h]);
            pause(0.07)
            if double(c(1))==122 || double(c(2))==122 || double(c(3))==122 %check for punch
                if abs(x-x2)<=64 && hit2==0
                    h2=h2-10;
                    hit2=1;
                    x=x;
                    if x<x2
                        x2=x2+2*dx;
                    elseif x>x2
                        x2=x2-2*dx;
                    end
                    if h2<=0
                        disp('YOU WIN');
                    else
                        set(health2,'position',[640-h2 0 h2 20])
                    end
                    set(player2,'position',[x2 y2 wp hp])
                end
            elseif double(c(1))==120 || double(c(2))==120 || double(c(3))==120 %check for kick
                if abs(x-x2)<=70 && hit2==0
                    h2=h2-15;
                    hit2=1;
                    x=x;
                    if x<x2
                        if x2>=580
                            x2=580;
                        elseif x2<580
                            x2=x2+6*dx;
                        end
                    elseif x>x2
                        if x2<=0;
                            x2=0;
                        elseif x2>0
                            x2=x2-6*dx;
                        end
                    end
                    if h2<=0
                        disp('YOU WIN');
                    else
                        set(health2,'position',[640-h2 0 h2 20])
                    end
                    set(player2,'position',[x2 y2 wp hp])
                end
            end
        end
        dy=-dy; 
        y=126;
        jump=0;
        hit2=0;
    end
    if double(f(1))==105 && double(f(2))==0 && jump2 == 0 %player 2 up
        jump2=1;
        for dt2=0:1:18
            dy2=dy2+20*0.1;
            y2=y2+dy2;
            set(player2,'position',[x2 y2 wp hp]);
            pause(0.07)
             if double(f(1))==103 || double(f(2))==103 || double(f(3))==103 %Player 2 check for punch
                if abs(x-x2)<=64 && hit1==0
                    h1=h1-10;
                    hit1=1;
                    x2=x2;
                    if x<x2
                        if x>=580
                            x=580;
                        elseif x<580
                            x=x-2*dx;
                        end
                    elseif x>x2
                        if x<=0
                            x=0;
                        elseif x>0
                            x=x+2*dx;
                        end
                    end
                    if h1<=0
                        disp('Player 2 YOU WIN');
                    else
                        set(health,'position',[0 0 h1 20])
                    end
                    set(player2,'position',[x2 y2 wp hp])
                end
            elseif double(f(1))==104 || double(f(2))==104 || double(f(3))==104 %check for kick
                if abs(x-x2)<=70 && hit1==0
                    h1=h1-15;
                    hit1=1;
                    x=x;
                    if x<x2
                        if x>=580
                            x=580;
                        elseif x<580
                            x=x+6*dx;
                        end
                    elseif x>x2
                        if x<=0;
                            x=0;
                        elseif x>0
                            x=x-6*dx;
                        end
                    end
                    if h1<=0
                        disp('Player 2 YOU WIN');
                    else
                        set(health1,'position',[0 0 h1 20])
                    end
                    set(player,'position',[x y w h])
                end
            end
        end
        dy2=-dy2; %#ok<*NASGU>
        y2=126;
        jump2=0;
        hit1=0;
    end
4

3 に答える 3

3

Matlabが一度に複数の関数を実行することはできません。Matlabは、厳密にシングルスレッドのプログラミング環境です。つまり、スクリプト内のコマンドを順番に実行します。ユーザーは、Matlabでマルチスレッドコードを直接記述できません。一部の組み込みのMatlab関数はマルチスレッドをサポートしており、たとえばマルチスレッドMEX関数を記述できますが、厳しい制限があります。MatlabMEXインターフェイス(たとえば、メモリ割り当て)はスレッドセーフではないため、1つに割り当てます。スレッド化するか、Matlab関数を呼び出す前にバリアを使用します。

タイマー機能を使用して、プログラムの実行を「中断」し、その間に何かを実行できる場合もありますが、実行パスは常に1つだけです。

また、ParallelProcessingToolboxで複数のワーカーを開始できます。ただし、「マスター」スクリプトは引き続きシングルスレッドであり、ワーカーの完了を待って計算結果を取得します。

于 2012-12-03T15:01:05.947 に答える
2

必要なのはスレッド化された操作と呼ばれます。Matlabはそのようなもののサポートをかなり制限していますが、いくつかあります。特に、batchコマンドがあります。もちろん、これは並列処理ツールキットがあることを前提としています。

batch start_function

ただし、一般的には、最初にアクションを取得してからアクションを実行するという、より注意深いループによって同じことを実現できます。状態を注意深く追跡すると、いくつかのアクションが数フレームの間に発生する可能性があります。コードをこれに変換するのは複雑ですが、基本的な考え方を示しましょう(このコードは実行されませんが、大まかに何をすべきかを示す必要があります)。

player1_jump=false
player2_jump=false;
while(true)
   key=getKey();
   if key==PLAYER1_JUMP_KEY
      player1_jump=true;
   end
   if key==PLAYER2_JUMP_KEY
      player2_jump=true;
   end
   if player1_jump
      %Move player 1 one step
      if (done) %Put in your own criteria
          player1_jump=false;
      end
   end
   if player2_jump
      %Move player 2 one step
      if (done) %Put in your own criteria
          player2_jump=false;
      end
   end
end

各プレーヤーがジャンプのどこにいるかなどを追跡する必要があることに注意してください。また、GUIを更新するには、小さな一時停止ステートメントが必要になります。ただし、一般的なパターンは当てはまるはずです。詳細はお任せします。

于 2012-12-03T15:02:18.297 に答える
0

あなたは調べたいかもしれません

parfor

これは、操作を並行して実行する方法です。これがまさにあなたが探しているものかどうかはわかりませんが、あなたの説明と一致しているようです

http://www.mathworks.com/help/matlab/ref/parfor.html

于 2012-12-04T04:09:36.133 に答える