2011-10-19 7 views
1

の下で物理ベースのプラットを構築するだから私は、オンラインでこのチュートリアルを発見し、時間の下で、これを学習のアイデアは、私に訴え:は、チュートリアルを動作させることはできません:時間

http://active.tutsplus.com/tutorials/games/build-a-physics-based-platformer-in-under-an-hour/

問題は、ステップ14に達したときに動作させることができないということです。第2段落でムービーをテストすると、エラーが発生すると言います。 問題は、31行目のworld = nullに絞り込まれています。おそらくもっと具体的に私が知りたいことはであると思われます。チュートリアルで最終結果が得られるようにワールドを定義するにはどうすればよいですか?

編集2私はここで進歩を遂げています。知りたい人のためです。私はのlistenWhileVisibleメソッドをaddEventListenerメソッドで置き換えました。したがって、ワールドプロパティについても言及する必要はありません。ですから、ここではエラーはありませんが、チュートリアルのこの時点で、私はヒーローを左右に動かすことができますが、これは起こっていません。何か助けになる理由は?新しいコードは


の下に更新され、私は、各工程の後にテストムービーを試してみましたが、私は私のヒーロームービークリップにview.characters.HeroCharacterクラスを適用するまで、それはすべてのエラーを持っていませんでした。だから、問題はHeroCharacter.asにあるようです。だから、私は命令から悪意を持って行って、HeroCharacter.asを手に入れました。 FlashDevelopはチュートリアルのコードを貼り付けたときに必要なすべてのインポートを自動生成しませんでした。私は最終的にFlashの出力ウィンドウでこのエラーを取得するために、問題を絞り込ん:ここ

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at misc::Entity/listenWhileVisible() 
at view.characters::HeroCharacter/create() 
at misc::Entity/ensureCreated() 
at Function/<anonymous>() 

は、ActionScript

package view.characters 
{ 
import Box2DAS.Collision.b2WorldManifold; 
import Box2DAS.Common.V2; 
import Box2DAS.Dynamics.b2World; 
import Box2DAS.Dynamics.ContactEvent; 
import Box2DAS.Dynamics.StepEvent; 
import misc.Input; 
import misc.Util; 
import shapes.Box; 
import wck.BodyShape; 
import wck.ContactList; 
import wck.World; 

/** 
* ... 
* @author Hexel Colorado 
*/ 
public class HeroCharacter extends Box { 

    private var contacts:ContactList; 

    public override function create():void { 
     reportBeginContact = true; 
     reportEndContact = true; 
     contacts = new ContactList(); 
     contacts.listenTo(this); 

     fixedRotation = true; 

     addEventListener(StepEvent.STEP, world_stepEventHandler, false, 0, true); 
     addEventListener(ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true); 

     super.create(); 
    } 

    private function world_stepEventHandler(e:StepEvent):void 
    { 
     var left:Boolean = Input.kd('LEFT', 'A'); 
     var right:Boolean = Input.kd('RIGHT', 'D'); 
     var jump:Boolean = Input.kp('UP', ' ', 'W'); 

     if (jump) { 
      b2body.ApplyImpulse(new V2(0, -2), b2body.GetWorldCenter()); 
     } 
     else if(left) { 
      b2body.ApplyImpulse(new V2(-2, 0), b2body.GetWorldCenter()); 
     } 
     else if(right) { 
      b2body.ApplyImpulse(new V2(2, 0), b2body.GetWorldCenter()); 
     } 
    } 

    private function this_beginContactHandler(e:ContactEvent):void 
    { 
    } 

} 
} 

である私はステップ14条第2項で停止してきたし、続行されませんチュートリアルの残りの部分で私はこれを理解することができます。助けてくれてありがとう。

+0

問題が見つかりました! googlerのために、ここで間違っています:super.createをオーバーライド関数の先頭に置く必要があります。なぜなら、あなたが最初に作成しなければワールドは存在しないからです。ここで見つけた:http://www.box2d.org/forum/viewtopic.php?f=19&t=6378 私は本当にこのチュートリアルが嫌いです。クレームは、問題を理解するのに何時間もかからずに実行できます。 –

+0

私の最後のコメントでsuper.create()に気付いたら、10-15分かかりました:)しかし、あなたが何を意味しているのか理解しています。なぜ彼はそれを修正しなかったのか分かりません(おそらく古いバージョンのbox2d)。 25に十分なのかどうかはまだ分かりません。 – Neoraptor

答えて

0

編集:私はそれが実際には間違っていると思う、それはsuper.create()関数にあるようだ。とにかくこのトレースをテストして、デバッガを見つけ出し、その特定のコード行でトラブルを引き起こしてください。 編集2:ナー、それはsuper.create()にはありません、エラーデータは私を混乱させる秒のために、これを下に行います。

おそらく変数 "world"は定義されていません。

入力このようなあなたのコードに最初の行(トレース):

trace("world = "+world); 
listenWhileVisible(world, StepEvent.STEP, world_stepEventHandler, false, 0, true); 
listenWhileVisible(this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true); 

それは次のように表示される必要があります。 世界= nullを 世界=未定義。

また、デバッガでアプリケーションをデバッグする方法も学びます。私は、何が起こっているのか分からないときにリモートデバッグセッションを開始します(私は正しいはずです)。デバッガは、使用する正確な違反行を特定します。

デバッグのもう1つの方法ですが、遅いですが、多くのトレースステートメントを入力し、どのステートメントが起動できないかを確認することです。間にあるコードが原因です。私はこれをお勧めしません。

あなたはデバッガを使用することを覚えておいてください.1年か2年(私の場合)のスパンで数百時間を節約できます。

remote debug in flash

スタンドアローンプレーヤーのダウンロードは同じで、異なる唯一のものは次のとおりです。

選択デバッグ]> [リモートデバッグセッション> ActionScript 3.0のを開始します。フラッシュで

これを開発するには、次のとおりです。

デバッグ>そのトレースをチェックアウトし、あなたはそれを修正する方法がわからない場合は、ここでは2つ目の質問以上のコードをポスト今のリモート・セッションに

を開始します。 次に、デバッガを使用する方法を学びます。

Debugger tutorial

チュートリアル(、ステップオーバーステップイン、ステップアウト、矢田矢田の)コード異なる言語(Java)のであるが、デバッガの概念に集中し、ではありません。デバッガの追跡部分はFlexには存在しないため、2:50以降は無視してください。

ステップイン、ステップアウト、ステップオーバーで快適になります。非常に強力です。

また、左側(左下)には、メモリ内のオブジェクトの状態(プロパティ内のデータ)を表示できます。それは値を把握するためにトレース変数を上回ります(上記のように)。

+0

すべての情報をありがとうが、私はすでに、問題は世界が未定であると考えていた。私はあなたが言ったことをとにかくやりましたが、トレースは世界=ヌルと言っていました。 私が本当に知りたいと思うのは、これは私の元の質問でこれを明確にしたはずです。正確には世界は何ですか?このチュートリアルでは、私は、まさに、世界を世界と定義すると思いますか?私は* World *ムービークリップインスタンス "world"の名前を付けようとしましたが、それで解決できませんでした。 私が探しているのは、ケース固有の答えです。 –

+0

なぜそれが定義されていないのか分かりません。私はBox2D Alchemyのポートについて十分に分かりません。 1)それは自動的にbox2Dによって設定されるはずですb) "ensureCreated"がBox2Dクラスのエンティティによってチェックされているので、それは1)のように見えますが、 ()関数内のすべてのコードの前でsuper.create()を試してください...そうでなければ、デバッガを使用し、コードを錬金術の周りを掘る...この "距離"からそれに答えることはほとんどありません – Neoraptor

+0

問題を発見しました(私はStackOverflowが私にまだ答えを投稿させないので、元の質問へのコメントにそれを載せました。 –

関連する問題