2012-04-09 3 views
1

Создание простой RPG-игры, впервые использующей XNA.XNA spritesheet animation

Попытка заставить моего персонажа столкнуться с разными способами, когда я двигаюсь в разных направлениях.

Проблема в том, что, когда я запускаю, я не могу даже увидеть свою текстуру, странно, что когда я перехожу по определенной позиции в игре, весь спрайт становится видимым, то же самое для моего AI NPC: s .. Это похоже на то, что они лежат там за фоном, а прямоугольник, который я перемещаю, прозрачен (так что я вижу на этом фоне).

FrameWidth и FrameHeight отправляются при создании экземпляра класса. (высота = 0 (начиная с верхней части спрайта), width = spritesheetwidth/4 (чтобы получить этот единственный спрайт).)

Скорость - это скорость движения персонажа.

public override void Update(GameTime gameTime) 
    { 
     ObjectRectangle = new Rectangle(CurrentFrame * FrameWidth, 0, FrameWidth, FrameHeight); 
     Origin = new Vector2(ObjectRectangle.Width/2, ObjectRectangle.Height/2); 
     Position += Velocity; 

     ObjectRectangleX = (int)PositionX; 
     ObjectRectangleY = (int)PositionY; 

     #region movement 
     if (Keyboard.GetState().IsKeyDown(Keys.D) && Pastkey.IsKeyUp(Keys.A) && Pastkey.IsKeyUp(Keys.W) && Pastkey.IsKeyUp(Keys.S)) 
     { 
      AnimateRight(gameTime); 
      VelocityX = 2; 
     } 
     else if (Keyboard.GetState().IsKeyDown(Keys.A) && Pastkey.IsKeyUp(Keys.D) && Pastkey.IsKeyUp(Keys.W) && Pastkey.IsKeyUp(Keys.S)) 
     { 
      AnimateLeft(gameTime); 
      VelocityX = -2; 
     } 
     else if (Keyboard.GetState().IsKeyDown(Keys.W) && Pastkey.IsKeyUp(Keys.A) && Pastkey.IsKeyUp(Keys.D) && Pastkey.IsKeyUp(Keys.S)) 
     { 
      AnimateUp(gameTime); 
      VelocityY = -2; 
     } 
     else if (Keyboard.GetState().IsKeyDown(Keys.S) && Pastkey.IsKeyUp(Keys.A) && Pastkey.IsKeyUp(Keys.W) && Pastkey.IsKeyUp(Keys.D)) 
     { 
      AnimateDown(gameTime); 
      VelocityY = 2; 
     } 
     else 
     { 
      Velocity = Vector2.Zero; 
     } 

     Pastkey = Keyboard.GetState(); 

     #endregion 
    } 

    #region Animations 

    public void AnimateDown(GameTime gameTime) 
    { 
     CurrentFrame = 2; 
    } 
    public void AnimateRight(GameTime gameTime) 
    { 
     CurrentFrame = 3; 
    } 
    public void AnimateLeft(GameTime gameTime) 
    { 
     CurrentFrame = 1; 
    } 
    public void AnimateUp(GameTime gameTime) 
    { 
     CurrentFrame = 0; 
    } 

    #endregion 

} 

метод Draw выглядит следующим образом:

public virtual void Draw(SpriteBatch spriteBatch) 
    { 

     spriteBatch.Draw(ObjectTexture, Position, ObjectRectangle, Color.White, 0f, Origin, 1.0f, SpriteEffects.None, 0f); 
     GameList.Add(this); 
    } 

(Игнорировать List.Add)

Так что я нужна помощь с "замок" текстуру к прямоугольнику.

ответ

1

Эти линии выглядят ненужным

ObjectRectangleX = (int)PositionX; 
ObjectRectangleY = (int)PositionY; 

Одна вещь, которую вы могли бы смотреть на это последний параметр в вызове .Draw. Теперь у вас это как 0f, то есть глубина слоя, и если это значение ниже, чем у вашего ландшафта, тогда ландшафт будет нарисован сверху ... Я думаю, зависит от ваших аргументов spritebatch.begin(). Вы можете прочитать немного больше здесь, где еще несколько бит объясняются глубиной слоя. https://gamedev.stackexchange.com/questions/23619/2d-layerdepth-not-working-xna-4-0

+0

Изменение уровня глубины не помогло, к сожалению:/ И эти две линии перемещает прямоугольник Vector, поэтому они очень нужны :) – IRDuck

+0

Какой прямоугольник? Только один я вижу ObjectRectangle, который представляет собой исходный прямоугольник, который установлен правильно, как 'ObjectRectangle = новый прямоугольник (CurrentFrame * FrameWidth, 0, FrameWidth, FrameHeight);' Источник прямоугольник относительно положения объектов , Кроме того, вы можете ссылаться на изображение своего спрайта, что может помочь показать какие-либо проблемы. – Jon

+0

http://homepage.lnu.se/student/aw222fu/pics/CurrentSprites.png Это будет тот, что 5-й сверху - это символ: D Кроме того, это означает, что я могу удалить эти две строки полностью? – IRDuck

0

Моя первоначальная мысль заключается в том, что вы вычисляете значения, прежде чем зная данные кадров.

Moving этот код

ObjectRectangle = new Rectangle(CurrentFrame * FrameWidth, 0, FrameWidth, FrameHeight); 
Origin = new Vector2(ObjectRectangle.Width/2, ObjectRectangle.Height/2); 
Position += Velocity; 

ObjectRectangleX = (int)PositionX; 
ObjectRectangleY = (int)PositionY; 

В нижней части метода обновления даст вам лучшие результаты. Кроме того, это не похоже, что вы обновляете PositionX или PositionY. Вместо этого вы должны использовать Position.X и Position.Y.

Редактировать - Вы меняете положение исходного изображения. Поэтому, когда вы перемещаетесь по экрану, ваша позиция обновляется, перемещая прямоугольник источника ближе к тому, каким он должен быть. Итак, просто прокомментируйте две приведенные ниже строки, чтобы исправить это.

ObjectRectangleX = (int)PositionX; 
ObjectRectangleY = (int)PositionY; 

Edit 2 - Разъяснение

Чтобы исправить как исходный прямоугольник, и сохранить ИИ работы вам нужно сделать следующее. В методе Update обоих CharacterAnimation.cs и Monster.cs, закомментируйте две строки

ObjectRectangleX = (int)PositionX; 
ObjectRectangleY = (int)PositionY; 

Тогда в монстра.CS в методе Enemymovement (CharacterAnimation героя) изменить эти строки (45,46)

ObjectcentreX = ObjectRectangle.X + (ObjectTexture.Width/2); 
ObjectcentreY = ObjectRectangle.Y + (ObjectTexture.Height/2); 

стать

ObjectcentreX = (int)PositionX + (ObjectTexture.Width/2); 
ObjectcentreY = (int)PositionY + (ObjectTexture.Height/2); 
+0

PositionX и PositionY - Position.X и Position.Y, я просто сделал им свои собственные свойства, я должен был бы ограничить один из них. Спасибо за подсказку, хотя, к сожалению, я до сих пор не вижу своих текстур:/ – IRDuck

+0

А вы не должны менять ObjectRectangleX или Y. Они всегда должны быть одинаковыми с вашего первого нового прямоугольника (CurrentFrame * FrameWidth, 0, FrameWidth , FrameHeight); Это источник листа спрайтов. Попробуйте просто прокомментировать эти две строки. ObjectRectangleX = (int) PositionX; ObjectRectangleY ​​= (int) PositionY; – GambitSunob

+0

Ок, да, это привело к тому, что спрайты работали, но полностью разрушили ИИ (который перемещает монстров): P Итак, я выбираю, должен ли я их видеть или если они должны двигаться правильно ..: D – IRDuck

Смежные вопросы