Usando arquivo do Flash Component SWC no Flex
-
02-07-2019 - |
Pergunta
Eu estou acessando UIComponent personalizado através de um arquivo SWC do Flex 3. Este componente funciona bem em Flash CS3, mas usá-lo a partir Flex dá um erro estranho em draw ().
I adicionou componente SWC dentro sprite (com addChild) e o seu caminho em lib.
TypeError: Error # 1010:. Um termo é indefinido e não tem propriedades
at com.xxxx.highscores::HighScores/draw()
at fl.core::UIComponent/callLaterDispatcher()
Aqui é a função draw () deste componente UI:
protected override empate function (): void { isInitializing = false;
page.Text.x = width / 2;
page.Text.y = height / 2;
drawBackground();
}
Solução
Com apenas esse código, ele deve ser uma das páginas, ou page.Text, é nulo.
Indo pelos nomes, eu acho que a página é uma biblioteca objeto Flash que você criar com AS? Se assim for, eu acho um erro anterior está disparando antes de ser criado e ser swollowed pelo jogador (pode acontecer se o depurador ainda não anexado, ou problemas com o carregamento compartilhado librarys). 'Estágio' não estar pronto para novo objeto de exibição até que ele é adicionado à lista de exibição é comum.
EDIT: É um bug no componente: draw()
sempre usa a propriedade highScoresModuleText
na página: o que só é definido quando a página é uma HighScoresTextPage
, e não qualquer uma das outras páginas, como por exemplo: HighScoresTablePage
, que showHighsSores()
define-a. Isso funciona no Flash presumivelmente porque o objeto está no palco, ou pelo menos é criado antes showHighScores()
é chamado, então draw()
é chamado em primeiro lugar, e uma vez que o componente não invalida, não é chamado depois.
O método correto nesse caso é ter show*()
apenas definir algumas propriedades, então invalidate()
ter figura draw()
-lo mais tarde, mas uma solução rápida é apenas adicionar 'if (page.highScoresModuleText)
' em torno das linhas ofensivas em draw()
. Uma correção ainda mais rápida é criar e addChild()
o componente precoce (como inicialização), e chamada showHighScores()
muito mais tarde.
Isso funciona para mim:
package
{
import flash.display.Sprite;
import com.novelgames.flashgames.highscores.HighScores;
import flash.events.MouseEvent;
public class As3_scratch extends Sprite
{
private var highscore : HighScores;
public function As3_scratch()
{
highscore = new HighScores();
addChild(highscore);
stage.addEventListener(MouseEvent.CLICK, onClick);
}
private function onClick(event : MouseEvent) : void
{
highscore.showEnterHighScore(50);
}
}
}