Выполнение мувиклипа внутри другого, который находится в основной временной шкале - PullRequest
0 голосов
/ 22 июня 2009

Я пытаюсь создать мувиклип, который будет использоваться в других проектах. Это на самом деле игра из 15 головоломок. У меня все работает, кроме как выполнить мувиклип, когда кто-то выигрывает игру. Проверка на выигрыш работает, поэтому я знаю, когда мне нужно сыграть клип, я просто не знаю как. Каждая вещь должна оставаться под клипом Puzzle. Я приложу код. Я использую «ложный» выигрыш для тестирования, поэтому мне не нужно играть в игру каждый раз, когда я хочу ее протестировать. Я 40-летний ветеринар на языке программирования COBOL, но ОЧЕНЬ новичок во Flash. Что мне нужно знать, это: 1) Где поставить win_mc 2) Как вызвать его из обработчика mousedown, где я проверяю на победу 3) Комментарии по кодированию с благодарностью. Я хочу изучать Flash правильно.

Спасибо за любую помощь. Ray

Action Layer of "Puzzle"

    Function to initialize a new game.
//  Should include:
//      tile size
//      x Offset
//      y Offset
//      Reset any counters used to record statistics for any given game.
function initGame()
{
    _global.numMoves = 0;
    _global.hours = 0;
    _global.minutes = 0;
    _global.seconds = 0;

    var _loc1 = this;
    //
    //  Place tiles on the board in the "solved" state.
    //
    tileDist = 52;  //  Tile size
    xOffset = -16;  //  Tile x offset, controls where the left side of the tiles start.
    yOffset = 115;  //  Tile y offset, controls where the top side of the tiles start.
    _global.solutionTileName = new Array;
    _global.solutionTileX = new Array;
    _global.solutionTileY = new Array;
    SliderFrame._x = 114;
    SliderFrame._y = 245;
    //
    for (x = 1; x <= 4; x++)
    {
        for (y = 0; y <= 3; y++)
        {
            tile = x + y * 4;
            _loc1["tile" + tile]._x = xOffset + (x * tileDist);
            _loc1["tile" + tile]._y = yOffset + (y * tileDist + tileDist);
//
//      Build a solution matrix for the puzzle.
//
        _global.solutionTileName[tile] = "Tile" + tile;
        _global.solutionTileX[tile] = xOffset + (x * tileDist);
        _global.solutionTileY[tile] = yOffset + (y * tileDist + tileDist);
        //
        } // end of for
    } // end of for
    //trace(solutionTileName);
    //trace(solutionTileX);
    //trace(solutionTileY);

//
//  Randomize the tiles after placing them on the board.
//  NOTE:   According to references, about half of the initial random configurations are unsolvable.
//          This puzzle is always solvable because the shuffle algorithm starts from the "final" 
//          image and makes a series of random legal moves.
//
    for (tilenum = 0; tilenum < 100; tilenum++)
    {
        do
        {
            tile = "tile" + (random(15) + 1);
            emptySpace = findEmpty(tile);
        } while (emptySpace == "none")
        moveTile(tile, findEmpty(tile));
    } // end of for
            _global.numMoves = 0;
        this.txt = numMoves;
} // End of the function
//
//
//  Function to find an empty slot adjacent to a given tile.
//      Returns :
//          "left", "right", "above", "below", or "none"
//
function findEmpty(tile)
{
    tilex = this[tile]._x;
    tiley = this[tile]._y;
//    trace("findEmpty - Tile=" + tile + "(" + tilex + "," + tiley + ")");
//  Check for empty slot - LEFT
    if (tilex > xOffset + tileDist)
    {
        if (!tileThere((tilex - tileDist), tiley))
        {
            //trace("tile not there LEFT - (" + (tilex - tileDist) + "," + tiley + ")");
            return ("left");
        } // end if
    } // end if

//  Check for empty slot - RIGHT
    if (tilex < (xOffset + (tileDist * 4)))
    {
        if (!tileThere((tilex + tileDist), tiley))
        {
            //trace("tile not there RIGHT - (" + (tilex + tileDist) + "," + tiley + ")");
            return ("right");
        } // end if
    } // end if

//  Check for empty slot - ABOVE
    if (tiley > (yOffset + tileDist))
    {
        if (!tileThere(tilex, (tiley - tileDist)))
        {
            //trace("tile not there ABOVE - (" + tilex + "," + (tiley - tileDist) + ")");
            return ("above");
        } // end if
    } // end if

//  Check for empty slot - BELOW
    if (tiley < (yOffset + (tileDist * 4)))
    {
        if (!tileThere(tilex, (tiley + tileDist)))
        {
            //trace("tile not there BELOW - (" + tilex + "," + (tiley + tileDist) + ")");
            return ("below");
        } // end if
    } // end if
    return ("none");
} // End of the function
//
//  Function to test if there is a tile in a given slot.
//      Returns :
//          "true" or "false"
//
function tileThere(thisx, thisy)
{
    var _loc1 = this;
    var _loc2 = thisx;
    var _loc3 = thisy;
    for (i = 1; i <= 15; i++)
    {
        if (_loc1["tile" + i]._x == _loc2)
        {
            if (_loc1["tile" + i]._y == _loc3)
            {
                return (true);
            } // end if
        } // end if
    } // end of for
    return (false);
} // End of the function
//
//  Function to move a given tile left, right, up, or down depending on direction passed.
//      Returns :
//          nothing
//

function moveTile(tile, direction)
{
    var _loc1 = tile;
    var _loc2 = this;
    var _loc3 = direction;
    if (_loc3 == "above")
    {
        _loc2[_loc1]._y = _loc2[_loc1]._y - tileDist;
        _global.numMoves = _global.numMoves + 1;
        this.txt = numMoves;
        return;
    } // end if
    if (_loc3 == "below")
    {
        _loc2[_loc1]._y = _loc2[_loc1]._y + tileDist;
        _global.numMoves = _global.numMoves + 1;
        this.txt = numMoves;
        return;
    } // end if
    if (_loc3 == "left")
    {
        _loc2[_loc1]._x = _loc2[_loc1]._x - tileDist;
        _global.numMoves = _global.numMoves + 1;
        this.txt = numMoves;
        return;
    } // end if
    if (_loc3 == "right")
    {
        _loc2[_loc1]._x = _loc2[_loc1]._x + tileDist;
        _global.numMoves = _global.numMoves + 1;
        this.txt = numMoves;
    } // end if
} // End of the function
//
//
//  Function to find which tile is under the mouse when clicked.
//      Returns :
//          i   an integer indicating Tile1, Tile2,...,Tile15
//
function tileUnderMouse()
{
    var _loc1 = this;
    for (i = 1; i <= 15; i++)
    {
        if (_loc1["Tile" + i].hitTest(_xmouse, _ymouse))
        {
            return (i);
        } // end if
    } // end of for
} // End of the function
function GetElapsedTime()
{
    _global.hours;
    _global.minutes;
    _global.seconds;
    _global.elapsedTime;
    seconds = seconds + 1;
    if (seconds == 60)
        {
            minutes = minutes + 1;
            seconds = 0;
        }
    if (minutes == 60)
        {
            hours = hours + 1;
            minutes = 0;
        }
    tSeconds = seconds;
    tMinutes = minutes;
    tHours = hours;
    if (Seconds < 10)
        {
            tSeconds = "0" + tSeconds;
        }
    if (Minutes < 10)
        {
            tMinutes = "0" + tMinutes;
        }
    if (minutes < 1)
    {
        tMinutes = "00";
    }
    if (hours < 10)
        {
            tHours = "0" + tHours;
        }
    if (hours < 1)
    {
        tHours = "00";
    }
    elapsedTime = tHours + ":" + tMinutes + ":" + tSeconds;
} // End of the function
//
//  Function to test if the puzzle is solved.
//      Returns :
//          "true" or "false"
//
function isWin()
{
    var win = 1;
    for (i = 1; i <= 15; i++)
    {
        if (("Tile" + i) != solutionTileName[i])
        {
            win = 0;
        } // end if
        if (this["Tile" + i]._x != solutionTileX[i])
        {
            win = 0;
        } // end if
        if (this["Tile" + i]._y != solutionTileY[i])
        {
            win = 0;
        } // end if
    } // end of for
    if (win == 1)
    {
        return(true);
    }
        else
        {
            return(false);
        }
} // End of the function
//
//  Entry point to movie clip Puzzle_mc
//
    _global.solutionTileName = new Array;
    _global.solutionTileX = new Array;
    _global.solutionTileY = new Array;
_global.numMoves = 0;
_global.hours = 0;
_global.minutes = 0;
_global.seconds = 0;
this.elapsedTime = "00:00:00";
var intervalId;
initGame();
intervalId = setInterval(GetElapsedTime,1000);
stop ();

Layer 16 of "Puzzle"

//
//  Action Function to handle the mouse click and move the tile to the appropriate position.
//      Returns :
//          nothing
//
onClipEvent (mouseDown) 
{ 
    //tileClicked = _root.Puzzle_mc.tileUnderMouse();
    //emptySpace = _root.Puzzle_mc.findEmpty("tile" + tileClicked); 
    //_root.Puzzle_mc.moveTile("tile" + tileClicked, emptySpace);
     tileClicked = _parent.tileUnderMouse(); 
     emptySpace = _parent.findEmpty("tile" + tileClicked); 
    _parent.moveTile("tile" + tileClicked, emptySpace);

//if (this.isWin())
if (_parent.isWin())
{
    trace(this + "TRUE");
}
else
{
    Win_mc.Play(2);
    //WinSymbol.gotoAndPlay("WinSymbolL");
    //gotoAndPlay("WinSymbolL");
    trace(this + "FALSE");
}
}

1 Ответ

0 голосов
/ 22 июня 2009

Ну, во-первых, похоже, что этот код - ActionScript 2, а не ActionScript 3. Это отлично подходит для начала работы, но AS2 по сути своей слабой стороной - Adobe не будет обновлять его новыми функциями.

Если вы хотите получить удовольствие от Flash, AS2 подойдет. Если вы смотрите на это с точки зрения карьеры / работы, вам бы неплохо было взглянуть и на AS3. И на самом деле, знание того и другого может быть очень ценным в наши дни, поскольку существует множество проектов.

Теперь по вашему вопросу!

В общем, лучше избегать размещения кода где-либо, кроме основной временной шкалы (еще лучше использовать внешние классы). Когда код помещается в элементы графического интерфейса, это может затруднить его поиск и отладку (как вы уже нашли!) Из-за проблем с областью действия.

Обработчик события mouseDown подключен к дочернему элементу фрагмента ролика головоломки, а не к временной шкале. Это означает, что этот код выполняется в области этого клипа - отсюда и все ссылки на _parent. Это означает, что вы можете просто добавить клип win_mc в клип головоломки (в его собственном слое поверх плиток) и затем ссылаться на него с помощью _parent.Win_mc из вашего обработчика mouseDown.

...