Я скачал сценарий из Интернета, и он отлично работает. Я начал адаптировать код для нового приложения. Но я получаю следующую ошибку: 1061: вызов, возможно, неопределенного метода drawShape через ссылку со статическим типом Class.
Глядя на код, я вижу, что метод, вызывающий drawShape, является статическим методом, вызывающим его как таковой: ShapeDrawer.drawShape (); Обратите внимание, что класс ShapeDrawer вообще не импортируется.
Тогда метод drawShape выглядит так: внутренняя функция drawShape () Кто-нибудь может мне объяснить, почему он может работать в загруженном мной приложении, а не в моем. Он был построен для использования с flash player 9, а мой - десять, что может сыграть свою роль.
Вот как это выглядит:
package puzzle
{
import flash.geom.Point;
import utils.MyMath;
public class PuzzleCaculater
{
public static function combineTwoPieces(pieceA:PuzzlePiece , pieceB:PuzzlePiece):void
{
for each(var drawingPiece in pieceB.unionPieces)
{
ShapeDrawer.drawShape(pieceA.graphicLayer , drawingPiece.shapeData , true);
drawingPiece.disactive();
drawingPiece.myGroup = pieceA.myGroup;
drawingPiece.graphicLayer = pieceA.graphicLayer;
pieceA.unionPieces.push(drawingPiece);
drawingPiece.unionPieces = pieceA.unionPieces;
}
}
}
}
package puzzle
{
public class ShapeDrawer
{
internal function drawShape(target:Shape , drawingShapedata:Object , useBitmap:Boolean = true):void
{
var leftShape:Array= drawingShapedata.leftShape;
var topShape:Array= drawingShapedata.topShape;
var rightShape:Array= drawingShapedata.rightShape;
var bottomShape:Array= drawingShapedata.bottomShape;
var shapes:Array= [];
shapes.push(leftShape);
shapes.push(topShape);
shapes.push(rightShape);
shapes.push(bottomShape);
}
}
}
3 ответа
Вы определяете drawShape
следующим образом:
internal function drawShape(...)
И вы должны определить это так:
static internal function drawShape(...)
Это решит вашу проблему, ключевое слово internal
не проблема (потому что оба класса находятся в одном пакете)
static
. Или, может быть (я в этом сомневаюсь) они вызывают функцию экземпляром, например: new ShapeDrawer().drawShape(...)
Ключевое слово internal предотвратит вызов этой функции вне пакета. Попробуйте сделать его общедоступным и посмотрите, исправит ли это его.
package com.something
Если вашего класса нет в пакете com.something, он не сможет получить доступ к методу. Вы можете либо изменить метод на общедоступный, либо добавить свои классы в существующий пакет.
Ознакомьтесь с модификаторами доступа. Они критически важны для шаблонов объектно-ориентированного проектирования в AS3 (и других объектно-ориентированных языках), и их неправильное понимание вызовет проблемы;)
Внутренний: внутренние методы или свойства создаются для совместного использования в общем пакете. Вам не нужно расширять или наследовать классы, имеющие внутренние члены (где, как мы наследуем в случае protected) для доступа к ним. Внутренние члены / методы похожи на общедоступные для классов, находящихся в одном пакете.
Объявление этого метода общедоступным, скорее всего, исправит вашу проблему ... Ура!
Похожие вопросы
Новые вопросы
flash
По вопросам о прекращенной кроссплатформенной среде выполнения мультимедиа Adobe, используемой для встраивания анимации, видео и интерактивных приложений в веб-страницы. По вопросам, связанным с памятью, используйте тег [flash-memory].