如果同时满足两个不同函数所需的条件,matlab脚本是否可以同时运行这两个不同的函数?
在这个例子中,我在matlab上制作了一个双人格斗游戏作为一个项目:在任何时候,如果两个人都说试着跳。
通过单独的if语句执行,其中包含for循环,使一个玩家在半空中停止,而另一个完成跳跃,然后第一个玩家像往常一样继续跳跃。
目前,我已经‘硬编码’了动作,并希望将它们转换为函数。
下面给出了两个跳跃的示例。
这两个玩家目前也是块,必须转换成精灵,所以每个动作,比如来回走动,原则上也会有一个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发布于 2012-12-03 23:01:06
Matlab不可能一次运行多个函数。Matlab是一个严格的单线程编程环境,即它按顺序执行脚本中的命令。用户不能直接在Matlab中编写任何多线程代码。一些内置的Matlab函数do support multi-threading,你可以写一个多线程的MEX函数,但是有严重的限制: Matlab MEX接口(例如,内存分配)不是线程安全的,所以你要么在一个线程中分配,要么在调用Matlab功能之前使用屏障。
有时,您可以使用计时器功能来“中断”程序的执行,同时执行某些操作,但在任何给定的时刻,仍然只有一条执行路径。
此外,还可以在并行处理工具箱中启动多个工作器。但是,“主”脚本仍然是单线程的,等待工作进程完成后才能获得计算结果。
发布于 2012-12-03 23:02:18
您需要的是所谓的线程操作。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-04 12:09:36
你可能会想要调查
parfor它是并行执行操作的一种方式。我不确定这是否是你要找的东西,但它似乎符合你的描述
http://www.mathworks.com/help/matlab/ref/parfor.html
https://stackoverflow.com/questions/13685227
复制相似问题