- Home /
Dynamic variables and references in a javascript class
Hi,
I'm trying to clean up some code which is repeated 4 times but uses different variable and references names. Its all nice organised so that it should be easy enough to feed a variable name into a class and let it insert the variable into the relevant parts of the code.
However I can't get round this:
Code which works:
var storageC = resourceHolder.h2oStorageCurrent;
Code which DOESN'T work:
var name = "h2o"; //this would actually be a variable defined during the call to the class, I just put it here to simplify the example
var storageC = resourceHolder[name + "StorageCurrent"];
Obviously there is more to my class than that, but as I can make it work with the 1st bit of code, it must be my understanding of javascript and it's coding practices.
Hopefully you can see what I'm trying to do and suggest a solution.
Thanks
Rob
Extra Information
Apologies for not providing all the info you need to help. I am trying to pull a variable from another GO to use with the drawing of UI elements on this GO. My code works, but I have 4 blocks of very similar code I'm trying to clean up into a reusable class. The error I get is: "MissingFieldException: Field 'HUBResources.' not found."
Here is my full class: class statusPanel{
var name : String;
var offsetX : int;
var offsetY : int;
var resources : GameObject; //resources is passed a GO which has a script called HUBResources attached to it. This contains some int and float variables which affect the whole game, but in this instance are just being read to display them on a pda style system.
function statusPanel(name, offsetX, offsetY, resources, textHolder){
var filename = "pda_icon_"+name+"_green.png";
var resourceHolder = resources.GetComponent("HUBResources"); //Here I reference the script directly
var storageC = resourceHolder.h2oStorageCurrent; //This is the working non-dynamic version
var storageC2 = resourceHolder[name"+StorageCurrent]; //This is my attempt to make the same line dynamic so I can reuse the code for my other variables sets, oxygen, energy and food.
//The rest of the code uses UIToolkit to draw out various UI elements, all of which work fine.
var icon = UI.firstToolkit.addSprite(filename, offsetX + 80, offsetY + 120);
var bar = UIProgressBar.create("pda_misc_bar.png", "pda_misc_barHolder.png", 3, 3, 0, 0);
pos = bar.position;
pos.x = UIRelative.xPixelsFrom( UIxAnchor.Left, offsetX + 130 );
pos.y = -UIRelative.yPixelsFrom( UIyAnchor.Top, offsetY + 120 );
bar.position = pos;
bar.resizeTextureOnChange = true;
bar.value = storageC / resourceHolder.h2oStorageMax;
}
};
I'm pretty sure the problem is just contained within the storageC2 line.
Thanks again.
Rob
You'll need to give us more information. What do you mean it doesn't work? Do you get an error, does something not behave the way you expect? If you're getting an error, what is the error? What type of object is resourceHolder
?
Can no one figure out what I'm trying to do? Perhaps it's not even possible?
Answer by RaptopLob · Jun 25, 2011 at 01:49 PM
I have resolved my problem by placing the following function within the GO I am requesting the variables from:
function returnValue(nameString : String){ return this.GetType().GetField(nameString).GetValue(this); }
I then call the function during the assigning of the local variable, like this: var storageCurrent = resourceHolder.returnValue(name+"StorageCurrent");
Using reflection to get fields named with strings is going to get very expensive if you do that regularly. You might be better off setting up a System.Collections.Generic.Dictionary collection and hitting that. This approach has the added advantage that you can check to see if an object even contains a value with that key name.
Answer by Anxo · Jun 24, 2011 at 05:56 PM
I agree with Burn, you are using shortcuts by not declaring your objects so we don't know if your resourcholder and stuff is a game object or what.
Just remember if you are declaring something with: "" then you are making it a String. it would also help if you would tell us what happens that was not intended if anything or link the error.
From what you told us, I will guess that you are trying to call a gameObject with a string.
Your answer
