2013-03-31 2 views
0

Я только начинаю программировать, и у меня проблемы.XNA- возникли проблемы с перемещением спрайта назад к предыдущему экрану

Мне нужно иметь возможность перемещать изображение 64x64 (челнок1) через 4 места. Я настроил его как квадрант I, квадрант II, квадрант III, квадрант IV. Пока я могу перейти от квадранта I к квадранту II и от квадранта I к квадранту IV, но я не могу вернуться. Спрайт/изображение просто отключается от экрана. Любая помощь будет принята с благодарностью.

Это то, что я до сих пор:

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; 

// Alex 

namespace WindowsGame6 
{ 
    /// <summary> 
    /// This is the main type for your game 
    /// </summary> 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
     enum location 
     { 
      quadrant1, quadrant2, quadrant3, quadrant4 
     } 

     location Currentlocation; 

     Texture2D shuttle1; 
     Texture2D Project3Q1; 
     Texture2D Project3Q2; 
     Texture2D Project3Q3; 
     Texture2D Project3Q4; 

     GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 
     int Y = 60; 
     int X = 150; 
     Vector2 position; 
     float rotation; 


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

      graphics.PreferredBackBufferHeight=600; 
      graphics.PreferredBackBufferWidth=800; 


     } 

     /// <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() 
     { 
      Currentlocation = location.quadrant1; 

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

      shuttle1 = Content.Load<Texture2D>("shuttle1"); 
      Project3Q1 = Content.Load<Texture2D>("Project3Q1"); 
      Project3Q2 = Content.Load<Texture2D>("Project3Q2"); 
      Project3Q3 = Content.Load<Texture2D>("Project3Q3"); 
      Project3Q4 = Content.Load<Texture2D>("Project3Q4"); 



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

      if (Keyboard.GetState().IsKeyDown(Keys.Up)) 
      { 
       position += new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation));     
      } 
      if (Keyboard.GetState().IsKeyDown(Keys.Up)) 
      { 
       Y -= 1; 
      } 
      if (Keyboard.GetState().IsKeyDown(Keys.Down)) 
      { 
       Y += 1; 
      } 
      if (Keyboard.GetState().IsKeyDown(Keys.Left)) 
      { 
       X -= 1; 
      } 
      if (Keyboard.GetState().IsKeyDown(Keys.Right)) 
      { 
       X += 1; 
      } 


      if (Currentlocation == location.quadrant1) 
      { 
       if (Y < 10) 
       Y = 10; 

       if (X > 736) 
        X = 736; 

       if (X < 10) 
       { 
        Currentlocation = location.quadrant2; 
        //MediaPlayer.Stop(); 
        //MediaPlayer.Play(); 

        X = 736; 
       } 

       if (Y > 536) 
       { 
        Y = 10; 
        // MediaPlayer.Stop(); 
        //MediaPlayer.Play(); 
        Currentlocation = location.quadrant4; 
       } 




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

      spriteBatch.Begin(); 

      if (Currentlocation==location.quadrant1) 
       spriteBatch.Draw(Project3Q1, new Vector2(0,0), Color.White); 

      if (Currentlocation == location.quadrant2) 
       spriteBatch.Draw(Project3Q2, new Vector2(0, 0), Color.White); 

      if (Currentlocation == location.quadrant3) 
       spriteBatch.Draw(Project3Q3, new Vector2(0, 0), Color.White); 

      if (Currentlocation == location.quadrant4) 
       spriteBatch.Draw(Project3Q4, new Vector2(0, 0), Color.White); 
      spriteBatch.Draw(shuttle1, new Vector2(X, Y), Color.White); 
      spriteBatch.End(); 



      // TODO: Add your drawing code here 

      base.Draw(gameTime); 
     } 
    } 
} 

ответ

0

Из того, что я могу сказать, что ваш метод Update является учет только для сценария, где вы находитесь в квадранте 1. Линия if (Currentlocation == location.quadrant1) позволяет обрабатывать движение от квадрант 1 до другой квадрант, но у вас нет кода для обработки движения, начиная от в другом квадранте.

Сохраняя текущую структуру кода, вам нужно будет добавить проверки для каждой из других возможностей (например, if (Currentlocation == location.quadrant2)). Затем вы будете выполнять аналогичные операции в этом блоке, чтобы определить, переходить ли в другой квадрант. Основное отличие от каждого блока - это границы X/Y, которые вы проверяете, и целевые квадранты, к которым вы хотите перейти, если эти проверки будут успешными.

В стороне: этот блок кода кажется хорошим кандидатом для размещения в методе. Это упростит код и уменьшит вероятность создания ошибок. Если вам нужна помощь, чтобы понять это, попробуйте Google: C# как создать метод

0

весь блок кода только запускается на выполнение, если вы находитесь в квадранте 1:

if (Currentlocation == location.quadrant1) 
     { 
      if (Y < 10) 
      Y = 10; 

      if (X > 736) 
       X = 736; 

      if (X < 10) 
      { 
       Currentlocation = location.quadrant2; 
       //MediaPlayer.Stop(); 
       //MediaPlayer.Play(); 

       X = 736; 
      } 

      if (Y > 536) 
      { 
       Y = 10; 
       // MediaPlayer.Stop(); 
       //MediaPlayer.Play(); 
       Currentlocation = location.quadrant4; 
      } 




     } 

Так момент вы переезжаете в квадрант 2 , все становится недействительным и не выполняется. Я предлагаю вам определить 4 прямоугольников, которые действуют как ваш квадрант и использовать содержит/пересекут методы решить, какой квадрант игрок находится в

Прямоугольника:. http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.rectangle_members(v=xnagamestudio.40).aspx

Intersects: http://msdn.microsoft.com/en-us/library/bb464123(v=xnagamestudio.40).aspx

Содержит : http://msdn.microsoft.com/en-us/library/bb447710(v=xnagamestudio.40).aspx

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