views:

479

answers:

1

I am trying to create a movieclip that will be used in other projects. It is actually the 15-puzzle game. I have every thing working except how to execute the movieclip when someone wins the game. Checking for win works so I know when I need to play the clip, I just don't know how. Every thing needs to stay under the Puzzle movieclip. I will attach the code. I am using the "false" win to test so I don't have to play the game everytime I want to test it. I am a 40 year vet of COBOL programming, but VERY new to Flash. What I need to know is: 1) Where to put the win_mc 2) How to call it from the mousedown handler where I test for a win 3) Comments on coding greatly appreciated. I want to learn Flash the right way.

Thanks for any help. 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");
}
}
A: 

Well, first off it looks like this code is ActionScript 2 rather than ActionScript 3. This is perfectly fine for getting things started, but AS2 is fundamentally a deadend - Adobe won't be updating it with new features.

If you're looking to get into Flash just for fun, AS2 is fine. If you're looking into it from a career/job standpoint, you'd do well to look at AS3 as well. And actually, knowing both can be very valuable these days since there is a mix of projects out there.

Now, as for your question!

In general it is best to avoid placing code anywhere other than in the main timeline (even better is to use external classes). When code is placed within GUI elements it can make the code difficult to find and difficult to debug (as you have found!) because of scope issues.

The mouseDown event handler there is attached to a child of the puzzle movieclip, not to a timeline. That means that this code runs in the scope of that clip - hence all of the references to _parent. This means that you can simply add the win_mc clip to the puzzle clip (in it's own layer on top of the tiles) and then reference it with _parent.Win_mc from your mouseDown handler.

Branden Hall
Thanks Branden, this is for fun, making utils for my LG dare phone. I placed the Win_mc in Puzzle_mc above all except the Action layer. I changed the code in the mousedown handler to _parent.Win_mc.gotoAndPlay(2); (anim begs in fr2) If I put a stop in f1 of Win_mc, nothing in Win_mc works; if I don't Win_mc executes immediately while the game is ready to be played. I am missing something but I don't know what it is.
Well the stop action is needed either there or somewhere else to prevent the win_mc from playing prematurely. Otherwise it sounds like you have a relatively simple (but pain in the butt to diagnose/fix!) path issue. If you'd like, you're welcome to send me the FLA and I'll take a look at the structure. You can email me at bhall at the website I have listed in my profile.
Branden Hall
Turns out it was an IDE related problem rather than code - the _parent bit was correct though.
Branden Hall