2012-02-27 10 views
0

現在、XNAのFarseer Physicsを使用したゲームプロジェクトに取り組んでいます。今、私はFarseerに付属しているBodyクラスを拡張する2つのクラスを持っています。以下は、それらを衝突させるための私のコードです。Farseer Physicsで衝突しない2つのボディ3.3.2

以下のクラスは少し自明です。基本的には、プレイヤーが世界のすべてのタイルに衝突できるようにしたいのです。

public Player(World gameWorld, GameWindow Window, int playernum, Texture2D sprite) : base(gameWorld) 
    { 
     //place the player in the center of the screen - this whole method can be changed 
     Position = new Vector2(Window.ClientBounds.Width/2, Window.ClientBounds.Height/2); 
     playerSprite = sprite; 
     playerNum = (PlayerIndex)playernum; 

     //Fixture stuff 
     playerFixture = FixtureFactory.AttachRectangle(sprite.Width, sprite.Height, 1, new Vector2(), this); 
     playerFixture.CollisionCategories = Category.Cat2; 
     playerFixture.CollidesWith = Category.Cat1; 
     playerFixture.OnCollision += playerOnCollision; 
     //initialize the melee weapon 
     //initialize the ranged weapon 
    } 

    public Tile(World gameWorld, Vector2 location, Game1 game, Vector2 offset) : base(gameWorld) 
    { 
     //Loading content in the constructor for simplicity's sake because the content manager is initialized by the time the stage is created 
     health = 100; 
     prevhealth = health; 
     maxhealth = health; 

     this.game = game; 
     contentName = game.random.NextDouble() > 0.5 ? "Images/Tiles/MarbleTilesBreak" : "Images/Tiles/MarbleTiles1Break"; 
     tileTex = game.Content.Load<Texture2D>(contentName + "0"); 
     //breakSound = game.Content.Load<SoundEffect>("Tiles/FloorBreaking"); 
     location.X *= tileTex.Width; 
     location.Y *= tileTex.Height; 
     location += offset; 
     Position = location; 
     tileFixture = FixtureFactory.AttachRectangle(tileTex.Width, tileTex.Height, 1, new Vector2(), this); 
     tileFixture.CollisionCategories = Category.Cat1; 
     tileFixture.CollidesWith = Category.Cat2; 
     tileFixture.OnCollision += _OnCollision; 
    } 

私_OnCollisionは、次のようになります。

public bool _OnCollision(Fixture fix1, Fixture fix2, Contact con) 
    { 
     if (fix2.CollisionCategories == Category.Cat2) 
     { 
      health -= 10f; 
     } 
     return false; 
    } 

私は、コードを実行したときしかし、衝突の兆候はありません。タイルが0の状態にあるとき、それは削除されるべきですが、タイルは削除されません。

+0

あなたはファセシーワールドクラスを踏んでいますか? – ClassicThunder

+0

world.Step(1)を使用して衝突の問題を解決しました。しかし、今、固定具は動いていません。 –

+0

試してみてください((float)gameTime.ElapsedGameTime.TotalMilliseconds * 0.001f); – ClassicThunder

答えて

0

私が見つけたのは、私のスプライトを動かすことでした、私はコメントで言及したように世界を歩かなければなりませんでした。そして、スプライトの位置を身体の位置に割り当ててください。

world.step(TIME_SPEED); 
sprite.Position = body.Position; 
関連する問題