2014-02-19 2 views
0

Я пытаюсь построить прорывную игру с использованием C# и рамки XNA. Я поместил кирпич в отдельный класс и создал массив для 10 кирпичей для загрузки. Однако, когда я запускаю игру, на самом деле не появляются кирпичи, и я не могу найти ошибку, поскольку Visual Studio ничего не мешает.Содержимое, не загружаемое из класса

Кирпич класс:

class bricks 
{ 
    Texture2D brickimg; 
    Rectangle rectangle; 
    int[] brickXPos = new int[50]; 
    int[] brickYPos = new int[50]; 

    public bricks(Texture2D NewTexture, Rectangle newRectangle) 
    { 
     brickimg = NewTexture; 
     rectangle = newRectangle; 
    } 

    public void Initialize() 
    { 
     for (int i = 0; i < 50; i++) 
     { 
      brickXPos[i] = 300 + i * 60; 
      brickYPos[i] = 100; 
     } 
    } 

    public void Update() 
    { 
    } 

    public void Draw(SpriteBatch spritebatch) 
    { 
     for (int i = 0; i < 50; i++) 
     { 
      spritebatch.Draw(brickimg, new Vector2(brickXPos[i], brickYPos[i]), rectangle, Color.White); 
     } 
    } 
} 

Основная программа:

/// <summary> 
/// This is the main type for your game 
/// </summary> 
public class Breakout : Microsoft.Xna.Framework.Game 
{ 
    GraphicsDeviceManager graphics; 
    SpriteBatch spriteBatch; 
    Texture2D BackgroundImg; 
    bricks bricks; 

    public Breakout() 
    { 
     graphics = new GraphicsDeviceManager(this); 

     graphics.PreferredBackBufferWidth = 1024; 
     graphics.PreferredBackBufferHeight = 768; 
     graphics.ApplyChanges(); 
     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); 
     BackgroundImg = Content.Load<Texture2D>("starfield"); 
     bricks = new bricks(Content.Load<Texture2D>("redbrick"),new Rectangle()); 
     // 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(); 

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

     base.Draw(gameTime); 
     spriteBatch.Begin(); 
      spriteBatch.Draw(BackgroundImg, Vector2.Zero, Color.White); 
      bricks.Draw(spriteBatch); 
      spriteBatch.End(); 
    } 
} 
+2

Пожалуйста, измените название класса 'bricks' на' Bricks'. Код по стандартам. –

ответ

0

Вы никогда не Инициализировать объект кирпичи.
Вы должны вызвать функцию bricks.Initialise(); где-нибудь (предпочтительно в функции инициализации класса Breakout).

Я также рекомендовал бы использовать немного более чистый код стандарта.
Имена классов обычно начинаются с верхнего регистра, а именно: Bricks вместо bricks, в вашем случае класс и экземпляр класса имеют одинаковое имя (bricks), что может создать путаницу и даже создать ошибку компилятора (я думаю, ?).
(переменная 'NewTexture' в конструкторе класса brick также страдает от плохого именования, скорее всего, должна быть названа newTexture, особенно из-за того, что Rect называется newRectangle, - но это не сайт для проверки кода , так больно оставить эту проблему на данный момент!).

+0

добавлен bricks.Initialise(); в файл breakout.cs в методе inialise, а также изменили имена классов на верхний регистр. однако ни один кирпич пока еще не показывает – Bobby

+1

Проверьте ответ fooser, он содержит некоторую информацию, которую я не заметил: Rectangle, который вы передаете, вероятно, инициализируется с помощью '(0,0,0,0)' (потому что вы используете конструктор по умолчанию, no args), это не хорошо. И вы, вероятно, просто хотите передать null. – Jite

+0

да! im с вами сейчас, я помню, оставив их на 0, потому что я не был уверен в размерах. спасибо за вашу помощь вам – Bobby

0

Попробуйте передать null в параметр sourceRectanglespriteBatch.Draw в вашем классе кирпичей. Я думаю, что прямоугольник, который вы проходите, не годится.

spritebatch.Draw(brickimg, new Vector2(brickXPos[i], brickYPos[i]), null, Color.White); 
+0

отлично, они теперь отлично рисуют! так как я могу рисовать прямоугольник вокруг каждого для обнаружения столкновений? – Bobby

+0

Возможно, мне придется обратиться к вам с некоторым фактическим кодом, но хорошей отправной точкой для ограничивающей рамки может быть: прямоугольник с источником (brickXPos [i], brickYPos [i]) и с высотой brickImg.Height и width of brickImg.Width. В зависимости от того, насколько вы сложны и точны, вам может быть сложно, если вы добавите масштаб и/или поворот на кирпичи. – fooser

+0

Почему «принятый ответ» был удален из этого ответа? :( – fooser

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