![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
|
Надо сделать такую штуку: появляется текстовое поле со словом (вариант ответа теста), оно таскается мышью, через 10 секунд исчезает и появляется следующее. За эти 10 с слово (если ответ верный) надо оттащить на мувик, который так или иначе среагирует.
С помощью советов форума, хелпа, О'Рейли и Гурского удалось сделать появление и исчезновение слов, и мышью они успешно таскаются. Дальше картинку кораблика на сцене конвертирую в символ, класс назначаю "ship", базовый класс - flash.display.Sprite, instance name - caravella. Почему-то в Output всё равно считается MovieClip-ом. В ship.as создаю одноимённый класс, наследуя его от Sprite, импортирую и основной класс документа. В основной функции ship пытаюсь для начала оттрассировать hitTestObject каравеллы с объектом box из осн. класса документа (в нём сидит вариант ответа). Должно бы появиться "false", а появляется ругань на "possibly undefined variables". Проверял видимость переменных одного класса из другого в той же директории на более простых вещах (оттрассировать функцией одного класса переменную из другого) - то же самое. Всё объявлял "public". Ничего не понимаю! В хелпе и О'Рейли не смог найти объяснения, вроде, сказано, что если в публичном классе объявить публичную переменную или функцию, то её вполне можно прочитать в другом классе. Пожалуйста, если у кого найдётся время помотреть исходники и объяснить ошибки, сделайте это! Я какие-то базовые понятия путаю? В php, например, переменные любого публичного класса можно (импортировав) прочитать и даже переопределить в любом же. Исходники не могу загрузить. Вставляю код основного класса: package
{
import flash.display.Sprite;
import flash.text.*;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class answers extends Sprite
{
var words:Array =[
{val:"Гаити",flag:true},
{val:"Ньюфаундленд",flag:false},
{val:"Гренландия",flag:false},
{val:"Куба",flag:true},
{val:"Цейлон",flag:false},
{val:"Великобритания",flag:false},
{val:"Ямайка",flag:true},
{val:"Антарктида",flag:false},
{val:"табак",flag:true},
{val:"индейцы",flag:true},
{val:"золото",flag:false},
{val:"Тринидад",flag:true},
{val:"Шпицберген",flag:false},
{val:"мыс Дежнёва",flag:false},
{val:"Амазонка",flag:false}
];
var i:int =0;// итератор слов
// создаём 10-секундный таймер и поле отсчёта
var timer:Timer = new Timer(1000, 10);
var timerField:TextField=new TextField;
// создаём клип-контейнер
var box:Sprite=new Sprite;
// создаем поле ответа
var tf:TextField=new TextField;
public function answers():void
{
//добавляем листенеры к таймеру
timer.addEventListener(TimerEvent.TIMER, onTick);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
// Перехватываем нажатие кнопки мыши
box.addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown);
// Отпускание мышки
box.addEventListener(MouseEvent.MOUSE_UP,handleMouseUp);
//Отпускание мышки за пределами флэшки
box.addEventListener(MouseEvent.MOUSE_OUT,handleMouseUp);
//запускаем первое слово
newWord(i);
}
//собственно функция появления варианта ответа
private function newWord(i):void
{
//запускаем таймер
timer.reset();
timer.start();
//поле таймера
timerField.x =450;
timerField.text = "Осталось " + timer.repeatCount + " с.";
addChild(timerField);
//заполняем и форматируем поле ответа
tf.autoSize=TextFieldAutoSize.LEFT;
tf.selectable=false;
tf.text=words[i].val;
var format:TextFormat=new TextFormat;
format.font="Verdana";
format.size=16;
format.bold=true;
tf.setTextFormat(format);
//выводим клип и суём туда текстовое поле
box.x =10;
box.y =10;
addChild(box);
box.addChild(tf);
}
//Функции Drag&Drop
private function handleMouseDown(event:MouseEvent):void
{
box.startDrag();
}
private function handleMouseUp(event:MouseEvent):void
{
box.stopDrag();
}
//функции таймера
private function onTick(event:TimerEvent):void
{
// показывает счётчик
var t:int = event.target.repeatCount-event.target.currentCount;
timerField.text="Осталось " + t + " с.";
}
private function onTimerComplete(event:TimerEvent):void
{
//клип-контейнер и счётчик исчезают
removeChild(timerField);
box.removeChild(tf);
removeChild(box);
//если не дошли до конца, сдвигаем итератор и запускаем следующее слово
if (i < words.length-1) {
i++;
newWord(i);
}
}
}
}
package
{
import flash.display.Sprite;
import answers;
public class ship extends Sprite
{
public function ship():void
{
trace(this.caravella.hitTestObject(answers.box));
}
}
}
![]() |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
|
Граждане, это я такую каку написал, что отвечать противно, или что-то непонятно?
|
|
|||||
|
не очень-то ясно как объяснить:
вот ты смотришь хиттест this.caravella с неким answers.box оба объекта не существуют : -у this(т.е. ship) нет сойства caravella , если надо смотреть хиттест этого объекта (ship), то и пиши this.hitTestObject, а по сути просто trace(hitTestObject(answers.box)); -дальше: у answers нет статического свойства box, сделай его статическим (static var box:Sprite=new Sprite; в классе answers)и тогда ship его увидит.. зы: а иначе, правильно derhab говорит, надо искать этот бокс не в классе, а в экземпляре (руте или где-ты там это добро создаешь) Последний раз редактировалось silin; 27.06.2007 в 15:17. |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
|
Цитата:
Надоело извиняться за глупые вопросы, но если я их не буду задавать, то ничему не научусь. |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
|
Цитата:
|
|
|||||
|
Цитата:
|
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
|
Цитата:
Спасибо за советы! Сделал box статическим, каравеллу добавил, как на AS3.ru написано (и Miramax спасибо!), вроде заработало. Но, естественно, один раз - листенер ENTER_FRAME после срабатывания убирается, иначе постоянно генерит. Пытаюсь присобачить проверку столкновения к box: package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.text.*;
import flash.events.*;
import flash.utils.Timer;
public class answers extends Sprite
{
var words:Array=[{val:"Гаити",flag:true},{val:"Ньюфаундленд",flag:false},{val:"Гренландия",flag:false},{val:"Куба",flag:true},{val:"Цейлон",flag:false},{val:"Великобритания",flag:false},{val:"Ямайка",flag:true},{val:"Антарктида",flag:false},{val:"табак",flag:true},{val:"индейцы",flag:true},{val:"золото",flag:false},{val:"Тринидад",flag:true},{val:"Шпицберген",flag:false},{val:"мыс Дежнёва",flag:false},{val:"Амазонка",flag:false}];
var i:int=0;// итератор слов
// создаём 10-секундный таймер и поле отсчёта
var timer:Timer=new Timer(1000,10);
var timerField:TextField=new TextField ;
// создаём клип-контейнер
static var box:Sprite=new Sprite ;
// создаем поле ответа
var tf:TextField=new TextField ;
public function answers():void
{
//создаём каравеллу
var caravella:ship=new ship ;
caravella.x=stage.stageWidth / 2;
caravella.y=stage.stageHeight / 2;
addChild(caravella);
//добавляем листенеры к таймеру
timer.addEventListener(TimerEvent.TIMER,onTick);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete);
// Перехватываем нажатие кнопки мыши
box.addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown);
// Отпускание мышки
box.addEventListener(MouseEvent.MOUSE_UP,handleMouseUp);
//Отпускание мышки за пределами флэшки
box.addEventListener(MouseEvent.MOUSE_OUT,handleMouseUp);
//запускаем первое слово
newWord(i);
}
//собственно функция появления варианта ответа
private function newWord(i):void
{
//запускаем таймер
timer.reset();
timer.start();
//поле таймера
timerField.x=450;
timerField.text="Осталось " + timer.repeatCount + " с.";
addChild(timerField);
//заполняем и форматируем поле ответа
tf.autoSize=TextFieldAutoSize.LEFT;
tf.selectable=false;
tf.text=words[i].val;
var format:TextFormat=new TextFormat ;
format.font="Verdana";
format.size=16;
format.bold=true;
tf.setTextFormat(format);
//выводим клип и суём туда текстовое поле
box.x=10;
box.y=10;
addChild(box);
box.addChild(tf);
box.addEventListener(Event.ENTER_FRAME,efHandler);
}
//Функции Drag&Drop
private function handleMouseDown(event:MouseEvent):void
{
box.startDrag();
}
private function handleMouseUp(event:MouseEvent):void
{
box.stopDrag();
}
//функция столкновения
private function efHandler(event:Event):void
{
if (box.hitTestObject(Object(answers).caravella)) {
trace("ку-ку");
removeEventListener("enterFrame",efHandler);
}
}
//функции таймера
private function onTick(event:TimerEvent):void
{
// показывает счётчик
var t:int=event.target.repeatCount - event.target.currentCount;
timerField.text="Осталось " + t + " с.";
}
private function onTimerComplete(event:TimerEvent):void
{
//клип-контейнер и счётчик исчезают
removeChild(timerField);
box.removeChild(tf);
removeChild(box);
//если не дошли до конца, сдвигаем итератор и запускаем следующее слово
if (i < words.length - 1) {
i++;
newWord(i);
}
}
}
}
Теперь соответственно, ругань на каравеллу. Статической я её сделать не могу, так? По-всякому пробовал к ней обращаться - либо undefined, либо possibly undefined, либо, в последнем варианте (в коде выделено красненьким) Type error: hitTestObject param must not be null. Почему такой вариант - trace(caravella.parent), если добавить сразу после addChild(caravella), выводит [object answers] Просветите, пожалуйста, где я опять ошибся? |
|
|||||
|
что ж ты пишешь?)
у тебя answers документ класс, базовый, это твой рут. А каравелла это объект в руте. Из класса answers обращайся к нему просто: |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|