1

私は私の実験に問題があります。Texture2D1 つを別のに融合しTexture2D、次に をリロードするメソッドを作成しようとしていますTexture2D。今回は、貼り付けられたテクスチャを新しい場所に移動します。暗い背景にスポットライトを貼り付けて背後の景色を「照らす」プロジェクトで、この方法を完成させる予定です。貼り付け方法を完全に機能させることができましたが、計画の 2 番目の部分で大きな問題が発生しています。貼り付けたテクスチャをVector2ここで、X メンバーはフレームごとに 1 ずつ増加するため、貼り付けられたテクスチャが背景に沿ってドラッグされます。ただし、背景はフレームごとにリセットされず、前の画像があった背景にドラッグ マークが残ります。この 30 分間、背景テクスチャをリセットして、他の画像が貼り付けられたときに再びきれいにすることで、この問題を解決しようと取り組んできました。

これが私のコードです。

namespace CopyTest
{
    public class Image
    {
        public Texture2D Bitmap;
        public Vector2 Position;
        public String BitmapName;
        public Rectangle Viewport;
        public Color Tint = Color.White;
        public void ResetViewportDimensions()
        {
            this.Viewport = new Rectangle(this.Viewport.X, this.Viewport.Y, Bitmap.Width, Bitmap.Height);
    }
    public void Draw(SpriteBatch Target)
    {

    }
    public void FinalizeBitmap(ContentManager Target)
    {
        this.Bitmap = null;
        this.Bitmap = Target.Load<Texture2D>(this.BitmapName);
    }
    public Image(Vector2 Position, String BitmapName)
    {
        this.BitmapName = BitmapName;
        this.Position = Position;
    }
}

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    public Image Rainbow = new Image(new Vector2(0, 0), "Rainbow");
    public Image Eye = new Image(new Vector2(0, 0), "Glow");
    public Image PrintOut = new Image(new Vector2(0, 0), "Rainbow");

    public Vector2 Destination = new Vector2(100, 50);

    public void PrintTo(Image Source, Image Target, Vector2 Location)
    {
        Color[] A = new Color[Source.Bitmap.Width * Source.Bitmap.Width];
        Color[] B = new Color[Target.Bitmap.Width * Target.Bitmap.Width];

        int Y = 0;
        int X = 0;

        Source.Bitmap.GetData(A);
        Target.Bitmap.GetData(B);
        for (int i = 0; i < A.Length; i++)
        {
            B[(int)Location.X + X + (((int)Location.Y + Y) * Target.Bitmap.Width)] = A[i];
            X++;
            if (X == Source.Bitmap.Width)
            {
                X = 0;
                Y++;
            }
        }

        Target.Bitmap.SetData<Color>(B);
    }

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
        base.Initialize();
    }
    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        Eye.FinalizeBitmap(Content);
        Rainbow.FinalizeBitmap(Content);
        PrintOut.FinalizeBitmap(Content);

        Eye.ResetViewportDimensions();
        Rainbow.ResetViewportDimensions();
        PrintOut.ResetViewportDimensions();
    }

    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        GraphicsDevice.Textures[0] = null;

        PrintOut.FinalizeBitmap(Content);



        PrintTo(Eye, PrintOut, Destination);
        Destination.Y++;

        base.Update(gameTime);
    }
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();
        spriteBatch.Draw(PrintOut.Bitmap, PrintOut.Position, PrintOut.Viewport, PrintOut.Tint);
        spriteBatch.End();

        base.Draw(gameTime);
    }
}

どんな助けでも大歓迎です。

4

0 に答える 0