PDA

Просмотр полной версии : Ошибка #1034 Type Coercion failed


flaxe
07.11.2013, 17:57
Очень часто вылезает странная рантайм ошибка:

[Fault] exception, information=TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::MovieClip@108d05509 to CustomClass.

CustomClass содержится в swc и экспортирован как Sprite.
Перекомпиляция swc и повторная компиляция флэшки помогает избавится от этой ошибки на некоторое время, но она возвращается опять. Компилятор ASC2, AIR 3.4, на более ранних SDK такое не наблюдается.

Кто-нибудь встречался с таким? Решаемо?

uglan
07.11.2013, 19:09
Конфликт типов. CustomClass судя по всему экстендится как Sprite, а создаваемый объект имеет изначально класс MovieClip. Попробуй поменять extend на MovieClip в CustomClass.

caseyryan
07.11.2013, 19:15
Скорее всего баг компилятора. Но вполне возможна и ошибка в коде. Можно глянуть участок кода в котором вылетает эта ошибка?

flaxe
07.11.2013, 19:42
Менять базовый класс CustomClass на MovieClip не помогает, пробовал первым делом.

Ошибка возникает когда передаю классы на растеризацию в DMT.
Думаю, что дело не в коде, потому что если просто перекомпилить swc, без изменений, то ошибка уходит.

Так же думаю, что дело в компиляторе, интересует как от этого избавиться)

caseyryan
07.11.2013, 20:05
Проблема в коде.
Ошибка возникает когда передаю классы на растеризацию в DMT.
(Видимо предполагается, что все здесь присутствующие, безоговорочно знают что такое DMT, хотя лично я понятия не имею что это, ну да ладно) Надо тайпкастинг делать при передаче. Если в качестве параметра ожидается мувиклип, а ему суют какой-то CustomClass , то ничего удивительного, что компилятор может этого не понять.
Самый простой пример:


var cc:CustomClass = new CustomClass();

rasterize(cc); // ошибка type coercion
rasterize(cc as MovieClip); // все ок

function rasterize(someShit:MovieClip):void {

}

gloomyBrain
07.11.2013, 20:37
caseyryan, ошибка возникает в рантайме.

flaxe, а что такое DMT в данном случае?

caseyryan
07.11.2013, 20:46
caseyryan, ошибка возникает в рантайме.
Я уже понял. И все-таки склоняюсь к тому, что там кое где-нет тайпкастинга

Inet_PC
07.11.2013, 22:33
DMT видимо сокращение от Dynamically Mapping Textures.

flaxe
08.11.2013, 09:20
Сорри, да DMT это Dynamically Mapping Textures, https://github.com/XTDStudios/DMT
Ошибка возникает в конструкторе CustomClass.
И опять же повторюсь, ошибка не постоянна при одном и том же коде.

caseyryan
08.11.2013, 11:41
покажите конструктор CustomClass

flaxe
08.11.2013, 11:50
CustomClass это экспортированный из Flash IDE класс с базовым Sprite. Конструктор у него генерится IDE.
Вот весь стек ошибки: https://dl.dropboxusercontent.com/u/11076330/error_stack.png

caseyryan
08.11.2013, 11:56
Я вижу там старлинг. А у него не flash.display, а starling.display
Видимо зарытую собаку надо искать вообще в другом месте. А данная ошибка это лишь побочный эффект

Ну и, думаю стоит скачать AIR 3.8 или 3.9 для верности

flaxe
08.11.2013, 12:04
Старлинг тут не причем. Ошибка возникает еще до взаимодействия с ним.
Опять же, дело не в коде, потому что он работает при следующей компиляции, при этом без каких-либо изменений.
AIR 3.9 та же беда.

Добавлено через 2 часа 42 минуты
Дело 100% в компиляторе.
Если использовать AIR SDK без нового компилятора проблема самоустраняется.
Странно, что этот баг до сих пор не устранили. Видел его уже а нескольких машинах, у нескольких людей.

https://bugbase.adobe.com/index.cfm?event=bug&id=3562040

skorpionnn333
11.08.2014, 21:13
У меня тоже такая ошибка возникает.Вот код в классе Main package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;

public class Main extends Sprite
{
public var curball:Ball;

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
spawnBall();
}

public function spawnBall():void
{
var ball:Ball = new Ball;
addChild(ball);
ball.x = Math.random () * 700;;
curball = ball;
flyBall(ball);
}

public function flyBall(ball:Ball):void
{
var time:Timer = new Timer (100,600);
time.start ();
time.addEventListener(TimerEvent.TIMER,moveball);
}

private function moveball(e:TimerEvent):void
{
curball += 1;
}
}

}
И код в классе Ball package
{
import flash.display.Sprite;

public class Ball extends Sprite
{
public var symb:Ballsymb = new Ballsymb;

public function Ball()
{
addChild(symb);
}

}

}