2013-04-28 5 views
1

Dans mon code ci-dessous, je pense que c'est fait correctement. Mais idk, l'image appelée par _bg n'est pas montrée. L'écran n'affiche que le blanc. Bizarrement, il y a 0 message d'erreur quand je l'exécute.Pourquoi spritebatch.Draw affiche une sortie vide?

(Le RenderTarget2D est pour-ment par défaut en mon point de vue en mode paysage)

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 

namespace GameName2 
{ 
    /// <summary> 
    /// This is the main type for your game 
    /// </summary> 
    public class Game1 : Game 
    { 
     GraphicsDeviceManager _graphics; 
     SpriteBatch _spriteBatch; 
     Texture2D _bg; 
     RenderTarget2D finalImageTarget; 

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

     /// <summary> 
     /// Allows the game to perform any initialization it needs to before starting to run. 
     /// This is where it can query for any required services and load any non-graphic 
     /// related content. Calling base.Initialize will enumerate through any components 
     /// and initialize them as well. 
     /// </summary> 
     protected override void Initialize() 
     { 
      // TODO: Add your initialization logic here 

      base.Initialize(); 
     } 

     /// <summary> 
     /// LoadContent will be called once per game and is the place to load 
     /// all of your content. 
     /// </summary> 
     protected override void LoadContent() 
     { 
      // Create a new SpriteBatch, which can be used to draw textures. 
      _spriteBatch = new SpriteBatch(GraphicsDevice); 

      _bg = Content.Load<Texture2D>(@"background"); 
      finalImageTarget = new RenderTarget2D(GraphicsDevice, 1280, 720); 
      // TODO: use this.Content to load your game content here 
     } 

     /// <summary> 
     /// UnloadContent will be called once per game and is the place to unload 
     /// all content. 
     /// </summary> 
     protected override void UnloadContent() 
     { 
      // TODO: Unload any non ContentManager content here 
     } 

     /// <summary> 
     /// Allows the game to run logic such as updating the world, 
     /// checking for collisions, gathering input, and playing audio. 
     /// </summary> 
     /// <param name="gameTime">Provides a snapshot of timing values.</param> 
     protected override void Update(GameTime gameTime) 
     { 
      // TODO: Add your update logic here 

      base.Update(gameTime); 
     } 

     /// <summary> 
     /// This is called when the game should draw itself. 
     /// </summary> 
     /// <param name="gameTime">Provides a snapshot of timing values.</param> 
     protected override void Draw(GameTime gameTime) 
     { 
      GraphicsDevice.SetRenderTarget(finalImageTarget); 
      GraphicsDevice.Clear(Color.White); 

      // TODO: Add your drawing code here 
      _spriteBatch.Begin(); 
      _spriteBatch.Draw(_bg, 
       new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height), 
       null, 
       Color.White, 
       0, 
       Vector2.Zero, 
       SpriteEffects.None, 
       0); 
      _spriteBatch.End(); 

      GraphicsDevice.SetRenderTarget(null); 
      _spriteBatch.Begin(); 
      _spriteBatch.Draw(finalImageTarget, 
        new Vector2(720,0), 
        null, 
        Color.White, 
        MathHelper.PiOver2, 
        Vector2.Zero, 
        Vector2.One, 
        SpriteEffects.None, 
        0f); 
      _spriteBatch.End(); 

      base.Draw(gameTime); 


     } 
    } 
} 

J'utilise le fichier XNB. Et je l'ai mis dans le dossier de contenu dans le projet. J'ai défini 'Content' et 'Copy if newer' à la propriété de fichier.

Ceci est le fichier .png j'utiliser avant converti en XNB: https://imageshack.us/scaled/large/15/loadingo.png

Ou peut-être le problème est dans mon fichier .png?

Une idée? Merci

Répondre

0
 GraphicsDevice.SetRenderTarget(finalImageTarget); 
     GraphicsDevice.Clear(Color.White); 

     // TODO: Add your drawing code here 
     _spriteBatch.Begin(); 
     _spriteBatch.Draw(_bg, 
      new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height), 
      null, 
      Color.White, 
      0, 
      Vector2.Zero, 
      SpriteEffects.None, 
      0); 
     _spriteBatch.End(); 

Ce code n'est pas dessiné à l'écran que vous voyez. Il est dessiné à la cible de rendu finalImageTarget. Que ce qu'une cible de rendu est un endroit où dessiner ne s'affiche pas à l'écran. Le réglage à GraphicsDevice.SetRenderTarget(null); indique à XNA de dessiner sur l'écran visible.

+0

j'ai, regardez avant la deuxième .draw –

1

Ce deuxième appel par lots de sprites est plutôt curieux. Il me semble que vous déplacez et/ou faites pivoter l'image hors écran.

Puisque vous utilisez this overload de tirage vous font efficacement ceci:

Texture2D texture =   finalImageTarget; 
Vector2 position =   new Vector2(720,0); 
Rectangle? sourceRectangle = null; 
Color color =    Color.White; 
float rotation =    MathHelper.PiOver2; 
Vector2 origin =    Vector2.Zero; 
Vector2 scale =    Vector2.One; 
SpriteEffects effects =  SpriteEffects.None; 
float layerDepth =   0f; 

_spriteBatch.Draw (texture,position,sourceRectangle,color,rotation,origin,scale,effects,layerDepth,layerDepth); 

Cela signifie donc que vous positionnez votre image 720 pixels à droite du coin supérieur gauche de l'écran, puis tourner autour le coin supérieur gauche de l'image de 90 degrés. Ma suggestion est de commencer simple et de travailler votre chemin jusqu'à ce que vous voulez réaliser. Utilisez un seul appel de lot d'image-objet sans cible de rendu et utilisez des rectangles source et de destination sans rotation. Editer: Utilisez le débogueur pour vous assurer que toutes les variables sortent avec les valeurs que vous attendez de voir. Par exemple, Window.ClientBounds.Width/Height peut apparaître sous la forme de zéros. Je pense que je l'ai vu une fois lors du portage sur Android et j'ai dû le changer pour utiliser la largeur et la hauteur de Viewport.

+0

Au début, je n'ai pas utilisé la rotation (sans rendertarget2d) mais le résultat n'est pas différent. Une autre idée? Merci pour votre explication tho. –

0

Pourquoi utilisez-vous Render2D? Y a-t-il une raison spécifique?

sinon je serais alors modifier la résolution de la fenêtre en utilisant

_graphics.PreferredBackBuffer.Width = 720; 
_graphics.PreferredBackbuffer.Height = 1280; 

dans votre constructeur. alors vous avez la liberté de placer votre image Texture2D en utilisant le ci-dessous; Si vous êtes préoccupé par le positionnement au-dessus et en dessous de l'image d'arrière-plan, essayez d'utiliser des couches dans vos appels spriteBatch. Comme je l'ai dit je ne sais pas pourquoi vous le voulez de cette façon, donc je pourrais me tromper, mais le faire de cette façon simple entraînera ou non son fichier de texture ou autre chose.

EDIT

Basé sur votre commentaire, id dire essayer simplement le positionnement de la Texture2D via les coordonnées par exemple

_spriteBatch.Draw(_bg, new vector2(0,0), color.black); 

ou

_spriteBatch.Draw(_bg, new vector2(screen.width/2,screen.height/2), color.black); 

si vous ne peux toujours pas le voir id peut-être suggère à la recherche sur les propriétés du fichier ou modifier le fichier à un jpg pour les tests.

+0

J'utilise rendertexture2d parce qu'un tutoriel m'a dit d'essayer ça. mais comme je l'ai dit plus tôt, ça ne fait pas –