0

所以我有以下代码表达“AI”运动。pdl_R 是 AI 桨,AIH 是 AI 高度,AIHS 是 AI 高度速度。我希望代码通过 AIH 向 AIHS 方向移动桨。

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(AI 桨)到达屏幕底部(向下是默认方向)时,它会停留在那里并上下闪烁 3 个像素(而不是预期的方向切换)。

我的初始 AIH 是 200,我的初始 AIHS 是 1。

4

2 回答 2

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 之间弹跳,一旦到达其中之一就会反转。

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

于 2012-11-07T11:09:05.673 回答
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 被分配了等于 stage.stageHeight 的 AIH,但桨现在向上移动!因此,当您再次检查您的状况时,AIHS 恢复为 +3。而且,AIH 已经是 stage.stageHeight-3,所以再往前 2 帧循环会重复。

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

于 2012-11-07T12:49:46.530 回答