我是flash和actionscript的新手。我已经阅读了很多关于它的内容,这也是我第一次面向对象编程。
到目前为止,我创建了一个带有登录按钮的应用程序,就是这样。但是,我想知道我做错了什么,或者应该做的不同(或更好)。我使用的是Adobe Flex Builder 3。
主要动作文件是Client2.as:
package
{
//import required libraries
import flash.display.Sprite;
//set project properties
[SWF(width="800", height="600", frameRate="31", backgroundColor="#C0C0C0")]
//launch main class
public class Client2 extends Sprite
{
public function Client2() { //the constructor
trace("Client launched.");
var loginGui:LoginInterface = new LoginInterface(); //load the login interface object
loginGui.init(); //initialize the login interface (load it)
addChild(loginGui); //add login gui to the display tree
}
}
}
正在加载登录界面对象。这是一件好事,我是以正确的方式做到的吗?
然后是LoginInterface.as类文件:
package
{
//import required libraries
import flash.display.Sprite;
//the LoginInterface class
public class LoginInterface extends Sprite
{
public function LoginInterface() //the constructor
{
trace("LoginInterface object loaded.");
}
public function init():void //initialize the login interface (load it)
{
trace("LoginInterface init method was called.");
var loginButton:CustomButton = new CustomButton(300, 300, 100, 30, 3, 18, "Login!"); //create a new custom button
addChild(loginButton); //add the custom button to the display tree
}
}
}
那怎么样?任何意见?为了简化按钮的创建,我创建了另一个名为CustomButton.as的类文件 - >
package
{
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
public class CustomButton extends Sprite
{
public function CustomButton(xLoc:int, yLoc:int, width:int, height:int, iLabelOffset:int, fontsize:uint, label:String)
{
//create new simple button instance
var myButton:SimpleButton = new SimpleButton();
//create the look of the states
var normal:Sprite = new Sprite();
normal.graphics.lineStyle(1, 0x000000);
normal.graphics.beginFill(0x6D7B8D);
normal.graphics.drawRect(xLoc, yLoc, width, height);
//the mouseover sprite
var over:Sprite = new Sprite();
over.graphics.lineStyle(1, 0x000000);
over.graphics.beginFill(0x616D7E);
over.graphics.drawRect(xLoc, yLoc, width, height);
// assign the sprites
myButton.upState = normal;
myButton.downState = normal;
myButton.hitTestState = normal;
myButton.overState = over;
//add the button to the display tree
addChild(myButton);
//create button label
var tText:TextField = new TextField();
tText.mouseEnabled = false,
tText.x = xLoc;
tText.y = yLoc + iLabelOffset;
tText.width = width;
tText.selectable = false
var Format:TextFormat = new TextFormat();
Format.font = "Arial";
Format.color = 0x000000;
Format.size = fontsize;
Format.bold = false;
Format.align = TextFormatAlign.CENTER;
tText.defaultTextFormat = Format;
tText.text = label;
addChild(tText)
}
}
}
有什么可评论的吗?我确信我做了很多错事,也许我没有真正得到整个面向对象的东西?另外,我对类声明之后使用“扩展...”的方式感觉不好,主要是因为我一直只是使用Sprite并且不太明白为什么或它做什么(遇到麻烦)在互联网上找到了)。我不确定的另一件事是在AS3中命名变量。我真的应该使用xLoc或iLabelOffset等名称吗?我认为我的变量命名至少不是很一致吗?
我希望有人能给我一个比我现在更好的轨道,因为我确信在继续研究这个野兽之前我应该改进我的AS3编码。
非常感谢。
答案 0 :(得分:3)
我的意见:
一个名为Client2的类可能是一个错误的命名选择。 Client2并没有告诉我太多。在一年的时间里它能告诉你多少钱?
在CustomButton中,初始化在构造函数中处理。在LoginInterface中,使用类的实例需要显式调用init()。容易忘记和不必要。除非有充分的理由不这样做,否则请从构造函数中调用init。
iLabelOffset是什么意思?最好在参数列表中使用较少混淆的名称。
CustomButton构造函数的参数列表非常长。没有必要传入x和y。 Sprite已经具有x和y属性,因此将所有内容放回零偏移量并在构造后操纵CustomButton的x和y属性。
在CustomButton构造函数的其余参数中,请考虑重新排序它们,以便您可以提供默认参数(只能在参数列表的末尾)。 labelOffset和fontSize似乎是不错的选择。
通过删除重复的代码来保持较小的功能。创建一个函数来创建按钮状态Sprite,它在其参数中获取颜色(或者更好的是,将此功能移动到新类型的Sprite派生类中),还添加一个createLabel函数,以便您可以将该代码移出构造函数。如果尝试保持较小的函数,则代码将更易于阅读和维护。这也意味着你必须少写评论; - )
答案 1 :(得分:2)
很少有书专注于编程的这一方面,而且做得更好。如果你想在这个领域增长更多,我强烈建议你选择以下两本书(即使你不想要我也推荐它)。
每本程序员都应阅读这两本书,所以请查看它们。从Actionscript的角度来看,你的代码很好,但这只是语法。重要的是要注意,除非你真正编写代码,否则这些技能永远不会发展,所以无论如何“继续在这个野兽上工作”,其余的也会效仿。
答案 2 :(得分:0)
就风格问题而言,我喜欢在构造函数之外声明我的变量。这让我觉得我不会对公共与私人或范围产生任何意外。另请注意添加的空白区域,这可以提高可读性。
public class CustomButton extends Sprite
{
private var myButton:SimpleButton;
private var normal:Sprite;
private var over:Sprite;
// etc ...
public function CustomButton(xLoc:int, yLoc:int, width:int, height:int, iLabelOffset:int, fontsize:uint, label:String)
{
//create new simple button instance
myButton = new SimpleButton();
//create the look of the states
normal = new Sprite();
normal.graphics.lineStyle(1, 0x000000);
normal.graphics.beginFill(0x6D7B8D);
normal.graphics.drawRect(xLoc, yLoc, width, height);
//the mouseover sprite
over = new Sprite();
over.graphics.lineStyle(1, 0x000000);
over.graphics.beginFill(0x616D7E);
over.graphics.drawRect(xLoc, yLoc, width, height);
// etc ...