استخدام رندرتارجت كنسيج بعد الرسم على نسيج

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١٠
  • ويندوز ١١
فيجوال ستوديو
  • فيجوال ستوديو 2022
مونوجيم
  • 3.8.1

حول أهداف التجسيد

عادة ، عند الرسم ، يتم عرض محتوى الرسم على الشاشة ، ولكن يمكنك استخدام هدف التجسيد لكتابة الرسم إلى نسيج. يمكن استخدام المحتويات المكتوبة في النسيج كنسيج كما هي. على سبيل المثال ، إذا قمت بكتابة محتويات التلفزيون إلى نسيج ثم لصق النسيج على شاشة التلفزيون ، فيمكنك نقل صورة مختلفة في التلفزيون. بالطبع ، يمكن استخدامه أيضا كصورة ثابتة ، ويمكنك إنشاء نسيج ديناميكيا دون إعداد ملف صورة للنسيج مسبقا.

تحضير الصور

لا تحتاج إلى ملف صورة لاستخدام هدف العرض ، لكنني سأقوم بإعداد ملف صورة لتسهيل فهمه كعينة.

سيتم استخدامه كملف محتوى عادي ، لذا يرجى تسجيله في MGCB. Texture اترك الاسم ك .

ميدان

Game1 دعونا نكتبها في الفصل. لن يتم تغيير الكود الحالي على وجه الخصوص ، لذلك سأصف فقط المبلغ المضاف دون وصفه.

/// <summary>描画するテクスチャー画像。</summary>
private Texture2D _texture;

/// <summary>描画対象となるレンダーターゲット。</summary>
private RenderTarget2D _renderTarget;

_texture الحقول مخصصة لتحميل الصور المعدة وليست ذات صلة خاصة بمحتوى هذه النصيحة.

RenderTarget2D تصبح الحقول المحددة في الفئة أهداف تجسيد. نظرا لأنه من الضروري GraphicsDevice إنشاء مثيل ، لا يمكن إنشاؤه في هذه المرحلة ، لذلك يتم تعريفه فقط.

منشئ اللعبة 1

public Game1()
{
  _graphics = new GraphicsDeviceManager(this);
  Content.RootDirectory = "Content";
  IsMouseVisible = true;

  // ゲームの解像度の設定
  _graphics.PreferredBackBufferWidth = 1280;
  _graphics.PreferredBackBufferHeight = 720;
}

لا يوجد شيء خاص للقيام به هنا. في الوقت الحالي ، حددت دقة اللعبة بحيث يمكن مقارنتها بهدف العرض.

تحميل المحتوى

protected override void LoadContent()
{
  _spriteBatch = new SpriteBatch(GraphicsDevice);

  // TODO: this.Content を使用してゲーム コンテンツをここに読み込みます

  // コンテンツからテクスチャーを読み込みます
  _texture = Content.Load<Texture2D>("Texture");

  _renderTarget = new RenderTarget2D(GraphicsDevice, 540, 360);
}

أولا ، اقرأ استخدام Texture2D Content.Load الرسم باستخدام .

GraphicsDevice إذا كان RenderTarget2D هناك ، يمكنك إنشاؤه في أي مكان ، ولكن في المثال سنقوم بإنشائه في LoadContent الطريقة. هدف التجسيد هو نسيج حقيقي ، لذلك له حجم. GraphicsDevice يحدد المنشئ أيضا الحجم مع .

رسم

إذا كنت تستخدم هدف عرض ، فإن الكود هنا هو الهدف الرئيسي.

protected override void Draw(GameTime gameTime)
{
  // TODO: ここに描画コードを追加します

  // 描画先対象をレンダーターゲットに設定
  GraphicsDevice.SetRenderTarget(_renderTarget);

  // テクスチャーの情報をクリアし単色で塗りつぶします
  GraphicsDevice.Clear(Color.LightYellow);

  // スプライトバッチを使用してスプライトを書き込みます
  // レンダーターゲットの外に影響ないことを確認するためにわざと領域をはみ出るように描画しています
  _spriteBatch.Begin();
  for (int i = 0; i < 4; i++)
  {
    _spriteBatch.Draw(_texture, new Vector2((i / 2) * 200 - 50, (i % 2) * 200 - 50), Color.White);
  }
  _spriteBatch.End();

  // レンダーターゲットを解除します。これ以降の描画処理はメインウインドウに対して行われます
  GraphicsDevice.SetRenderTarget(null);

  // メインウィンドウの描画情報をクリアし単色で塗りつぶします
  GraphicsDevice.Clear(Color.CornflowerBlue);

  // メインウィンドウに対してレンダーターゲットをテクスチャーとして描画します
  _spriteBatch.Begin();
  _spriteBatch.Draw(_renderTarget, new Vector2(100, 100), Color.White);
  _spriteBatch.End();

  base.Draw(gameTime);
}

نظرا لأن الرسم يتم تنفيذه بشكل أساسي GraphicsDevice على ، حتى إذا تم تنفيذ عملية الرسم كما هي ، رسمها مقابل النافذة الرئيسية. GraphicsDevice.SetRenderTarget بتحديد طريقة RenderTarget2D ، يمكنك تبديل وجهة الرسم إلى نسيج.

بعد التبديل ، يتم تنفيذ عملية الرسم بنفس الطريقة التي يتم بها الرسم في النافذة الرئيسية. GraphicsDevice.Clear يمسح معلومات الرسم ويرسمSpriteBatch الكائن. من أجل التحقق مما إذا كنت ترسم حقا ضد النسيج ، فقد حددت عمدا موضع الرسم بحيث يبرز الكائن هذه المرة.

عند الانتهاء من الرسم إلى هدف التجسيد، GraphicsDevice.SetRenderTarget حدد null الطريقة. يتيح لك ذلك إعادة هدف الرسم إلى النافذة الرئيسية.

RenderTarget2D يمكن استخدامه كنسيج كما هو ، لذلك SpriteBatch.Draw أحدد _renderTarget طريقة رسمه ككائن.

تنفيذ

بمجرد كتابة الكود ، حاول تشغيله. إذا كان يبدو مثل الرقم ، فلا بأس.

يتم فصل لون التعبئة لهدف التجسيد ولون التعبئة للنافذة الرئيسية، بحيث يمكنك رؤية مكان إنشاء النسيج كهدف التجسيد. لقد رسمت الكائن بحيث يبرز ضد هدف العرض ، لكنني أعتقد أنه يمكنك أن ترى أنه تم قصه بشكل صحيح ولم يتم رسمه نحو النافذة الرئيسية.

هذا هو كل الكود الذي يحقق هدف العرض. لا يوجد شيء صعب بشكل خاص. أعتقد أن الشيء الوحيد الذي يهمني هو إدارة تبديل وجهات الرسم وإدارتها RenderTarget2D .

حاول تحريكه

تبدو نتيجة التنفيذ السابق وكأن الصورة يتم اقتصاصها ورسمها ببساطة ، لذلك بعد ذلك ، أود تحريك الكائن للتأكد من رسمه بشكل صحيح في هدف العرض.

Update نظرا لأننا نريد تحديث الدوران في كل مرة ، فسنقوم بإعداد زاوية الدوران في الحقل.

/// <summary>テクスチャーを回転させる角度。</summary>
private float _rotate;

Update في الطريقة ، قم بزيادة _rotate عدد .

protected override void Update(GameTime gameTime)
{
  if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
    Exit();

  // TODO: ここに更新ロジックを追加します

  // テクスチャーの回転角度を更新します
  _rotate += 0.01f;

  base.Update(gameTime);
}

Draw تقوم الطريقة بتعيين الكائن للتدوير _rotate . ما عليك سوى معرفة أنه يدور ، لذلك يتم تعيين القيم الأخرى بشكل مناسب.

protected override void Draw(GameTime gameTime)
{
  // 中略

  // スプライトバッチを使用してスプライトを書き込みます
  // レンダーターゲットの外に影響ないことを確認するためにわざと領域をはみ出るように描画しています
  _spriteBatch.Begin();
  for (int i = 0; i < 4; i++)
  {
    _spriteBatch.Draw(_texture, new Vector2((i / 2) * 200 + 32, (i % 2) * 200 + 32),
      null, Color.White, _rotate * i, new Vector2(64, 64), 1, SpriteEffects.None, 0);
  }
  _spriteBatch.End();

  // 中略

  // メインウィンドウに対してレンダーターゲットをテクスチャーとして描画します
  _spriteBatch.Begin();
  _spriteBatch.Draw(_renderTarget, new Vector2(400, 400), null, Color.White,
    _rotate, new Vector2(_renderTarget.Width / 2, _renderTarget.Height / 2), 1, SpriteEffects.None, 0);
  _spriteBatch.End();

  base.Draw(gameTime);
}

عند تشغيله ، يجب أن يرسم أثناء الدوران كما هو موضح في الشكل.