Χρήση του RenderTarget ως υφής μετά τη σχεδίαση σε υφή

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον επαλήθευσης

παράθυρα
  • Παράθυρα 10
  • Παράθυρα 11
Οπτικό στούντιο
  • Visual Studio 2022
Μονοπαιχνίδι
  • 3.8.1

Πληροφορίες για τους προορισμούς απόδοσης

Κανονικά, όταν σχεδιάζετε, το περιεχόμενο του σχεδίου εμφανίζεται στην οθόνη, αλλά μπορείτε να χρησιμοποιήσετε έναν στόχο απόδοσης για να γράψετε το σχέδιο σε μια υφή. Το περιεχόμενο γραμμένο στην υφή μπορεί να χρησιμοποιηθεί ως υφή όπως είναι. Για παράδειγμα, εάν γράψετε τα περιεχόμενα της τηλεόρασης σε μια υφή και, στη συνέχεια, επικολλήσετε την υφή στην οθόνη της τηλεόρασης, μπορείτε να μετακινήσετε μια διαφορετική εικόνα στην τηλεόραση. Φυσικά, μπορεί επίσης να χρησιμοποιηθεί ως ακίνητη εικόνα και μπορείτε να δημιουργήσετε μια υφή δυναμικά χωρίς να προετοιμάσετε ένα αρχείο εικόνας για την υφή εκ των προτέρων.

Προετοιμασία εικόνων

Δεν χρειάζεστε ένα αρχείο εικόνας για να χρησιμοποιήσετε τον στόχο απόδοσης, αλλά θα ετοιμάσω ένα αρχείο εικόνας για να διευκολύνω την κατανόησή του ως δείγμα.

Θα χρησιμοποιηθεί ως κανονικό αρχείο περιεχομένου, οπότε καταχωρίστε το στο MGCB. Texture Αφήστε το όνομα ως .

αγρός

Game1 Ας το γράψουμε στην τάξη. Ο υπάρχων κώδικας δεν θα αλλάξει συγκεκριμένα, οπότε θα περιγράψω μόνο το προστιθέμενο ποσό χωρίς να το περιγράψω.

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

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

_texture Τα πεδία προορίζονται για τη φόρτωση των προετοιμασμένων εικόνων και δεν σχετίζονται ιδιαίτερα με το περιεχόμενο αυτής της συμβουλής.

RenderTarget2D Τα πεδία που ορίζονται στην κλάση γίνονται στόχοι απόδοσης. Δεδομένου ότι είναι απαραίτητο να δημιουργηθεί , δεν μπορεί να GraphicsDevice δημιουργηθεί σε αυτό το στάδιο, επομένως ορίζεται μόνο.

Κατασκευαστής Game1

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

Όταν το εκτελείτε, θα πρέπει να σχεδιάζεται ενώ περιστρέφεται όπως φαίνεται στο σχήμα.