Я не новичок во flash, но я немного новичок в ActionScript, пытаюсь создать приложение во flash pro (или, скорее, анимировать cc), которое (надеюсь) научит пользователей теории музыки (как читать музыку , и т.д.). Я хочу иметь разные уроки на разных фреймах, с отдельными «экранами», по которым пользователь может пролистывать. Я использую несколько копий кода пролистывания, который Adobe предоставляет в своем шаблоне галереи прокрутки.
В кадре 5 я использую следующее:
stop()
Multitouch.inputMode = MultitouchInputMode.GESTURE;
var currentGalleryItem:Number = 1;
var totalGalleryItems:Number = 10;
stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB);
function fl_SwipeToGoToNextPreviousFrameB(event:TransformGestureEvent):void
{
if(event.offsetX == 1)
{
if(currentGalleryItem > 1){
currentGalleryItem--;
slideRight();
}
}
else if(event.offsetX == -1)
{
if(currentGalleryItem < totalGalleryItems){
currentGalleryItem++;
slideLeft();
}
}
}
var slideCounter:Number = 0;
function slideLeft(){
lsn112.addEventListener("enterFrame", moveGalleryLeft);
}
function slideRight(){
lsn112.addEventListener("enterFrame", moveGalleryRight);
}
function moveGalleryLeft(evt:Event){
lsn112.x -= 128;
slideCounter++;
if(slideCounter == 10){
lsn112.removeEventListener("enterFrame", moveGalleryLeft);
slideCounter = 0;
}
}
function moveGalleryRight(evt:Event){
lsn112.x += 128;
slideCounter++;
if(slideCounter == 10){
lsn112.removeEventListener("enterFrame", moveGalleryRight);
slideCounter = 0;
}
}
Home112.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame_22);
function fl_ClickToGoToAndStopAtFrame_22(event:MouseEvent):void
{
gotoAndStop(2);
}
stop()
Кадр 6 практически идентичен, только с разными именами переменных, функций и т. Д .:
stop()
Multitouch.inputMode = MultitouchInputMode.GESTURE;
var currentGalleryItemA:Number = 1;
var totalGalleryItemsA:Number = 11;
stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA);
function fl_SwipeToGoToNextPreviousFrameA(event:TransformGestureEvent):void
{
if(event.offsetX == 1)
{
if(currentGalleryItemA > 1){
currentGalleryItemA--;
slideRightA();
}
}
else if(event.offsetX == -1)
{
if(currentGalleryItemA < totalGalleryItemsA){
currentGalleryItemA++;
slideLeftA();
}
}
}
var slideCounterA:Number = 0;
function slideLeftA(){
lsn113.addEventListener("enterFrame", moveGalleryLeftA);
}
function slideRightA(){
lsn113.addEventListener("enterFrame", moveGalleryRightA);
}
function moveGalleryLeftA(evt:Event){
lsn113.x -= 128;
slideCounterA++;
if(slideCounterA == 10){
lsn113.removeEventListener("enterFrame", moveGalleryLeftA);
slideCounterA = 0;
}
}
function moveGalleryRightA(evt:Event){
lsn113.x += 128;
slideCounterA++;
if(slideCounterA == 10){
lsn113.removeEventListener("enterFrame", moveGalleryRightA);
slideCounterA = 0;
}
}
Home113.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame_23);
function fl_ClickToGoToAndStopAtFrame_23(event:MouseEvent):void
{
gotoAndStop(2);
}
stop()
Также есть кнопка как часть фрагмента ролика «lsn112», который пролистывается. Не знаю, актуально это или нет, но код такой:
stop();
fwdtest.addEventListener(MouseEvent.CLICK, GoRootNext112);
function GoRootNext112(event:MouseEvent):void
{
MovieClip(root).nextFrame();
}
В какой-то момент он работает нормально, но я думаю, что прослушиватель событий не удаляется должным образом. Когда пользователь пролистывает галерею, все работает как положено. Затем они могут перейти к следующей галерее, которая также работает должным образом. Пока ошибок нет. Однако, если они затем вернутся в меню, а затем обратно в галерею, я получаю код ошибки 1009:
TypeError: ошибка № 1009: невозможно получить доступ к свойству или методу ссылки на нулевой объект. в MusicTheorySwipe_fla :: MainTimeline / slideRightA () [MusicTheorySwipe_fla.MainTimeline :: frame6: 32] в MusicTheorySwipe_fla :: MainTimeline / fl_SwipeToGoToNextPreviousFrameA () [MusicTheorySwipe_flaureEventFrameA () [MusicTheorySwipe_flaureEvent] (симуляция MusicTheorySwipe_flaure.MainTimes) в время выполнения: фреймSwipe_flaureEvent :: фреймEndtime_flaureEvent :: FrameSwipe_flaureSimulation: 167 : SimulatedContentPlayer / clientSocketDataHandler ()
Что меня смущает, так это то, что я использую кадр 5 в этот момент, но я получаю сообщение об ошибке, ссылаясь на кадр 6. Мне кажется, что flash пытается отправить жест в обработчик событий в кадре 6, хотя я нахожусь на кадре 5 , что, как я предполагаю, связано с тем, что прослушиватель событий не удаляется. Однако, будучи новичком в коде, я не знаю, когда удалить прослушиватель событий без нарушения кода.
Вот ссылка на zip-архив, содержащий соответствующие файлы .fla, .swf и .xml. http://speedy.sh/5JP7c/MusicTheorySwipe.zip
Поскольку это метод, который я хотел бы использовать для многих, многих кадров, я был бы очень признателен за ваше время и помощь в решении этой проблемы.
ИЗМЕНИТЬ
Хорошо, я максимально упростил код, чтобы попытаться устранить всех подозреваемых.
Кадр 5:
Multitouch.inputMode = MultitouchInputMode.GESTURE;
stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE , onSwipeA);
var currentGalleryItemA:Number = 1;
var totalGalleryItemsA:Number = 5;
function onSwipeA (e:TransformGestureEvent):void{
//User swiped towards right
if (e.offsetX == 1) {
if(currentGalleryItemA > 1){
currentGalleryItemA--;
lsn113.x += 1280;
}
}
//User swiped towards left
if (e.offsetX == -1) {
if(currentGalleryItemA < totalGalleryItemsA){
currentGalleryItemA++;
lsn113.x -= 1280;
if(currentGalleryItemA == totalGalleryItemsA){
nextFrame()
}
}
}
}
stop();
Кадр 6:
stage.removeEventListener(TransformGestureEvent.GESTURE_SWIPE , onSwipeA);
Multitouch.inputMode = MultitouchInputMode.GESTURE;
stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE , onSwipeB);
var currentGalleryItemB:Number = 1;
var totalGalleryItemsB:Number = 11;
function onSwipeB (e:TransformGestureEvent):void{
//User swiped towards right
if (e.offsetX == 1) {
if(currentGalleryItemB > 1){
currentGalleryItemB--;
lsn112.x += 1280;
}
}
//User swiped towards left
if (e.offsetX == -1) {
if(currentGalleryItemB < totalGalleryItemsB){
currentGalleryItemB++;
lsn112.x -= 1280;
}
if(currentGalleryItemB == totalGalleryItemsB){
nextFrame()
}
}
}
stop();
И это все, что есть в ActionScript, но он все еще не работает. Любые идеи?