2012-11-07 83 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之間跳躍,因爲它達到一個或儘快扭轉另一個。

如果不是這種情況,我們可以使用一些更多的信息(即實際的舞臺高度和槳高)進一步調試。