2012-11-07 45 views
0

所以我有下面的代码表示“AI”运动。 pdl_R是AI桨,AIH是AI高度,AIHS是AI高度速度。我希望代码通过AIH向AIHS方向移动桨。AS3 Flash Pong游戏:AI桨没有按预期移动

pdl_R.y=AIH; 
AIH+=(3*AIHS); 
if(pdl_R.y==stage.stageHeight || pdl_R.y==stage.stageHeight-pdl_R.height) 
{ 
    AIHS*=-1; 
} 

但当pdl_R(人工智能桨法)到达屏幕的底部(向下是默认的方向),它保持有闪烁和向上,并通过3个像素(而不是预期的方向开关)向下。

我的初始AIH是200和我的初始AIHS是1

回答

0

当您的AIH达到stage.stageHeight,会发生以下情况:

  1. Y被分配stage.stageHeight(== AIH)
  2. AIH由3 * AIHS(== 3,假设AIHS递增== 1,虽然AIHS的实际价值并不重要,但只有它的符号)。因此,你的桨实际上比你想要的移动3个像素。
  3. 你检查条件,这是真的,所以AIHS = -1 * AIHS。 AIHS现在是-3。
  4. 好的,下一帧,Y被分配AIH(== stage.stageHeight + 3),AIH增加AIHS,现在再等于stage.stageHeight。检查条件是错误的,对AIHS不变。桨现在向上移动。
  5. 下一帧,Y分配的AIH等于stage.stageHeight,但桨正在向上移动!所以,当你再次检查你的情况时,AIHS回复到+3。而且,AIH已经是stage.stageHeight-3,所以循环将会重复2帧。

解决方法是在改变AIHS后增加AIH。这实际上是错误的最常见原因,您首先应用未改变的值,然后改变它,而不是先改变,然后再应用。

+0

感谢你们俩......正确的代码是'pdl_R.y = AIH; \t \t \t如果(pdl_R.y <= 0 + pdl_R.height/2 || pdl_R.y> = stage.stageHeight-pdl_R.height/2) \t { \t \t AIHS * = - 1; \t} \t AIH + =(3 * AIHS);' – mechanicarts

0

在下面的if语句:

if(pdl_R.y==stage.stageHeight || pdl_R.y==stage.stageHeight-pdl_R.height) 
{ 
    AIHS*=-1; 
} 

使用对桨叶高度(30)和载物台的高度的一些示例的数字(600 ),你问:

if(paddle.y == 600 || paddle.y == 570) 
{ 
    ReversePaddleDirection 
} 

这可以解释桨被卡住的底部,因为它会永远570和600之间跳跃,因为它达到一个或尽快扭转另一个。

如果不是这种情况,我们可以使用一些更多的信息(即实际的舞台高度和桨高)进一步调试。