我在Flash中创建了一个静态类,它作为此游戏的库存代理。 Flash虽然不断给我这个错误:
ArgumentError: Error #1063: Argument count mismatch on Inventory(). Expected 1, got 0.
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at Main()
我查看了代码并且不能为我的生活找到错误的来源。当我在调试模式下运行电影时,它告诉我错误可以在Main()中的第8行找到,它是文档类,除了空构造函数之外,它目前不包含任何代码。第8行是构造函数的起始位置 Inventory类看起来像这样:
package {
import flash.display.MovieClip;
import flash.utils.getDefinitionByName;
public class Inventory extends MovieClip{
private static var instance:Inventory;
private var invItemQuant:int;
public function Inventory(pvt:PrivateClass){
invItemQuant = 0;
}
public static function getInstance():Inventory{
if(Inventory.instance == null){
Inventory.instance = new Inventory(new PrivateClass());
}
return Inventory.instance;
}
//Usage: x.addToInventory(itemName);
//After: item has been added to the inventory
public function addToInventory(itemName:String){
var itemType:Class = getDefinitionByName(itemName) as Class;
var theItem:MovieClip = new itemType();
theItem.name = itemName;
invItemQuant++;
MovieClip(getChildByName("itemSlot" + invItemQuant)).fillSlot(theItem);
}
//Usage: x.removeFromInventory(itemName);
//Before: item is contained in inventory
//After: item has been removed from the inventory
public function removeFromInventory(itemName:String){
for(var i:int = 1; i <= invItemQuant; i++){
MovieClip(getChildByName("itemSlot" + i)).emptySlot(itemName);
}
invItemQuant--;
}
//Usage: q = getItemQuant();
//Before: q is int
//After: the number of items in inventory is in q
public function getItemQuant():int{
return invItemQuant;
}
}
}
class PrivateClass {
public function PrivateClass(){
trace("PrivateClass called");
}
}
我把它设为静态,所以我可以从舞台上访问它并将项目添加到库存中。然后,Inventory MovieClip由名为itemSlot1,itemSlot2等的大型插槽组成 然后将库存槽链接到此类:
package {
import flash.display.MovieClip;
public class InvSlot extends MovieClip {
public function InvSlot() {
}
//Usage: x.fillSlot(itemName);
//Before: slot is empty
//After: object theItem has been put into the slot
public function fillSlot(theItem:MovieClip){
this.addChild(theItem);
}
//Usage: x.emptySlot(itemName);
//Before: movieclip itemname may exist in this object
//After: movieclip itemname does not exist in this object
public function emptySlot(itemName:String){
}
}
}
我还没有制作emptySlot方法。 fillSlot方法只是将收到的movieClip添加到它自己 最后我有stageItem,当与之交互时(目前刚刚点击)应该添加到库存中。
package {
import flash.events.MouseEvent;
public class StageItemRubberChicken extends StageItemBase{
public function StageItemRubberChicken() {
description = "It's a chicken, of the rubbery kind";
descriptiveName = "Rubber Chicken";
itemName = "ItemRubberChicken";
this.addEventListener(MouseEvent.CLICK, interactWithItem, false, 0, true);
}
private function interactWithItem(e:MouseEvent){
var mainInventory:Inventory = Inventory.getInstance();
mainInventory.addToInventory(itemName);
this.parent.removeChild(this);
}
}
}
答案 0 :(得分:2)
不要让C ++ - ish语法欺骗你。 Actionscript不是C ++。
出于某种原因,当您编写AS类时,您必须遵循两条规则:
因此,Inventory类的问题在于它的构造函数接受了MovieClip构造函数中不存在的参数。
答案 1 :(得分:1)
请允许我在这里不同意。我知道这个问题被标记为已回答,但是Inventory看起来像是一个Singleton,所以如果你在Main中实例化它就像这样:
new Inventory();
你会得到一个错误,因为Inventory需要一个类型为PrivateClass的参数,顺便说一句,它不能从Main类访问。这就是错误的含义
Argument count mismatch on Inventory(). Expected 1, got 0.
创建库存实例的唯一方法是执行以下操作:
var inventory:Inventory = Inventory.getInstance();
另外,对不起Kelsey,但声明子类构造函数必须与超类构造函数具有相同的参数,这是不准确的。
答案 2 :(得分:0)
通过遵循PatrickS逻辑找出问题所在。我所做的是创建一个Movieclip,它有一些库存槽图形并将其与Inventory类链接。然后我将MovieClip的一个实例拖到舞台上。
然后Flash可能会使用默认构造函数而不是“Inventory.getInstance();”创建该实例。
使用
创建广告资源mainInventory:MovieClip = Inventory.getInstance();
addChild(mainInventory);
Main()中的完成修复此操作的工作。一个人必须要小心,我猜想在代码中进行体操,然后使用拖放Flash时间线。