2011-12-15 3 views
2

В настоящее время я пытаюсь сделать 2D-лист спрайтов, используя приведенный ниже код, и все, что в результате получается, - это рендеринг только цвета фона изображения с черными линиями, проходящими через Это. Изображение сохраняется как .png-файл, используя gimp.XNA Trouble, составляющая часть 2D-листа спрайта на экран, результат черных линий

Я проверил со случайными листами спрайтов, загруженными с сети, и они визуализируют просто отлично. Есть ли способ спасти файл png неправильно?

Размер рамки должен быть 27 x 27, который является высотой фактического файла изображения, за которым следует, насколько широка я хочу, чтобы кадр был.

Вот лист настоящее время я использую:

enter image description here

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Audio; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.GamerServices; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Input; 
using Microsoft.Xna.Framework.Media; 


namespace WindowsGame3 
{ 
    /// <summary> 
    /// This is the main type for your game 
    /// </summary> 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
     GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 

     //Texture2D holds the image 
     Texture2D character; 

     //Holds position of character on screen 
     Vector2 Position = new Vector2(200, 200); 

     //Frames current size (W, H) 
     Point frameSize = new Point(27, 27); 

     //Which frame we are currently on 
     Point currentFrame = new Point(0, 1); 

     //How many frames on a line, followed by how many lines 
     Point sheetSize = new Point(13, 1); 

     //Sprite animation speed 
     float speed = 15; 

     // 
     KeyboardState currentState; 
     KeyboardState theKeyboardState; 
     KeyboardState oldKeyboardState; 

     enum State 
     { 

      Walking, 
      Punch, 
      Jump, 
      JumpForward, 
      JumpBackgwards 


     } 

     //First state we have when character is walking 
     State mCurrentState = State.Walking; 

     //Adjusts frames draw speed 
     TimeSpan nextFrameInterval = TimeSpan.FromSeconds((float)1/16); 

     //Changes each time we need to go to the next frame 
     TimeSpan nextFrame; 

     public Game1() 
     { 
      //Adjusts how fast things happen in XNA 
      TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 100); 

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

      // TODO: use this.Content to load your game content here 

      //Sprite sheet we are using 
      character = Content.Load<Texture2D>("MainSprite"); 


     } 

     /// <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) 
     { 
      // Allows the game to exit 
      if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
       this.Exit(); 

      // 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.Clear(Color.CornflowerBlue); 

      // TODO: Add your drawing code here 


      spriteBatch.Begin(); 

      //Gives the name of the Texture2D variable, then the position. 
      //By creating a rectangle, only what is inside will be drawn on the screen. 
      spriteBatch.Draw(character, Position, new Rectangle(
           frameSize.X * currentFrame.X, 
           frameSize.Y * currentFrame.Y, 
           frameSize.X, 
           frameSize.Y), 
           Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0); 

      //frameSize.X * currentFrame.X gives current position of frame on X. Same with Y. 
      //frameSize.X, frameSize.Y is the width and height of the current frame. 

      spriteBatch.End(); 

      base.Draw(gameTime); 
     } 
    } 
} 

ответ

2

Ваш прямоугольник выключен. Коды X/Y (для первого индекса) - 0/27; вам нужно 0/0.

Черная линия является артефактом spritebatch, потому что вы говорите ему, чтобы рисовать то, чего не существует. В координатах 0 \ 27 нет изображения.

Посмотрите на Point currentFrame = new Point(0, 1);. Вы назначаете Y значение 1, но вам нужен ZERO. Нулевые индексы, помните, что :)

+0

Спасибо за понимание! Я знал, что это будет простое решение, и я, вероятно, что-то пропустил. Рисует отлично сейчас = D –