Тип или имя пространства имен 'DrawableGameObject' не найден? - PullRequest
1 голос
/ 13 декабря 2011

Я работал над проектом XNA для класса, который я посещаю.У меня была проблема с классом, который я делал для «плохих парней», которые являются снеговиками (класс называется Snowman.cs).Я не могу заставить программу компилироваться, и это сводит меня с ума.Кто-то помог мне с тем, что я думаю, это какой-то твердый код для класса Snowman.cs:

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;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
using CameraViewer;

namespace MGH10_Skybox
{
    public class Snowman : DrawableGameObject 
    {
        private Camera cam = new Camera();

        Model snowMan;
        Matrix[] snowManMatrix;

        protected override void LoadContent()
        {
            //snowMan = Content.Load<Model>( "Models\\snowman" );
            snowManMatrix = new Matrix[snowMan.Bones.Count];
            snowMan.CopyAbsoluteBoneTransformsTo(snowManMatrix);
        }

        public void DrawSnowMan(Model model, GameTime gameTime)
        {
            foreach (ModelMesh mesh in model.Meshes)
            {
                Matrix world, scale, translation;

                scale = Matrix.CreateScale(0.02f, 0.02f, 0.02f);
                translation = Matrix.CreateScale(0.0f, 0.7f, -4.0f);

                world = scale * translation;

                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.World = snowManMatrix[mesh.ParentBone.Index] * world;

                    effect.View = cam.viewMatrix;
                    effect.Projection = cam.projectionMatrix;
                    effect.EnableDefaultLighting();
                }

                mesh.Draw();
            }
        }

        protected override void Draw(GameTime gameTime)
        {
            DrawSnowMan(snowMan, gameTime);
        }

    }
}

Моя проблема заключается в том, что я продолжаю получать сообщение об ошибке компилятора, которое говорит: «Имя типа или пространства имен« DrawableGameObject »можетне найден (вы пропускаете директиву по использованию или ссылку на сборку?) ".

Я пытался проводить все виды исследований в Google, и я почти не получаю результатов для DrawableGameObject, но все, что говорит об этом (или, по крайней мере, говорит, что в предварительном просмотре страницы) обычно вместо этого используется DrawableGameComponent .

Я пытался использовать DrawableGameComponent, но потом я получаю еще больше ошибок компилятора, которые заставляют меня поверить, что это действительно не , что я ищу.В частности, ошибка гласит, что «DrawableGameComponent не содержит конструктор, который принимает« 0 »аргументов» (что противоречит тому, как был построен мой класс и его вызовы).

Единственный проблеск надежды, который у меня был, заключался в том, что DrawableGameObject предположительно является классом .net 4.0, и я использовал XNA 3.1 с Visual C # 2008 (который, очевидно, не поддерживает 4.0).Поэтому я скачал XNA 4.0 и Visual C # Express 2010 с большими надеждами, которые рухнули и сгорели, когда я пошел, чтобы изменить целевую платформу только для того, чтобы найти параметр полностью серым (даже при запуске совершенно нового проекта).

Всепомощь БОЛЬШОЙ приветствуется.

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Кажется, что вы на самом деле захотите использовать DrawableGameComponent, поскольку я не смог найти ничего о классе DrawableGameObject.Ошибка, которую вы получаете при попытке унаследовать от DrawableGameComponent, может быть исправлена ​​путем вызова базового конструктора с соответствующим параметром во время конструктора классов, как показано ниже:

public Snowman(Game game) : base(game)
{
   //Whatever goes here!
}

"game" в базовом конструкторедолжен быть объектом Game, к которому прикреплен DrawableGameComponent.

Редактировать:

На основании вашего последнего комментария, я бы рекомендовал добавить этот конструктор в ваш класс (то есть замените то, что я ранее предлагал этим конструктором):

public Snowman(Game game, Model snowman) : base(game)
{
    this.snowman = snowman;
}

И в вашем Game1.cs, в вашей функции LoadContent или везде, где вы в данный момент вызываете "snowMan = Content.Load (" Models \ "snowman ");", попробуйте это вместо:

snowMan = new Snowman(this, Content.Load<Model>("Models\\snowman");

Это создаст новый экземпляр Snowman с инициализированным полем "Model snowman".

0 голосов
/ 13 декабря 2011

Итак ... если вы не можете найти класс, создайте свой собственный!

В любом случае, я думаю, DrawableGameObject должен был облегчить обновление и рисование различных типов объектов в игровом движке, но если вы используете его только для снеговика (что, я думаю, так как вы не упоминаете другие код не работает ..) вы можете не иметь его!

Поэтому удалите наследование для этого класса и удалите переопределение из этих методов. Скройте метод DrawSnowMan (т.е. сделайте его закрытым), сделайте общедоступными LoadContent и Draw и вызовите их из соответствующих методов в вашем классе Game!

Кроме того, я бы предложил встроить механизм для рисования вашего снеговика в разных местах, или, если вы хотите иметь несколько экземпляров класса SnowMan, переместите модель в другое место (они собираются поделиться ею, чтобы вы могли сохранить некоторые память, не дублируя ее без необходимости).

Надеюсь, я помог кое-кому, хотя, если вы искали ответ, связанный с поиском класса DrawableGameObject, извините.

...