1

プラットフォーマー スターター キットで遊んでいます。これまでのところ、水平方向と垂直方向の「カメラ」の動きを追加し、パララックスの背景を追加しようとしています。問題は、2 つの背景レイヤーの後、残りのレイヤーが表示されなくなることです。私は XNA に非常に慣れていないので、少し助けが必要です :)。問題の写真を次に示します。

レイヤー失敗

コードはこちら。さらに必要な場合は教えてください:)

層のクラス:

class Layer
 {
    public Texture2D[] Textures { get; private set; }
    public float ScrollRate { get; private set; }

    public Layer(ContentManager content, string basePath, float scrollRate)
    {
        // Assumes each layer only has 3 segments.
        Textures = new Texture2D[3];
        for (int i = 0; i < 3; ++i)
            Textures[i] = content.Load<Texture2D>(basePath + "_" + i);

        ScrollRate = scrollRate;
    }

    public void Draw(SpriteBatch spriteBatch, float cameraPosition, float cameraPositionYAxis)
    {
        // Assume each segment is the same width.
        int segmentWidth = Textures[0].Width;

        // Calculate which segments to draw and how much to offset them.
        float x = cameraPosition * ScrollRate;
        float y = ScrollRate;
        int leftSegment = (int)Math.Floor(x / segmentWidth);
        int rightSegment = leftSegment + 1;
        x = (x / segmentWidth - leftSegment) * -segmentWidth;

        spriteBatch.Draw(Textures[leftSegment % Textures.Length], new Vector2(x, -y), Color.White);
        spriteBatch.Draw(Textures[rightSegment % Textures.Length], new Vector2(x + segmentWidth, -y), Color.White);
    }


}

私の ScrollCamera を使用した Level.cs の draw メソッドを次に示します (ScrollCamera がそれと関係があるかどうかはわかりません)。

public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
    {
        ScrollCamera(spriteBatch.GraphicsDevice.Viewport);
        Matrix cameraTransformYAxis = Matrix.CreateTranslation(-cameraPosition, -cameraPositionYAxis, 0.0f);
        spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp,
            DepthStencilState.Default, RasterizerState.CullCounterClockwise, null, cameraTransformYAxis);

        //added this foreach loop 
        foreach (var layer in layers)
        {
            layer.Draw(spriteBatch, cameraPosition, cameraPositionYAxis);
        }

        DrawTiles(spriteBatch);
        Player.Draw(gameTime, spriteBatch);
        foreach (Enemy enemy in enemies)
        {
            enemy.Draw(gameTime, spriteBatch);
        }

        spriteBatch.End();

    }

    private void ScrollCamera(Viewport viewport)
    {
        #if ZUNE
        const float ViewMargin = 0.4f;
        #else
        const float ViewMargin = 0.5f;
        #endif

        float marginWidth = viewport.Width * ViewMargin;
        float marginLeft = cameraPosition + marginWidth;
        float marginRight = cameraPosition + viewport.Width - marginWidth;


        const float TopMargin = 0.4f;
        const float BottomMargin = 0.4f;
        float marginTop = cameraPositionYAxis + viewport.Height * TopMargin;
        float marginBottom = cameraPositionYAxis + viewport.Height - viewport.Height * BottomMargin;
        //    float maxCameraPositionYOffset = Tile.Height * Height - viewport.Height; 


        float CameraMovement = 0.0f;
        if (Player.Position.X < marginLeft)
            CameraMovement = Player.Position.X - marginLeft;
        else if (Player.Position.X > marginRight)
            CameraMovement = Player.Position.X - marginRight;
        //Aktualizuj przesuwanie ekranu, ale zapobiegnij wyjściu poza mape
        float maxCameraPosition = Tile.Width * Width - viewport.Width;
        cameraPosition = MathHelper.Clamp(cameraPosition + CameraMovement, 0.0f, maxCameraPosition);



        float cameraMovementY = 0.0f;
        if (Player.Position.Y < marginTop) //above the top margin
            cameraMovementY = Player.Position.Y - marginTop;
        else if (Player.Position.Y > marginBottom) //below the bottom margin
            cameraMovementY = Player.Position.Y - marginBottom;

        float maxCameraPositionYOffset = Tile.Height * Height - viewport.Height;
        cameraPositionYAxis = MathHelper.Clamp(cameraPositionYAxis + cameraMovementY, 0.0f, maxCameraPositionYOffset);

    }

そして、それだけだと思います。さらにコードが必要な場合は教えてください:)

4

1 に答える 1