बनावट पर ड्राइंग के बाद बनावट के रूप में रेंडरटार्गेट का उपयोग करना

पेज अद्यतन :
पेज निर्माण की तारीख :

सत्यापन वातावरण

विंडोज़
  • विंडोज 10
  • विंडोज 11
Visual Studio
  • Visual Studio 2022
MonoGame
  • 3.8.1

लक्ष्य प्रस्तुत करने के बारे में

आम तौर पर, जब आप ड्राइंग करते हैं, तो ड्राइंग सामग्री स्क्रीन पर प्रदर्शित होती है, लेकिन आप ड्राइंग को बनावट में लिखने के लिए रेंडर लक्ष्य का उपयोग कर सकते हैं। बनावट में लिखी गई सामग्री को बनावट के रूप में इस्तेमाल किया जा सकता है। उदाहरण के लिए, यदि आप टीवी की सामग्री को एक बनावट में लिखते हैं और फिर बनावट को टीवी स्क्रीन पर पेस्ट करते हैं, तो आप टीवी में एक अलग छवि ले जा सकते हैं। बेशक, इसका उपयोग अभी भी छवि के रूप में किया जा सकता है, और आप पहले से बनावट के लिए एक छवि फ़ाइल तैयार किए बिना गतिशील रूप से बनावट बना सकते हैं।

छवियां तैयार करना

रेंडर लक्ष्य का उपयोग करने के लिए आपको एक छवि फ़ाइल की आवश्यकता नहीं है, लेकिन मैं इसे नमूने के रूप में समझना आसान बनाने के लिए एक छवि फ़ाइल तैयार करूंगा।

यह एक सामान्य सामग्री फ़ाइल के रूप में उपयोग किया जाएगा, इसलिए कृपया इसे एमजीसीबी में पंजीकृत करें। 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;
}

यहां करने के लिए कुछ खास नहीं है। फिलहाल, मैंने गेम के रिज़ॉल्यूशन को निर्दिष्ट किया है ताकि इसकी तुलना रेंडर लक्ष्य के साथ की जा सके।

LoadContent

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);
}

जब आप इसे चलाते हैं, तो इसे आकृति में दिखाए गए अनुसार घूमते समय खींचना चाहिए।