I've been having a problem with passing variables between classes.
I have one class called GlobeView.as
Within that is a function designed to add markers to a globe
GlobeView.as -
public function addAdventureMarker( latitude:Number, longitude:Number, name:String=null ):void
{
var marker:Marker = new Marker();
marker.name = name;
placeMarker( marker, latitude, longitude );
}
This function creates a new instance of a class called Marker. Within Marker.as there is a function that among other things defines the colour of the markers
Marker.as -
public function Marker()
{
super();
var frontMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
var backMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
var leftMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
var rightMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
var topMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
var bottomMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
var materials:MaterialsList = new MaterialsList( { front:frontMaterial, back:backMaterial, left:leftMaterial, right:rightMaterial, top:topMaterial, bottom:bottomMaterial } );
cube = new Cube( materials, width, depth, height );
cube.addEventListener( InteractiveScene3DEvent.OBJECT_OVER, onCubeOver, false, 0, true );
cube.addEventListener( InteractiveScene3DEvent.OBJECT_OUT, onCubeOut, false, 0, true );
cube.addEventListener( InteractiveScene3DEvent.OBJECT_CLICK, onCubeClick, false, 0, true );
cube.geometry.vertices[0].x -= 4;
cube.geometry.vertices[0].y += 4;
cube.geometry.vertices[1].x -= 4;
cube.geometry.vertices[开发者_StackOverflow中文版1].y -= 4;
cube.geometry.vertices[2].x += 4;
cube.geometry.vertices[2].y += 4;
cube.geometry.vertices[3].x += 4;
cube.geometry.vertices[3].y -= 4;
addChild( cube );
cube.moveBackward( depth / 2 );
}
What I'm trying to do is define a variable in GlobeView.as e.g. var markerColor:String;
When a marker is added, give the variable a value e.g.
{
var marker:Marker = new Marker();
marker.name = name;
markerColor = "red";
placeMarker( marker, latitude, longitude );
}
Then add an if statement to the marker class
e.g.
public function Marker()
{
super();
if (markerColor=="red")
{
var frontMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
var backMaterial:ColorMaterial = new ColorMaterial( 0xff7200, 1, true );
var leftMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
var rightMaterial:ColorMaterial = new ColorMaterial( 0xff6100, 1, true );
var topMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
var bottomMaterial:ColorMaterial = new ColorMaterial( 0xff4f00, 1, true );
}
I hope that makes sense - probably made it a lot more complicated than it needs to be
Why not pass those variables in the constructor for example?
public function Marker( name: String, color: String = "blue" )
{
super();
this.name = name;
if (color == "red")
{
// ...
}
}
By default it would have the color-string set to "blue". The code does seem that it could use some refactoring though. For example, pass the color-parameter directly (e.g. use a uint and use that variable in the constructor of the ColorMaterial):
public function Marker( name: String, color: uint )
{
var material: ColorMaterial = new ColorMaterial( color, ... );
// ...
}
Or better yet, have pre-defined material-lists and pass one of those.
This code is simpler and work for mine as well.
In marker class:
private var m_color:String;
public function markerColor(value:String):void {
this.m_color = value;
}
And in main class:
var marker:Marker = new Marker();
marker.markerColor("red");
You are defining "markerColor" as a variable in the GlobeView class and referencing it in the Marker class. The Marker class will not know what the value of the GlobeView.markerColor is unless you pass it into the Marker class.
In your code (below), markerColor is in no way associated with the marker object or Marker class.
{
var marker:Marker = new Marker();
marker.name = name;
markerColor = "red";
placeMarker( marker, latitude, longitude );
}
You could add a "markerColor" property/variable to the Marker class:
private var m_color:String
public function markerColor():String {
return m_color;
}
public function set markerColor(value:String):void {
this.m_color = value;
}
And then change your code to be something like:
{
var marker:Marker = new Marker();
marker.name = name;
marker.markerColor = "red";
placeMarker( marker, latitude, longitude );
}
精彩评论