Actionscript 3 在AS3中更改类属性
好的,所以我最近一直在努力正确理解AS3中的OOP。现在我有一个非常简单的场景,我有一个类,paile,它画了一个矩形。在我的文档类中,我创建了桨类的两个实例:桨1和桨2 我还为我的桨类创建了一个属性,我想更改它绘制的矩形的颜色。我希望能够从主类调整此属性。我知道我可以通过在实例化类时传递属性来实现这一点,但是属性似乎是更好的方式,现在我想知道这是否是正确的思考方式 主要类别:Actionscript 3 在AS3中更改类属性,actionscript-3,oop,class,properties,Actionscript 3,Oop,Class,Properties,好的,所以我最近一直在努力正确理解AS3中的OOP。现在我有一个非常简单的场景,我有一个类,paile,它画了一个矩形。在我的文档类中,我创建了桨类的两个实例:桨1和桨2 我还为我的桨类创建了一个属性,我想更改它绘制的矩形的颜色。我希望能够从主类调整此属性。我知道我可以通过在实例化类时传递属性来实现这一点,但是属性似乎是更好的方式,现在我想知道这是否是正确的思考方式 主要类别: package { import flash.display.Sprite; import f
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Engine extends Sprite
{
private var paddle1:Paddle = new Paddle();
private var paddle2:Paddle = new Paddle();
public function Engine()
{
paddle1.x = 30;
paddle1.color = 0xFF00FF;
stage.addChild(paddle1);
paddle2.x = stage.stageWidth - 45;
paddle2.color = 0xFF0000;
stage.addChild(paddle2);
}
}
}
桨类:
package
{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.Graphics;
import flash.events.Event;
public class Paddle extends MovieClip
{
public var color:uint = 0xFFFFFF;
public function Paddle()
{
var child:Shape = new Shape();
child.graphics.beginFill(color);
child.graphics.drawRect(0, 260, 15, 80);
child.graphics.endFill();
addChild(child);
}
}
}
如果以这种方式更改属性不是做事情的最佳方式,那么当然要这样说。否则,我做错了什么,它不工作?似乎这与顺序有关(当主类更改颜色属性时,它已经创建了矩形,现在更改它已经太晚了?)
谢谢:D
编辑:意识到这可能有助于说明当我执行此代码时会发生什么。基本上,从Engine类更改color属性不会更改矩形的颜色,它们都保持为白色(FFFFFF)问题是,如果您这样做:
new Paddle();
您的构造函数代码正在运行。这意味着矩形已经用类顶部定义的颜色绘制。然后,您将在此之后更改颜色属性,如您所见,这没有任何效果
我建议你为你的桨制作一个draw()
函数。它可以接受一种颜色并用于绘制矩形。可能是这样的:
public class Paddle extends MovieClip
{
private var _child:Shape;
public function Paddle()
{
_child = new Shape();
addChild(_child);
}
public function draw(color:uint):void
{
_child.graphics.clear();
_child.graphics.beginFill(color);
_child.graphics.drawRect(0, 260, 15, 80);
_child.graphics.endFill();
}
}
这种方法的优点是,您可以修改draw()
的参数,以接受矩形的尺寸或其他会影响视觉效果的元素。如果您决定这样做,这将比必须向类本身添加更多属性更干净、更快
然后,您可以执行以下操作:
var paddle1:Paddle = new Paddle();
var paddle2:Paddle = new Paddle();
paddle1.draw(0xFF00FF);
paddle2.draw(0xFF0000);
为什么不两个都做呢D
public class Paddle extends MovieClip
{
private var color:uint;
private var rec:Shape;
public function Paddle(newColor:uint = 0xFFFFFF) // default color
{
color = newColor;
rec = new Shape();
drawShape();
addChild(rec);
}
public function drawShape()
{
child.graphics.clear();
child.graphics.beginFill(color);
child.graphics.drawRect(0, 260, 15, 80);
child.graphics.endFill();
}
public function setColor(newColor:uint)
{
color = newColor;
drawShape();
}
}
除了为颜色创建setter之外,您还可以允许构造函数分配颜色,让两个调用随后绘制挡板(顺便说一下,也可以是一个简单的flash.display.Shape):
划桨。如:
package
{
//Imports
import flash.display.Sprite;
//Class
public class Paddle extends Sprite
{
//Constants
private static const DEFAULT_COLOR:uint = 0xFF0000;
//Properties
private var mColor:uint;
//Constructor
public function Paddle(color:uint = DEFAULT_COLOR)
{
mColor = color;
draw();
}
//Draw
private function draw():void
{
graphics.clear();
graphics.beginFill(mColor);
graphics.drawRect(0, 0, 15, 80);
graphics.endFill();
}
//Set Color
public function set color(value:uint):void
{
mColor = value;
draw();
}
//Get Color
public function get color():uint
{
return mColor;
}
}
}
var paddleRed:Paddle = new Paddle();
paddleRed.y = 10;
addChild(paddleRed);
var paddleGreen:Paddle = new Paddle(0x00FF00);
paddleGreen.y = 126;
addChild(paddleGreen);
var paddleBlue:Paddle = new Paddle();
paddleBlue.color = 0x00FF00;
paddleBlue.y = 260;
addChild(paddleBlue);
因此,现在您可以创建和定位任意多个桨实例,每个实例都有自己的颜色设置器:
红色实例:
package
{
//Imports
import flash.display.Sprite;
//Class
public class Paddle extends Sprite
{
//Constants
private static const DEFAULT_COLOR:uint = 0xFF0000;
//Properties
private var mColor:uint;
//Constructor
public function Paddle(color:uint = DEFAULT_COLOR)
{
mColor = color;
draw();
}
//Draw
private function draw():void
{
graphics.clear();
graphics.beginFill(mColor);
graphics.drawRect(0, 0, 15, 80);
graphics.endFill();
}
//Set Color
public function set color(value:uint):void
{
mColor = value;
draw();
}
//Get Color
public function get color():uint
{
return mColor;
}
}
}
var paddleRed:Paddle = new Paddle();
paddleRed.y = 10;
addChild(paddleRed);
var paddleGreen:Paddle = new Paddle(0x00FF00);
paddleGreen.y = 126;
addChild(paddleGreen);
var paddleBlue:Paddle = new Paddle();
paddleBlue.color = 0x00FF00;
paddleBlue.y = 260;
addChild(paddleBlue);
绿色实例:
package
{
//Imports
import flash.display.Sprite;
//Class
public class Paddle extends Sprite
{
//Constants
private static const DEFAULT_COLOR:uint = 0xFF0000;
//Properties
private var mColor:uint;
//Constructor
public function Paddle(color:uint = DEFAULT_COLOR)
{
mColor = color;
draw();
}
//Draw
private function draw():void
{
graphics.clear();
graphics.beginFill(mColor);
graphics.drawRect(0, 0, 15, 80);
graphics.endFill();
}
//Set Color
public function set color(value:uint):void
{
mColor = value;
draw();
}
//Get Color
public function get color():uint
{
return mColor;
}
}
}
var paddleRed:Paddle = new Paddle();
paddleRed.y = 10;
addChild(paddleRed);
var paddleGreen:Paddle = new Paddle(0x00FF00);
paddleGreen.y = 126;
addChild(paddleGreen);
var paddleBlue:Paddle = new Paddle();
paddleBlue.color = 0x00FF00;
paddleBlue.y = 260;
addChild(paddleBlue);
蓝色实例:
package
{
//Imports
import flash.display.Sprite;
//Class
public class Paddle extends Sprite
{
//Constants
private static const DEFAULT_COLOR:uint = 0xFF0000;
//Properties
private var mColor:uint;
//Constructor
public function Paddle(color:uint = DEFAULT_COLOR)
{
mColor = color;
draw();
}
//Draw
private function draw():void
{
graphics.clear();
graphics.beginFill(mColor);
graphics.drawRect(0, 0, 15, 80);
graphics.endFill();
}
//Set Color
public function set color(value:uint):void
{
mColor = value;
draw();
}
//Get Color
public function get color():uint
{
return mColor;
}
}
}
var paddleRed:Paddle = new Paddle();
paddleRed.y = 10;
addChild(paddleRed);
var paddleGreen:Paddle = new Paddle(0x00FF00);
paddleGreen.y = 126;
addChild(paddleGreen);
var paddleBlue:Paddle = new Paddle();
paddleBlue.color = 0x00FF00;
paddleBlue.y = 260;
addChild(paddleBlue);
啊,正如我所料,但我太累了,看不清楚。不过,我觉得这与代码实际执行的顺序有关。您对draw函数的建议非常有效,谢谢!