2012-12-03 104 views
6

如果同時滿足它們所需的條件,matlab腳本可能同時運行兩個不同的函數嗎?matlab腳本是否可以同時運行兩個不同的函數

在這個例子中,我在matlab上做了一個雙人格鬥遊戲作爲一個項目:任何時候如果兩個玩家都說要跳。

通過單獨的if語句執行此操作,使得一個玩家在半空中停止,而另一個玩家完成跳躍,然後第一個玩家像往常一樣繼續跳躍。

目前我已'硬編碼'的行動,並希望將它們轉換爲功能。

下面給出兩個跳轉的例子。
這兩名球員目前也是積木,必須轉換成精靈,所以每個動作,如來回走動,原則上也會有一個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 
+2

我建議以不同的方式解決這個。給定任何時間t,有一組要執行的給定動作A(A可以是空的)。收集要執行的操作,然後執行,然後顯示結果。 – mmgp

回答

3

Matlab不可能一次運行多個函數。 Matlab是一個嚴格的單線程編程環境,即它按順序執行腳本中的命令。用戶不能直接在Matlab中編寫任何多線程代碼。一些內置的Matlab函數do support multi-threading,你可以例如編寫一個多線程MEX函數,但是存在嚴重的侷限性:Matlab MEX接口(例如,內存分配)不是線程安全的,因此您要麼在一個線程中分配,要麼在調用Matlab功能之前使用障礙。

有時,您可以使用計時器功能來「中斷」程序的執行並同時執行某些操作,但在任何給定時刻仍然只有一個執行路徑。

另外,您可以在並行處理工具箱中啓動多個工作人員。但是,「主」腳本仍然是單線程的,並等待工人完成以獲得計算結果。

2

你想要的就是所謂的線程化操作。 Matlab對這種事情的支持非常有限,但也有一些。特別是,有batch命令。當然,這假定你有並行處理工具包。

batch start_function 

但一般情況下,同樣的事情可以通過更仔細的循環,在那裏你第一次行動,然後再進行操作happen完成。如果您仔細跟蹤狀態,某些操作可能會在幾幀內發生。要打開你的代碼,這將是複雜的,但讓我告訴你的基本概念(此代碼將無法運行,而應該大致告訴你該怎麼做):

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。但一般模式應該保留,我會留給你解決細節問題。

相關問題