2009-06-22 7 views
0

J'essaie de créer un MovieClip qui sera utilisé dans d'autres projets. C'est en fait le jeu de 15 puzzles. J'ai tout fonctionné excepté comment exécuter le movieclip quand quelqu'un gagne la partie. Vérification de la victoire fonctionne donc je sais quand j'ai besoin de jouer le clip, je ne sais pas comment. Tout doit rester sous le MovieClip Puzzle. Je vais attacher le code. J'utilise la "fausse" victoire pour tester donc je n'ai pas à jouer le jeu chaque fois que je veux le tester. Je suis un vétérinaire de 40 ans de programmation COBOL, mais très nouveau pour Flash. Ce que j'ai besoin de savoir est: 1) Où mettre le win_mc 2) Comment l'appeler du gestionnaire de mousedown où je teste pour une victoire 3) Commentaires sur le codage grandement appréciés. Je veux apprendre Flash dans le bon sens.Exécution d'un MovieClip dans un autre qui est dans le scénario principal

Merci pour toute aide. 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"); 
} 
} 

Répondre

0

Eh bien, tout d'abord il ressemble à ce code est ActionScript 2 plutôt que ActionScript 3. Ceci est parfaitement bien pour faire avancer les choses a commencé, mais AS2 est fondamentalement une deadend - Adobe ne sera pas mise à jour avec nouvelles fonctionnalités.

Si vous cherchez à entrer dans Flash juste pour le plaisir, AS2 est très bien. Si vous examinez la question du point de vue de la carrière et de l'emploi, vous feriez bien de regarder AS3 aussi. Et en fait, connaître les deux peut être très précieux ces jours-ci puisqu'il y a un mélange de projets.

Maintenant, comme pour votre question!

En général, il est préférable d'éviter de placer du code ailleurs que dans le scénario principal (mieux vaut utiliser des classes externes). Lorsque le code est placé dans les éléments de l'interface graphique, il peut rendre le code difficile à trouver et difficile à déboguer (comme vous l'avez constaté!) En raison de problèmes de portée.

Le gestionnaire d'événements mouseDown est attaché à un enfant du puzzle MovieClip, et non à une chronologie. Cela signifie que ce code s'exécute dans la portée de ce clip - d'où toutes les références à _parent. Cela signifie que vous pouvez simplement ajouter le clip win_mc au clip puzzle (dans son propre calque en haut des carreaux) et le référencer avec _parent.Win_mc depuis votre gestionnaire mouseDown.

+0

Merci Branden, c'est pour le plaisir, en faisant des utils pour mon téléphone LG oser. J'ai placé le Win_mc dans Puzzle_mc avant tout sauf le calque Action. J'ai changé le code dans le gestionnaire mousedown à _parent.Win_mc.gotoAndPlay (2); (L'animateur demande en fr2) Si je mets un stop dans f1 de Win_mc, rien dans Win_mc ne marche; si je ne Win_mc pas exécute immédiatement pendant que le jeu est prêt à être joué. Il me manque quelque chose mais je ne sais pas ce que c'est. –

+0

Eh bien, l'action d'arrêt est nécessaire ici ou ailleurs pour empêcher win_mc de jouer prématurément. Sinon, il semble que vous ayez un problème de chemin relativement simple (mais vous avez du mal à diagnostiquer/réparer!). Si vous le souhaitez, vous pouvez m'envoyer la FLA et je vais jeter un coup d'œil à la structure. Vous pouvez m'envoyer un email à bhall sur le site que j'ai listé dans mon profil. –

+0

Il s'avère que c'était un problème lié à l'IDE plutôt que du code - le bit _parent était correct cependant. –

Questions connexes