2012-12-03 6 views
6

E' possibile che uno script MATLAB esegua due funzioni diverse contemporaneamente se le condizioni richieste per esse sono soddisfatte allo stesso tempo?E 'possibile che uno script MATLAB esegua contemporaneamente due funzioni diverse

In questo caso, sto realizzando un gioco di combattimento a due giocatori su MATLAB come progetto: in qualsiasi momento se entrambi i giocatori dicono di provare a saltare.

Eseguendo questa operazione se le istruzioni separate con cicli for all'interno di esse fanno arrestare un giocatore a mezz'aria mentre l'altro completa il suo salto e quindi il primo giocatore continua il suo salto come al solito.

Attualmente ho "hardcoded" le azioni e vorrei convertirle in funzioni.

Gli esempi dei due salti sono riportati di seguito.
Anche i due giocatori sono attualmente blocchi e dovranno essere convertiti in sprite, quindi ogni azione, come camminare avanti e indietro, avrà anche un ciclo for in linea di principio, quindi questa domanda è fondamentale per il mio progetto.

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

Suggerisco la soluzione di questo in un modo diverso. In qualsiasi momento t, c'è un insieme di azioni date da eseguire (A potrebbe essere vuoto). Raccogli le azioni da eseguire, esegui quindi e mostra i risultati dopo. – mmgp

risposta

3

Non è possibile per Matlab eseguire più di 1 funzione alla volta. Matlab è un ambiente di programmazione strettamente a thread singolo, cioè esegue i comandi negli script in sequenza. L'utente non può scrivere alcun codice multi-thread in Matlab direttamente. Alcune funzioni Matlab incorporate do support multi-threading e ad es. scrivere una funzione MEX multi-thread, ma ci sono gravi limitazioni: l'interfaccia Matlab MEX (ad esempio, l'allocazione della memoria) non è thread-safe, quindi si allocano in un thread o si usano barriere prima di qualsiasi chiamata alla funzionalità Matlab.

A volte è possibile utilizzare la funzionalità del timer per "interrompere" l'esecuzione di un programma e fare qualcosa nel frattempo, ma c'è ancora un solo percorso di esecuzione in un dato momento.

Inoltre, è possibile avviare più worker in Parallel Processing Toolbox. Tuttavia, lo script "master" è ancora single threaded e attende il completamento degli worker per ottenere i risultati dei calcoli.

2

Quello che vuoi si chiama operazioni filettate. Matlab ha un supporto piuttosto limitato per queste cose, ma ce ne sono alcune. In particolare, c'è il comando batch. Ovviamente, questo presuppone che tu abbia il toolkit per l'elaborazione parallela.

batch start_function 

In generale, comunque, la stessa cosa potrebbe essere realizzato da una più attenta ciclo, in cui in primo luogo ottenere azioni, quindi apportare le azioni accadono. Alcune azioni potrebbero accadere nel corso di diversi fotogrammi, se si tiene traccia attentamente degli stati. Per trasformare il codice in questo sarebbe complessa, ma mi permetta di mostrare l'idea di base (Questo codice non verrà eseguito, ma dovrebbe mostrare più o meno che cosa fare):

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 

noti che si avrebbe dovuto tenere traccia di dove nel salto ogni giocatore è, ecc. Inoltre, sarebbe necessaria una piccola istruzione di pausa per aggiornare la GUI. Ma lo schema generale dovrebbe valere e ti lascio a elaborare i dettagli.

Problemi correlati