بناوٹ پر ڈرائنگ کرنے کے بعد رینڈر ٹارگٹ کو بناوٹ کے طور پر استعمال کرنا

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

تصدیق کا ماحول

Windows
  • ونڈوز 10
  • ونڈوز 11
Visual Studio
  • Visual Studio 2022
مونو گیم
  • 3.8.1

اہداف فراہم کرنے کے بارے میں

عام طور پر ، جب آپ ڈرائنگ کرتے ہیں تو ، ڈرائنگ کا مواد اسکرین پر ظاہر ہوتا ہے ، لیکن آپ ڈرائنگ کو بناوٹ پر لکھنے کے لئے رینڈر ہدف کا استعمال کرسکتے ہیں۔ بناوٹ میں لکھے گئے مواد کو بناوٹ کے طور پر استعمال کیا جاسکتا ہے جیسا کہ یہ ہے۔ مثال کے طور پر ، اگر آپ ٹی وی کے مواد کو بناوٹ پر لکھتے ہیں اور پھر بناوٹ کو ٹی وی اسکرین پر چسپاں کرتے ہیں تو ، آپ ٹی وی میں ایک مختلف تصویر منتقل کرسکتے ہیں۔ یقینا ، اسے اسٹیل امیج کے طور پر بھی استعمال کیا جاسکتا ہے ، اور آپ پیشگی ساخت کے لئے تصویری فائل تیار کیے بغیر متحرک طور پر بناوٹ بنا سکتے ہیں۔

تصاویر کی تیاری

رینڈر ہدف کو استعمال کرنے کے لئے آپ کو تصویری فائل کی ضرورت نہیں ہے ، لیکن میں ایک تصویری فائل تیار کروں گا تاکہ نمونے کے طور پر سمجھنا آسان ہوجائے۔

یہ ایک عام مواد فائل کے طور پر استعمال کیا جائے گا، لہذا براہ کرم اسے ایم جی سی بی میں رجسٹر کریں. Texture نام کو اس طرح چھوڑ دیں.

کھیت

Game1 چلو اسے کلاس میں لکھتے ہیں. موجودہ کوڈ کو خاص طور پر تبدیل نہیں کیا جائے گا ، لہذا میں اسے بیان کیے بغیر صرف اضافی رقم کی وضاحت کروں گا۔

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

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

_texture فیلڈز تیار کردہ تصاویر کو لوڈ کرنے کے لئے ہیں اور خاص طور پر اس ٹپ کے مواد سے متعلق نہیں ہیں.

RenderTarget2D کلاس میں بیان کردہ فیلڈز ہدف بن جاتے ہیں۔ چونکہ اسے فوری طور پر بنانا GraphicsDevice ضروری ہے ، لہذا اس مرحلے پر اسے تخلیق نہیں کیا جاسکتا ہے ، لہذا اس کی صرف وضاحت کی گئی ہے۔

Game1 constructor

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

جب آپ اسے چلاتے ہیں تو ، اسے گھومتے وقت کھینچنا چاہئے جیسا کہ تصویر میں دکھایا گیا ہے۔