2010-10-08 9 views
5

Normalmente buscaba ayuda en los foros de XNA pero están caídos en este momento, así que he venido aquí.Clase de jugador con mi juego C# XNA

Estoy haciendo un nuevo juego XNA, y quiero tener una clase de jugador. Por el momento tengo una clase de juego principal llamada Dots. Esto representa el juego principal. Así es como se presenta mi clase Player en la actualidad

namespace Dots 
{ 
    class Player : Microsoft.Xna.Framework.Game 
    { 
     Texture2D PlayerTexture; 
     Vector2 PlayerPosition; 

     public Player() 
     { 
      Content.RootDirectory = "Content"; 
      PlayerTexture = Content.Load<Texture2D>("Player"); 
      PlayerPosition = Vector2.Zero; 
     } 

     public void Update() 
     { 

     } 

     public void Draw(SpriteBatch SpriteBatch) 
     { 

     } 
    } 
} 

Pero estoy consiguiendo un error que no puedo encontrar la manera de resolver. El error es:

Error al cargar "Player". GraphicsDevice componente no encontrado.

Lo tira en esta línea: PlayerTexture = Content.Load<Texture2D>("Player");.

Veo en la clase de juego principal esta línea: Graphics = new GraphicsDeviceManager(this); pero no tengo ni idea de qué hacer con ella. ¿Lo paso a mi clase Player, o qué?

Se agradece cualquier ayuda, gracias.

+0

No estoy familiarizado con XNA, pero [esta publicación] (http://social.msdn.microsoft.com/forums/en-US/xnagamestudioexpress/thread/c2f6b8be-845d-4701-b383-7a0e3cde69f8) implica que no deberías ' t carga contenido en un constructor. –

+0

Arg. Entonces no tengo idea de cómo hacer correctamente lo que quiero hacer. Tendré que esperar hasta que los foros de XNA vuelvan a abrirse y echar un vistazo a cómo lo recomiendan. – Wen

+0

¿Por qué no preguntar aquí? Los programadores de XNA son ... um programadores ... para eso es StackOverflow. – WernerCD

Respuesta

2

ACTUALIZACIÓN: Esta respuesta es aparentemente correcta para las versiones anteriores de XNA. Ver Andrew Russell's answer para lo que se está utilizando actualmente.

Intente anular el método LoadGraphicsContent para cargar su contenido. Como se muestra en this tutorial.

protected override void LoadGraphicsContent(bool loadAllContent) 
    { 
     if (loadAllContent) 
     { 
      spriteBatch = new SpriteBatch(graphics.GraphicsDevice); 
      // TODO: Load any ResourceManagementMode.Automatic content 
      t2dMap = content.Load<Texture2D>(@"content\textures\map_display"); 
      t2dColorKey = content.Load<Texture2D>(@"content\textures\map_colorkey"); 
     } 
     // TODO: Load any ResourceManagementMode.Manual content 
    } 
+0

'LoadGraphicsContent' ha quedado obsoleto durante mucho tiempo. –

+1

@ Andrew Russell: Gracias, Andrew. Estaba tratando de ayudar al OP a pesar de que no estoy familiarizado con XNA. Dejaré esta respuesta aquí en caso de que alguien más tropiece con ella. Eso, junto con su comentario y respuesta a esta pregunta, debería ayudar a orientar a las personas en la dirección correcta en el futuro. –

-2

Creo que tuve un error similar una vez.

Haga clic con el botón derecho en la Solución en el Explorador de soluciones.

Ir a Propiedades.

Si el Perfil del juego es "Hi Def" ... cambie a "Reach".

Recompilar y ejecutar.

+1

Esta respuesta es incorrecta. –

6

En primer lugar, parece que no entiende cómo funcionan las clases (y espacios de nombres). Sugeriría (como también lo hice en un comentario sobre tu otra pregunta) trabajar en un juego simple que no necesita clases, primero.

ahora a hablar de los problemas en su código:

En primer lugar, con el fin de cargar el contenido, los gráficos necesita dispositivo se han inicializado. No se inicializa hasta que se llama LoadContent en Microsoft.Xna.Framework.Game. Esto es explained in the documentation:

Inicializa este método. Además, se llama en cualquier momento que el contenido del juego necesite ser recargado, como cuando ocurre el evento DeviceReset. No debe acceder al GraphicsDevice hasta que se invoque LoadContent.

así que mueva su código de carga:

protected override void LoadContent() 
{ 
    PlayerTexture = Content.Load<Texture2D>("Player"); 
    PlayerPosition = Vector2.Zero; 
    base.LoadContent(); 
} 

Note como se trata de una anulación (de un método protegido).Realmente no quiero entrar en una explicación de lo que esto significa aquí, pero sugiero que lo descubras.

Además, encontrará que Draw y Update se suponen anulados de manera similar, ya que serán llamados desde XNA.

Ahora, aquí está la parte importante: Lo que te acabo de contar aplica si está heredando su clase juego de la clase XNA Game. Al llamarlo "Jugador", está indicando un malentendido sobre cómo funcionan las clases.

Si está haciendo una clase de "Jugador", eche un vistazo a lo que le dijeron en la respuesta al your other question.

También puede encontrar this recent question pena de leer.

1

Recientemente en XNA, ahora puede hacer clic derecho en ciertas opciones y tener Intellisense arreglarlo para usted. Por lo tanto, al hacer clic derecho en Texture2D y Rectangle cuando declara, debe poder elegir "Resolver" y le pedirá que elija "usar" alguna otra biblioteca para que pueda compilarse. Vea si eso soluciona su problema. Pero, en general con las clases, especialmente yo uso esto y funciona bien.

0

una lista de lo que funcionó para mí:

  • trate de poner la fuente en la carpeta raíz de su proyecto de contenido
  • Asegúrese de que el Build Action se establece en Compile
  • verificar el contenido de la .spritefont archivo (use esta pregunta como referencia)
  • Asegúrese de estar en LoadContent o posterior en el ciclo de vida