1

2012 年 9 月 20 日、午後 7 時 27 分 GMT+8.. コード「continue;」を使用しても同じエラーが引き続き発生する...他の提案はありますか? :(

以前の回答がまだ機能していないのを助けてください.. :(

チュートリアルの練習。オブジェクトがキャッチャーをgitすると、コードのこの部分でエラーが発生します..

function moveObject(e:Event):void {
    // cycle thru objects using a for loop
    for (var i:int=objects.length-1; i>=0; i--) {
        //move objects down based on speed
        objects[i].y += speed;
        objects[i].rotation += speed;
        // if objects leaves the stage
        if (objects[i].y > 400) {
            // remove it from display list
            removeChild(objects[i]);
            // remove it from the array backwards
            // remove it backwards removes all problems when looping through.
            // forward would cause confusion if you removed 5 before 4. 
            objects.splice(i, 1);

        }
        if (objects[i].hitTestObject(player.arrowS.sackC)) {
            if (objects[i].typestr == "good") {
                score += 3;
            } else {
                score -= 5;
                if (score <= 0) {
                    score = 0;
                }
            }
            trace(score);
            updateScore(score);
            removeChild(objects[i]);
            objects.splice(i, 1);
        }
    }
  }

ゲームはまだ動作していますが、これを見るとイライラします。これがエラーです

TypeError: Error #2007: Parameter hitTestObject must be non-null.
at flash.display::DisplayObject/flash.display:DisplayObject::_hitTest()
at flash.display::DisplayObject/hitTestObject()
at adventure_fla::MainTimeline/moveObject()
4

5 に答える 5

0

サー私は私の問題を解決するための答えを得ましたそれはコードではありませんが、私がキャラクターのために作ったアニメーションでは、両方ともインスタンス名sackC:Dを持つキーフレームが含まれているためです

私はそれがコーディングを行う専門的な方法ではないことを知っていますが、私は何を言うことができますか..私はただの初心者です..

みなさん、ありがとうございました。

于 2012-09-22T03:38:56.040 に答える
0

配列をループしているのですif (objects[i].y > 400) {が、trueの場合、その要素を配列からスプライスするので、objects[i]nullになります。

次に、行って実行しますif (objects[i].hitTestObject(player.arrowS.sackC)) {が、最初の条件がtrueの場合objects[i]、値がなくなったため、投稿されたエラーが発生します。

あなたがしたいのは、ループから抜け出すことではなくcontinue、ループが次のアイテムに移動するようにキーワードを使用することです。

if (objects[i].y > 400) {
        // remove it from display list
        removeChild(objects[i]);
        // remove it from the array backwards
        // remove it backwards removes all problems when looping through.
        // forward would cause confusion if you removed 5 before 4. 
        objects.splice(i, 1);
        continue; //abandon the rest of this loop cycle (since objects[i] is now null), and move on to the next loop cycle, so the below code doesn't execute for the current i
}

上記に加えて、自分player.arrowS.sackCがnullでないことも確認する必要があります。

if(player && player.arrowS && player.arrowS.sackC && objects[i].hitTestObject(player.arrowS.sackC))
于 2012-09-19T17:51:25.710 に答える
0
function moveObject(e:Event):void {
    // cycle thru objects using a for loop
    for (var i:int=objects.length-1; i>=0; i--) {
        //move objects down based on speed
        objects[i].y += speed;
        objects[i].rotation += speed;
        // if objects leaves the stage
        if (objects[i].y > 400) {
            // remove it from display list
            removeChild(objects[i]);
            // remove it from the array backwards
            // remove it backwards removes all problems when looping through.
            // forward would cause confusion if you removed 5 before 4. 
            objects.splice(i, 1);
            //once an element is spliced from the array the array is getting refreshed
            //so to avoid accessing empty array(ie, after the last element is removed) in the next if condition, the loop has breaked here
            //Don't worry about return statement as the Enter frame listener function calls till the listener has been removed
            return;
        }
        if (objects[i].hitTestObject(player.arrowS.sackC)) {
            if (objects[i].typestr == "good") {
                score += 3;
            } else {
                score -= 5;
                if (score <= 0) {
                    score = 0;
                }
            }
            trace(score);
            updateScore(score);
            removeChild(objects[i]);
            objects.splice(i, 1);
            return;
        }
    }
}
于 2012-09-20T06:19:17.633 に答える
0

オブジェクトへの参照を保存し、その参照から作業する必要があります

 function moveObject(e:Event):void {
    // cycle thru objects using a for loop

    if(player.arrowS.sackC){
      var currentObject:MovieClip;
      for (var i:int=objects.length-1; i>=0; i--) {
          //move objects down based on speed
          currentObject = objects[i] as MovieClip;
          currentObject.y += speed;
          currentObject.rotation += speed;
          // if objects leaves the stage
          if (currentObject.y > 400) {
              // remove it from display list
              removeChild(currentObject);
              // remove it from the array backwards
              // remove it backwards removes all problems when looping through.
              // forward would cause confusion if you removed 5 before 4. 
              objects.splice(i, 1);
              continue;// go to next iteration of loop
          }
          if (currentObject.hitTestObject(player.arrowS.sackC)) {
              if (currentObject.typestr == "good") {
                  score += 3;
              } else {
                  score -= 5;
                  if (score <= 0) {
                      score = 0;
                  }
              }
              trace(score);
              updateScore(score);
              removeChild(currentObject);
              objects.splice(i, 1);
              continue;// go to next iteration of loop
          }
      }
    }
  }
于 2012-09-19T20:56:25.273 に答える
0

このエラーは、実行時に特定の変数の値が null である場合に発生します。null になる場合は、別の場所で hitTestObject の値を確認してください。

于 2012-09-19T11:30:22.387 に答える