2010-03-25 23 views
0

Je fais un jeu de combat en Flash et pendant que j'ai tout en marche, il me manque quelque chose: un écran de victoire/perte. Logiquement, je sais comment le faire:EventDispatcher entre un as et un fla?

if character.hp < 0 
{ 
    character.dead = true; 
    dispatchevent("death", event) 
} 

Mon problème est que je n'ai aucune idée de la façon de le coder. Je sais que je vais utiliser deux classes et mes deux fichiers .fla (sauf si je me trompe).

J'ai deux fichiers .fla qui sont en jeu ici: le fichier Menu.fla et le fichier Arena.fla. Menu.fla contient la navigation complète du jeu, les options, les écrans de sélection de personnage, etc. et quand il est temps pour le joueur de s'engager dans la bataille, il charge le fichier Arena.fla, qui contient seulement les arrière-plans (en fonction de l'étape sélectionnée) et maintenant est fixé à une longueur d'une seule trame. Pour Arena.fla, l'action réelle se passe dans mes classes, mais logiquement, je n'aurais besoin que de HP.as et Character.as.

En Character.as, je l'ai déclaré la variable suivante:

var isDead:Boolean = false; //is character dead? 

En HP.as, croire que je devrais avoir les éléments suivants:

if(currentHp<0) 
{ 
    currentHp = 0; 
    character.isDead = true;  //declared as var `character:Object;` 
    EventDispatcher.dispatchEventListener("playerDead", playerDead); 
} 

Et enfin, dans Arena.fla, je veux être en mesure de détecter l'eventlistener mentionné ci-dessus et passer simplement à une deuxième image qui affichera un message dans le style de "PLAYER ONE A WON" ou "PLAYER ONE HOST" avec un bouton qui me permettra de revenir au caractère sélecti À l'écran. C'est la première partie dans laquelle je suis bloqué: comment détecter l'écouteur d'événement distribué dans mon fichier .fla principal? Deuxièmement, si le joueur clique sur le bouton "CONTINUER", qui affiche indépendamment du fait que le joueur a gagné ou perdu, comment mon Menu.fla (qui charge le Arena.swf) détecte-t-il cet événement de clic, décharge-t-il le jeu et retourne-t-il? à l'écran de sélection de personnage?

Merci d'avance de m'avoir aidé. Je réalise que c'est beaucoup de texte mais c'est le plus descriptif que je puisse être. Si vous avez des questions ou besoin d'éclaircissements concernant ma question, n'hésitez pas à prendre la parole.

-Christopher

Répondre

0

Merci à tous pour votre aide, mais j'ai compris. Il s'avère que ma méthode était beaucoup trop compliquée pour ce que je voulais faire, et pour le temps qu'il me restait. Je vais vous expliquer comment je l'ai fait. Au lieu d'utiliser un EventDispatcher comme je le pensais, j'ai utilisé un SharedObject, qui faisait tout simplement fonctionner comme par magie.

Un SharedObject est accessible depuis n'importe quel endroit de l'application/du jeu, à condition qu'il y soit référé correctement. Donc j'ai simplement créé un SharedObject appelé "winLossData" réglé sur "NO WINNERS" dans mon écran de sélection de personnage. Ce cookie n'est jamais enregistré ni écrit sur le disque, donc il n'y a aucune chance pour l'utilisateur de le trouver (en général).

J'ai décidé d'utiliser la classe Movement.as qui contient tous mes contrôles et j'ai écrit un écouteur d'événement de type Event.ENTER_FRAME qui vérifie constamment l'état de santé de mes personnages. Si l'un d'entre eux est inférieur à 100, mon SharedObject prend immédiatement pour valeur "PLAYER ONE" ou "PLAYER TWO", en fonction de qui a gagné (c'est-à-dire dont les points de santé sont pas de moins de 100). Par la suite, juste pour précaution, réinitialiser les points de santé de caractère perdre à 100. Voici le code:

function whoWon(event:Event):void 
    { 
     if(playerSpriteBar.getPower() <= 0) 
     { 
      winner.data.winner = "Player Two"; 
      playerSpriteBar.update(100); 
     } 
     if(playerAIBar.getPower() <= 0) 
     { 
      winner.data.winner = "Player One"; 
      playerAIBar.update(100); 
     } 
    } 

Dans mon Menu.fla, j'ai un autre écouteur d'événement de type Event.ENTER_FRAME qui attend le cookie pour changer la valeur. Dès que le cookie change de valeur, Menu.fla décharge automatiquement le fichier SWF externe (dans notre cas, Arena.swf) et affiche les résultats, en fonction du reçu. Le reste des actions se passe dans le fichier Menu.fla, donc pas besoin de codage supplémentaire.

Encore une fois, merci à tous pour votre aide.

1

Je ne suis pas sûr du code que vous devez lire le HP, mais savez-vous que character.dead devient réellement vrai?

Vous pouvez toujours appeler la fonction Arena.swf dans le fichier HP.as pour terminer le jeu et déclarer un gagnant. Vous pouvez ajouter un second cadre à Arena.swf contenant un arrière-plan grisé et un texte WINNER ou LOSER. '

En général, le moyen le plus simple pour une classe définie par l'utilisateur d'acquérir des fonctionnalités de répartition d'événements consiste à étendre EventDispatcher. Si cela est impossible (c'est-à-dire si la classe étend déjà une autre classe), vous pouvez implémenter l'interface IEventDispatcher, créer un membre EventDispatcher et écrire des hooks simples pour acheminer les appels dans EventDispatcher agrégé.

activer Distribué lorsque Flash Player ou gains application AIR mise au point du système d'exploitation et devient actif.

désactivent Distribué lorsque Flash Player ou une application AIR perd le focus du système et devient inactif.

Event dispatcher

+0

Merci de votre aide, cela m'a mis dans la bonne direction. –