XNA inherit from model and load

Started by
8 comments, last by Kyle Corver 10 years, 6 months ago

Hey guys,

just started programming with XNA an already the first Problem appeared:

I wrote my own Model class MyModel that inherits from XNA Model class.


class MyModel : Model

The next Step is to load that Model from Content:


private MyModel Model1;
...

Model1 = (MyModel)Content.Load<Model>("leuchtturm");

Unfortunately that Code doesn't work. I just don't know why.

Is there any chance to get that Code running? Otherwise I have to put the Model inside the MyModel class.

Thanks 4 Help!

Advertisement
You don't need to inherit anything. Just use the Model object to create a new model to use in your class.

What about the code doesn't work? Does it nit draw? Does it not compile?

If you see a post from me, you can safely assume its C# and XNA :)

I want some extra Attributes for My personal modelclass ^^ and trying to do it that way.

Yeah sorry forgot to describe the Error: It's a System.InvalidCastException that appears when I start the program.

Ah gotcha.

In order to load a model from your MyModel class, i would assume you need to add a Load method to that class and just call that method.

What kind of attributes are you adding? Unless you're changing the way the model is loaded or drawn, i think you're making more work for yourself. Have you looked at the model example on msdn?

as For your problem, i would change <Model> to <Model1> since it is inheriting the Model class

If you see a post from me, you can safely assume its C# and XNA :)

Generally constructing things with composition is easier than using inheritance and will also make it easier to debug for you, it does mean writing a few more interface functions but that shouldn't matter too much.

In my own programs I think my own deepest inheritance structure is 3 or 4, generally it is 1 or 2 at maximum if it gets more I try to decomposs it into a composition structure.

Worked on titles: CMR:DiRT2, DiRT 3, DiRT: Showdown, GRID 2, theHunter, theHunter: Primal, Mad Max, Watch Dogs: Legion

In this case composition is advisable for an additional reason. To make the content loader spit out custom types (the load call would then look this way: Content.Load<MyModel>(...)) one needs to provide a custom content processor. If this is too much work for little or no gain, then don't do it.

Hmm okay writing a custom importer would probably be too much :D

But I'm confused: Is it generally in c# not porrible to cast from the inheritor to the base class?

Just:


class Base {...}
class Inheritor : Base {....}

int main()
{
      Inheritor val = new Inheritor();
      Base b = (Base)val;
}

That's the thing I'm trying to do.

No, you're trying to go the other way, turning a Base object into an Inheritor object. You can't do that because, while all Inheritors are Bases, not all Bases are Inheritors.

Your model loading code is letting the content importer create a Model instance and then trying to cast it to a MyModel instance. That is not allowed since a Model is NOT a MyModel (though a MyModel IS a Model).

To clarify -

This will NOT work:


Model model = new Model();
MyModel myModel = (MyModel)model; // the instance pointed to by model is NOT an instance of MyModel.

This will work:


MyModel myModel = new MyModel();
...
Model model = myModel; // this always works because MyModel is derived from Model
...
MyModel theModel = (MyModel)model; // this works because the instance pointed to by model is an instance of MyModel;

Oh how embarassing ... finally I see it. Just turned around the logic ^^

Okay guys thanks a lot for helping ^^

This topic is closed to new replies.

Advertisement