Почему источник моей текстуры некорректен во время выполнения? - PullRequest
0 голосов
/ 15 августа 2011

Хорошо, вот код: Game1.cs Класс:

 public class Game1 : Microsoft.Xna.Framework.Game
{
    KeyboardState keyboard;
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Player MyPlayer;
    Texture2D Ball;

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

    protected override void Initialize()
    {
        IsMouseVisible = true;
        graphics.IsFullScreen = true;

        base.Initialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        Ball = Content.Load<Texture2D>("Images/Ball");
        MyPlayer = new Player(new Vector2(700, 700), Ball);

    }

    protected override void UnloadContent()
    {
    }

    protected override void Update(GameTime gameTime)
    {
        keyboard = Keyboard.GetState();
        if (keyboard.IsKeyDown(Keys.Escape))
            this.Exit();
        MyPlayer.Update(gameTime);

        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        MyPlayer.Draw(spriteBatch);
        spriteBatch.End();
        base.Draw(gameTime);
    }
}

Класс игрового объекта:

 abstract class GameObject
{
    protected Vector2 position;
    protected Texture2D texture;
    public GameObject(Vector2 Position, Texture2D Texture)
    {
        position = Vector2.Zero;
        this.texture = Texture;
    }
    protected Vector2 Position { set; get; }
    protected Texture2D Texture { set; get; }
    protected float X
    {
        set { position.X = value; }
        get { return position.X; }
    }
    protected float Y
    {
        set
        {
            position.Y = value;
        }
        get
        {
            return position.Y;
        }
    }
    public int GraphicsWidth { set; get; }

    public int GraphicsHeight { set; get; }

}

Класс игрока:

class Player : GameObject
{
    KeyboardState keyboard;
    bool IsJump = false;
    int SpeedX = 5;
    int SpeedY = 5;

    public Player(Vector2 position, Texture2D tex):base(position,tex)
    {
    }
    public int Height
    {
        get { return this.texture.Height; }
    }
    public int Width
    {
        get { return this.texture.Width; }
    }
    public void intialize()
    {

    }
    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, Position, Color.White);
    }
    public void Update(GameTime gameTime)
    {

        keyboard = Keyboard.GetState();
        if (keyboard.IsKeyDown(Keys.D))
        {
            X += SpeedX;
        }
        else if (keyboard.IsKeyDown(Keys.A))
        {
            X-= SpeedX;
        }
        if (X > GraphicsWidth)
        {
            X = GraphicsWidth;
        }

    }

}

Когда я отлаживаю его, моя текстура шара находится в (0,0) (TOP LEFT).Вместо (700 700).

Кстати, если кто-нибудь может дать мне несколько советов, если я сделаю что-то не так, или что-то, что я должен изменить, было бы здорово !!

Большое спасибо за помощников.

РЕДАКТИРОВАТЬ: Кто-нибудь .. пожалуйста?Я полагаю, это не так сложно понять> <. </p>

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Я вижу две проблемы.Первый, на который ответил CraigW, вы уже исправили:

protected Vector2 position;    

public GameObject(Vector2 Position, Texture2D Texture)
{
    position = Vector2.Zero;  // <---- this needs to be position = Position
    this.texture = Texture;    
}

protected Vector2 Position { set; get; }

Второй вопрос - это ваша позиция.Когда вы объявляете свойство, используя {get;задавать;} синтаксис, который компилятор неявно предоставляет вам вспомогательное поле для хранения значения свойства.Но вы также создаете свое собственное поле позиции.Ваше поле позиции устанавливается равным значению, переданному в конструкторе (при условии, что вы исправили проблему # 1 в своем конструкторе), но получатель для вашего свойства Position возвращает сгенерированное компилятором поле, которое вы не установили вчто угодно.

Есть два способа исправить это.Либо удалите свое поле позиции и везде укажите ссылку на свойство Position, либо измените свое свойство, чтобы использовать ваше поле позиции.

Fix Option # 1: просто используйте свойство Position

// protected Vector2 position;    // <----- remove this

public GameObject(Vector2 Position, Texture2D Texture)
{
  this.Position = Position;
  this.texture = Texture;
}

Fix Option #2. Измените свойство Position для использования поля

protected Vector2 Position { get { return position; } set { position = value; } }
1 голос
/ 15 августа 2011

В своем конструкторе GameObject вы устанавливаете позицию на Vector2.Zero, а не на свой параметр Position.

public GameObject(Vector2 Position, Texture2D Texture)
{
    position = Vector2.Zero;
    this.texture = Texture;
}

должно быть

public GameObject(Vector2 Position, Texture2D Texture)
{
    position = Position;
    this.texture = Texture;
}
0 голосов
/ 16 августа 2011

-7?Что вы сделали заслужили это??

Я думаю, что где-то в вашем коде есть логическая ошибка, измените это:

public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(texture, Position, Color.White);
}

На это:

public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(texture, new Vector2(700,700), Color.White);
}

Ипосмотрите, как это работает для вас (должно работать нормально):)

Оттуда вам придется работать в обратном направлении, чтобы найти, где Position не устанавливается желаемое значение.

Лично я никогда не был фанатом gameobject, гораздо лучше создавать свои собственные базовые типы, поскольку вы полностью контролируете их работу и можете легче решать возникающие проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...