2011-08-15 79 views
-5

好了,所以這是代碼: 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; } 

} 

Player類:

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)(左上)。而不是(700,700)。

順便說一句,如果任何人都可以給我一些建議,如果我犯了什麼錯誤,或任何我應該改變的,這將是偉大的!

非常感謝幫手。

編輯:任何人..請嗎?我想這不是很難找出> <。

+0

你需要調用「base.Draw方法(gameTime );」之前「spriteBatch.End();」 – Olle89

+0

@ Olle89這是不正確的。雖然它可能不會崩潰,但您通常不打算用打開的SpriteBatch調用繼承的XNA功能。 –

+0

對您的問題進行了一些編輯。花一點時間看看我做了什麼。 – Will

回答

1

在您的GameObject構造函數中,您將位置設置爲Vector2.Zero而不是您的param位置。

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

應該是

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

是的,這是我的一個錯誤。我想到了另一個。下一條評論: – Joey

+0

其實還沒算出來,還是一樣的地方(0,0) – Joey

0

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

,看看它是如何爲你的作品(它應該工作的罰款):)

從那裏你將不得不向後工作找到位置沒有被設置爲你想要的值。

就我個人而言,我從來沒有成爲gameobject的粉絲,創建自己的基礎類型要好得多,因爲您可以完全控制它們的工作方式,並且可以更輕鬆地解決彈出的問題。

+0

這不正是他所做的嗎?創建他自己的基類。 GameObject不是內置的XNA類=) – Moulde

+0

哦,我的不好,我把它和GameComponent混淆了......是的,他的GameObject類對我來說看起來並不令人印象深刻。 – tweetypi

1

我看到兩個問題。第一個,由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; } 

第二個問題是您的Position屬性。當你使用{get;組; }語法編譯器隱式給你一個後臺字段來存儲屬性的值。但是你也在創建自己的職位領域。您的位置字段被設置爲在構造函數中傳遞的值(假設您已經在構造函數中修復了問題#1),但Position屬性的getter將返回編譯器生成的字段,但您尚未設置該字段任何東西。

有兩種方法可以解決這個問題。要麼刪除您的位置字段並在任何地方引用位置屬性,要麼修改您的屬性以使用您的位置字段。

fix選項#1:只需使用位置屬性

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

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

fix選項#2:改變位置,避免財產使用你的領域

protected Vector2 Position { get { return position; } set { position = value; } } 
相關問題