Is it possible for matlab script to execute two different functions at the same time

Is it possible for a matlab script to execute two different functions at the same time if the conditions being executed at the same time are fulfilled?

In this case, I am doing a bipartisan game on Matlab as a project: anytime if both players say try to jump.

Doing this with separate if commands with loops inside them makes one player stop in the air and the other ends his jump, and then the first player continues his jump, as usual.

I am currently hard-coded for actions and would like to convert them into functions.

Examples of two jumps are given below.
Both players are also blocks and must be converted to sprites, so every action, for example, walking back and forth, will also have a for loop in principle, so this question is of primary importance for my project.

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',[xywh]); 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',[xywh]) end end end dy2=-dy2; %#ok<*NASGU> y2=126; jump2=0; hit1=0; end 
+6
source share
3 answers

Matlab cannot run more than 1 function at a time. Matlab is a strictly single-threaded programming environment, that is, it executes commands in scripts sequentially. The user cannot write multi-threaded code in Matlab directly. Some Matlab built-in functions support multithreading , and you can, for example. write a multi-threaded MEX function, but there are serious limitations: the Matlab MEX interface (for example, memory allocation) is not thread safe, so you either allocate in one thread or use barriers before any call to Matlab functionality.

Sometimes you can use the timer function to “interrupt” program execution and execute something in average time, but at any given time there is only one way to execute.

In addition, you can run several employees in the Parallel Processing Toolbox. However, the "master" script is still single-threaded and awaits completion to obtain the results of the calculations.

+3
source

What you want is called streaming operations. Matlab has pretty limited support for such things, but there are some. In particular, there is a batch command. Of course, this assumes that you have parallel processing tools.

 batch start_function 

In general, however, the same could have been done with a more thorough cycle in which you first get the actions and then complete the actions. Some actions may occur within a few frames if you closely monitor the status. To turn your code into this would be difficult, but let me show you the main idea (this code will not work, but should show you what to do):

 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 

Please note that you will need to keep track of where each player is jumping, etc. In addition, a small pause operator is required to update gui. But the big picture has to be kept, and I will leave you for the details.

+2
source

You might want to explore

 parfor 

This is a way to perform operations in parallel. I'm not sure if this is what you are looking for exactly, but seems to fit your description

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

0
source

All Articles