Hoe Effectparameters in de klas op te slaan?

Hoe kunnen effect parameters in de klas worden opgeslagen? Ik zit nu voor de derde dag vast in dit probleem en ik denk dat ik langzaamaan gek ga worden.

Ik heb geprobeerd een klasse met de naam EffectParameter te maken, zodat ik mijn parameterwaarden dynamisch kan opslaan/instellen voor de shader van elk object.

Ik heb geprobeerd de ParameterValue in objecttype op te slaan

Object ParameterData;

Maar ik kwam een ​​probleem tegen waar ik moet lezen van deze klas ... dit is waar alles naar beneden gaat in de heuvel.

De methode effect.Parameters ["parameternaam"]. SetValue() accepteert slechts een paar soorten typen. En ik kan een voorwerp niet aan deze methode doorgeven.

Dus ik probeerde dit object te casten.

public T ReadData()
{
    return (T)(object)this.ParameterDataVal;
}

Maar hiermee is mijn probleem dat ik het specifieke type van dit object moet weten wanneer ik het instel ( Float , Texture2D etc.)

En ik kan een typevariabele niet gebruiken om het type van dit object te bepalen. Ik heb geprobeerd om (typevariabel) (object) this.ParameterDataVal; te gebruiken Maar het gaf me gewoon fouten.

Ik was boos, dus ik zocht op internet naar een oplossing voor dynamisch typen. Maar ik vond geen methode voor mijn probleem.

Toen besefte ik dat ik misschien een probleem aan het maken was. Dus besloot ik om een ​​ EffectParameter te gebruiken om mijn gegevens op te slaan.

Maar toen had ik hier nog een probleem mee, opnieuw wanneer ik probeer om deze gegevens in te stellen .... Dus probeerde ik deze parameter effect te geven met een methode, maar ik krijg nog steeds de foutmelding 'It's readonly.'.

Dus ik kan mijn EffectParameter niet toevoegen aan de verzameling. Ik heb op veel manieren geprobeerd. Maar geen succes.

Ik ben hierin helemaal verdwaald. Ik heb geen idee wat ik anders moet doen.

Heeft iemand ooit dit probleem ondervonden of kan iemand mij een goed oplossingsplan geven?

0
Ik denk dat je klasselay-out onduidelijk is. Gebruikt u een class effect , met een eigenschap parameters van een bepaald woordenboektype? En is SetValue een methode van dat woordenboek? Meer code zou helpen.
toegevoegd de auteur phg, de bron
Ik kan je niet helemaal volgen. Plaats alstublieft uw definitie van Effect en andere relevante code.
toegevoegd de auteur phg, de bron
@phg - Effect en EffectParameter worden beiden gedefinieerd via XNA, dus hij zou deze niet kunnen wijzigen. Wat het OP betreft, ik weet niet zeker waarom je het nodig vindt om dit helemaal te doen. Als elk object afzonderlijk effectparameters moet instellen, waarom dan niet gewoon een methode in uw objectklasse maken die een effect als een parameter accepteert (ze zijn referenties, correct? Niet structs?), En zijn variabelen aanpast zoals nodig door het object? Bel dan gewoon die methode voordat je een object tekent.
toegevoegd de auteur A-Type, de bron
Ik probeerde in de 2e oplossing te gebruiken dat ik een EffectParameter-object opsla, dus in de constructor is het gewoon een nieuwe EffectParamter met SetValue. Dus ik heb mijn EffectParameter met de waarde al. Maar wanneer ik een methode wil aanroepen om deze effectparameter in te stellen, krijg ik alleen fouten over dat effect. Parameters zijn alleen-lezen en ik kan mijn effectparameter niet uit mijn klas toevoegen. En ik heb geen idee over de oplossing.
toegevoegd de auteur Beardminator, de bron
Ik voorzag alle dingen om mijn probleem te begrijpen ..
toegevoegd de auteur Beardminator, de bron
Ja maar met die oplossing had ik nu veel problemen: D Maar het lost deze vraag op! Dus ik ben dankbaar.
toegevoegd de auteur Beardminator, de bron

1 antwoord

De klasse van de oplossing:

    public class ObjectShader
    {

        public Effect effect;

        public System.Drawing.Image TextureImage;

        public string ShaderName;

        string TechniqueName;


            public ObjectShader(string name,Effect ef)
            {
                this.ShaderName = name;
                this.effect = ef;


            }


            public void SetValue(string name, System.Drawing.Image val)
            {
                this.TextureImage = val;

            }



            public void SetValue(string name,float val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, float[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }


            public void SetValue(string name, string val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Matrix val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Matrix[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector2 val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector2[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector3 val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, Vector3[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }

            public void SetValue(string name, int val)
            {
                this.effect.Parameters[name].SetValue(val);

            }
            public void SetValue(string name, int[] val)
            {
                this.effect.Parameters[name].SetValue(val);

            }


    }
}
0
toegevoegd