Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   создание тестов (http://www.flasher.ru/forum/showthread.php?t=214631)

ilmira 19.10.2017 16:23

создание тестов
 
здравствуйте! я создаю мобильное приложение, в котором будет раздел тестирования.
есть 4 темы тестов, в каждой по 95 вопросов. раньше я вставляла вопросы и ответы и на каждой кнопке писала код :o. это было на actionscript 2.0. а сейчас у меня actionscript3.0. и очень много вопросов с ответами :eek: подскажите пожалуйста, как можно сделать? с чего начать? я в голове представляю вот такое действие:
- текстовый файл тестов будет выглядеть так:
$$$1. Первая буква алфавита?
A) a*
B) h
C) p
D) s
E) f
$$$2. Вторая буква алфавита?
A) a
B) h
C) б*
D) s
E) f

- нужно загружать вопросы в массив, а ответов другой массив или вместе с вопросом?
- на одном кадре будут отображаться textfieldы вопросов и ответы на checkbox будут или лучше кнопками?
- после нажатия или выбора какого то ответа, все удаляется и появляются новые вопрос-ответы.

я пробывала загружать из xml
но там приходилось создавать столько переменных, сколько вопров существуют. как можно сделать так, чтобы они все в массив загружались и автоматически выходили?

я новичок еще) помогите пожалуйста, в каком направлении мне идти?
Код AS3:

stop();
var xmlLoader:URLLoader = new URLLoader(new URLRequest("voprosy.xml"));
var xmlData:XML;
xmlLoader.addEventListener(Event.COMPLETE, getXML);
 
var xmlLoader1:URLLoader = new URLLoader(new URLRequest("otvety.xml"));
var xmlData1:XML;
xmlLoader1.addEventListener(Event.COMPLETE, getXML1);
 
var vopros1:TextField = new TextField();
vopros1.autoSize = TextFieldAutoSize.LEFT
vopros1.selectable = false
vopros1.x = 50
vopros1.y = 80
addChild(vopros1)
 
var vopros2:TextField = new TextField();
vopros2.autoSize = TextFieldAutoSize.LEFT
vopros2.selectable = false
vopros2.x = 50
vopros2.y = 130
addChild(vopros2)
 
var otvet1:TextField = new TextField();
otvet1.autoSize = TextFieldAutoSize.LEFT
otvet1.selectable = false
otvet1.x = 50
otvet1.y = 180
addChild(otvet1)
 
function getXML(e:Event):void
{
  trace("XML загружен");
  xmlData = XML(e.target.data)
  trace(xmlData);
  trace(xmlData.children()[0]);
 
  vopros1.text = (xmlData.vopros1);
  vopros2.text = (xmlData.vopros2);
 
}
 
function getXML1(e:Event):void
{
  trace("XML загружен");
  xmlData1 = XML(e.target.data)
  trace(xmlData1);
  trace(xmlData1.children()[0]);
 
  otvet1.text = (xmlData.otvet1);
}


ZackMercury 19.10.2017 22:02

Попробуйте почитать книгу ActionScript 3.0 для Flash. Подробное руководство

Старайтесь ставить точку с запятой в конце каждой строчки, иначе однажды это может вызвать некоторые проблемы.


Что бы я сделал:
Класс Exercise - упражнение, в котором будет храниться вопрос, варианты ответа и какой из них правильный и информацию о том, пройден ли тест и какой вариант выбран.
Массив объектов Exercise, данные вытаскиваем из XML.
Далее пример постраничного прохождения теста
Сделаем во флеше заготовку "формы" теста, и напишем класс, который будет отвечать за ответ на действия теста. Когда тест пройден, посылаем событие, что текущий тест пройден.
Создаём массив форм тестов и отображаем на экране, ассоциируя при этом каждую форму с одним объектом Exercise
Ловим событие окончания из главного приложения и проверяем, не все ли тесты выполнены. Если все, то делаем что нам нужно, например, анимацию, меняем ассоциацию у всех форм тестов на новые объекты Exercise из массива упражнений, загруженных из XML, и снова ждём, пока они все будут пройдены, и так, пока все тесты не будут выполнены.

P.S. Не пишите код в кадрах, если хотите научиться программировать. Начинайте читать книгу выше и пишите в классах.

ilmira 20.10.2017 15:55

Цитата:

Сообщение от ZackMercury (Сообщение 1202494)
Попробуйте почитать книгу ActionScript 3.0 для Flash. Подробное руководство

Старайтесь ставить точку с запятой в конце каждой строчки, иначе однажды это может вызвать некоторые проблемы.


Что бы я сделал:
Класс Exercise - упражнение, в котором будет храниться вопрос, варианты ответа и какой из них правильный и информацию о том, пройден ли тест и какой вариант выбран.
Массив объектов Exercise, данные вытаскиваем из XML.
Далее пример постраничного прохождения теста
Сделаем во флеше заготовку "формы" теста, и напишем класс, который будет отвечать за ответ на действия теста. Когда тест пройден, посылаем событие, что текущий тест пройден.
Создаём массив форм тестов и отображаем на экране, ассоциируя при этом каждую форму с одним объектом Exercise
Ловим событие окончания из главного приложения и проверяем, не все ли тесты выполнены. Если все, то делаем что нам нужно, например, анимацию, меняем ассоциацию у всех форм тестов на новые объекты Exercise из массива упражнений, загруженных из XML, и снова ждём, пока они все будут пройдены, и так, пока все тесты не будут выполнены.

P.S. Не пишите код в кадрах, если хотите научиться программировать. Начинайте читать книгу выше и пишите в классах.

ок спасибо большое! а форма - это один кадр? или нужно все таки 95 кадров?

ZackMercury 20.10.2017 16:59

Ну, это как пример. Можно во флеше вообще ничего не делать, всё кодом сгенерировать.
Просто упомянул, что есть и такая практика, делать UI во флеше.

Если вы собираетесь учить AS3, то забудьте про кадры вообще. Да и про флеш забудьте, попытайтесь впитать как можно больше из вышеупомянутой книги.

undefined 20.10.2017 17:42

Цитата:

Да и про флеш забудьте
Ага,новичку ui кодом рисовать.Уж лучше сразу сказать бросай это дело.

ZackMercury 20.10.2017 17:48

Не, сделать это проще UI-библиотеками.
Но сначала книгу почитайте хотя-бы до главы 12.
Хотя знаешь, что? Я с этого начинал, вроде ничего сложного.

Партизан 20.10.2017 19:18

Вложений: 1
Сложно объяснить :) накидал для примера как можно сделать простой тест. Правда накидал в Animate, не знаю есть он у вас или нет. :(

Код, на всякий случай: на сцене нужно создать
TextField (qtxt)
5 RadioButton (a0,a1,a2,a3,a4)
Button (next)
RadioButton (aHidden)
Код AS3:

import flash.events.MouseEvent;
import flash.events.Event;
import fl.controls.RadioButton;
import fl.controls.RadioButtonGroup;
 
stop();
 
// XML с вопросами
var xml:XML = <data>
<q id="0" text="why?">
        <answer text="1"/>
        <answer text="2"/>
        <answer text="3" right="1"/>
        <answer text="4"/>
        <answer text="5"/>
</q>
<q id="1" text="what?">
        <answer text="1"/>
        <answer text="2"/>
        <answer text="3" right="1"/>
        <answer text="4"/>
        <answer text="5"/>
</q>
</data>;
 
var curQ:int = 0; // текущий вопрос
 
var qLen:int = xml.q.length() //количество вопросов
 
var selA:String; // Выбранный ответ
 
next.enabled = false; //отключаем кнопку следующего вопроса пока не ответим на вопрос
 
 
var ansGroup:RadioButtonGroup = new RadioButtonGroup('answers');
ansGroup.addEventListener(Event.CHANGE,onSelect);// событие выбора ответа
 
aHidden.group = ansGroup; //скрытый RadioButton для сброса ответов
 
for(var i:int=0; i<5;i++){
        var a:RadioButton = this['a'+i] as RadioButton;
        a.group = ansGroup; // Включаем RB в группу
 
}
 
function onSelect(e:Event):void{
        // ответ выбран
 
 
        selA = ansGroup.selection.label; // Получаем строку ответа
        next.enabled = true; // Теперь можно включить кнопку следующего вопроса
 
}
 
function setQ(id:int):void{
        // здесь мы задаем строки текстовым полям и RB ответов из XML
        qtxt.text = String(xml.q.(@id==id).@text);
        a0.label = String(xml.q.(@id==id).answer[0].@text)
        a1.label = String(xml.q.(@id==id).answer[1].@text)
        a2.label = String(xml.q.(@id==id).answer[2].@text)
        a3.label = String(xml.q.(@id==id).answer[3].@text)
        a4.label = String(xml.q.(@id==id).answer[4].@text)
}
 
next.addEventListener(MouseEvent.CLICK,nextQ);
function nextQ(e:MouseEvent):void{
 
        trace("На вопрос:",xml.q.(@id==curQ).@text,"\nВыбран ответ:",selA)
        ansGroup.selection.selected=false;
 
        curQ++; // увеличиваем индекс вопроса
 
        // Если индекс больше чем вопросов, переходим к первому вопросу
        if(curQ==qLen){
                curQ=0;
                }
 
        // Обновляем интерфейс следующим вопросом       
        setQ(curQ);
 
        // Снова отключаем кнопку до ответа на вопрос
        next.enabled = false;
 
        // сбрасываем выбранный ответ       
        ansGroup.selection = aHidden;
}
 
// Задаем первый вопрос
setQ(0);


ilmira 21.10.2017 09:34

Цитата:

Сообщение от Партизан (Сообщение 1202508)
Сложно объяснить :) накидал для примера как можно сделать простой тест. Правда накидал в Animate, не знаю есть он у вас или нет. :(

Код, на всякий случай: на сцене нужно создать
TextField (qtxt)
5 RadioButton (a0,a1,a2,a3,a4)
Button (next)
RadioButton (aHidden)
Код AS3:

import flash.events.MouseEvent;
import flash.events.Event;
import fl.controls.RadioButton;
import fl.controls.RadioButtonGroup;
 
stop();
 
// XML с вопросами
var xml:XML = <data>
<q id="0" text="why?">
        <answer text="1"/>
        <answer text="2"/>
        <answer text="3" right="1"/>
        <answer text="4"/>
        <answer text="5"/>
</q>
<q id="1" text="what?">
        <answer text="1"/>
        <answer text="2"/>
        <answer text="3" right="1"/>
        <answer text="4"/>
        <answer text="5"/>
</q>
</data>;
 
var curQ:int = 0; // текущий вопрос
 
var qLen:int = xml.q.length() //количество вопросов
 
var selA:String; // Выбранный ответ
 
next.enabled = false; //отключаем кнопку следующего вопроса пока не ответим на вопрос
 
 
var ansGroup:RadioButtonGroup = new RadioButtonGroup('answers');
ansGroup.addEventListener(Event.CHANGE,onSelect);// событие выбора ответа
 
aHidden.group = ansGroup; //скрытый RadioButton для сброса ответов
 
for(var i:int=0; i<5;i++){
        var a:RadioButton = this['a'+i] as RadioButton;
        a.group = ansGroup; // Включаем RB в группу
 
}
 
function onSelect(e:Event):void{
        // ответ выбран
 
 
        selA = ansGroup.selection.label; // Получаем строку ответа
        next.enabled = true; // Теперь можно включить кнопку следующего вопроса
 
}
 
function setQ(id:int):void{
        // здесь мы задаем строки текстовым полям и RB ответов из XML
        qtxt.text = String(xml.q.(@id==id).@text);
        a0.label = String(xml.q.(@id==id).answer[0].@text)
        a1.label = String(xml.q.(@id==id).answer[1].@text)
        a2.label = String(xml.q.(@id==id).answer[2].@text)
        a3.label = String(xml.q.(@id==id).answer[3].@text)
        a4.label = String(xml.q.(@id==id).answer[4].@text)
}
 
next.addEventListener(MouseEvent.CLICK,nextQ);
function nextQ(e:MouseEvent):void{
 
        trace("На вопрос:",xml.q.(@id==curQ).@text,"\nВыбран ответ:",selA)
        ansGroup.selection.selected=false;
 
        curQ++; // увеличиваем индекс вопроса
 
        // Если индекс больше чем вопросов, переходим к первому вопросу
        if(curQ==qLen){
                curQ=0;
                }
 
        // Обновляем интерфейс следующим вопросом       
        setQ(curQ);
 
        // Снова отключаем кнопку до ответа на вопрос
        next.enabled = false;
 
        // сбрасываем выбранный ответ       
        ansGroup.selection = aHidden;
}
 
// Задаем первый вопрос
setQ(0);


спасибо Вам огромное))))

Добавлено через 1 минуту
Цитата:

Сообщение от ZackMercury (Сообщение 1202504)
Не, сделать это проще UI-библиотеками.
Но сначала книгу почитайте хотя-бы до главы 12.
Хотя знаешь, что? Я с этого начинал, вроде ничего сложного.

книгу начала читать, спасибо за совет) а то в интернете всегда выходят справочные материалы, и нет начала и конца, а тут начну с самого начала изучать


Часовой пояс GMT +4, время: 06:13.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.