Как создать переносящийся мир в Box2D

Вам необходимо удалить ItemTypeItem. Невозможно просто удалить его из списка «Предметы», поскольку он не может существовать сам по себе, поскольку имеет необнуляемый внешний ключ, ссылающийся на ItemType (ItemTypeID).

Для удаления ItemTypeItem добавьте

context.Entry(itemTypeItem).State = EntityState.Deleted;
8
задан Charlie Skilbeck 19 May 2009 в 15:42
поделиться

1 ответ

Я реализовал следующее, что отнюдь не идеально, но подходит для моей цели. Есть много ограничений, и это не настоящий мир упаковки, но он достаточно хорош.

    public void Wrap()
    {
        float tp = 0;

        float sx = ship.GetPosition().X;            // the player controls this ship object with the joypad

        if (sx >= Landscape.LandscapeWidth())       // Landscape has overhang so camera can go beyond the end of the world a bit
        {
            tp = -Landscape.LandscapeWidth();
        }
        else if (sx < 0)
        {
            tp = Landscape.LandscapeWidth();
        }

        if (tp != 0)
        {
            ship.Teleport(tp, 0);                   // telport the ship

            foreach (Enemy e in enemies)            // Teleport everything else which is onscreen
            {
                if (!IsOffScreen(e.bodyAABB))       // using old AABB
                {
                    e.Teleport(tp, 0);
                }
            }
        }

        foreach(Enemy e in enemies)
        {
            e.UpdateAABB();                         // calc new AABB for this body

            if (IsOffScreen(g.bodyAABB))            // camera has not been teleported yet, it's still looking at where the ship was
            {
                float x = e.GetPosition().X;

                // everything which will come onto the screen next frame gets teleported closer to where the camera will be when it catches up with the ship

                if (e.bodyAABB.UpperBound.X < 0 || e.bodyAABB.LowerBound.X + Landscape.LandscapeWidth() <= cameraPos.X + screenWidth)
                {
                    e.Teleport(Landscape.LandscapeWidth(), 0);
                }
                else if (e.bodyAABB.LowerBound.X > Landscape.LandscapeWidth() || e.bodyAABB.UpperBound.X - Landscape.LandscapeWidth() >= cameraPos.X - screenWidth)
                {
                    e.Teleport(-Landscape.LandscapeWidth(), 0);
                }
            }
        }
    }
0
ответ дан 6 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: