Forums Développement Multimédia

Aller au contenu

Création d'un jeu avec flash

CODE

64 réponses à ce sujet

#46 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 26 August 2013 - 15:41 PM

Citation

mais pour que ça en soit une il fallait bien que tu ait les bases pour comprendre pourquoi ça rendait toute la logique plus claire

Tout a fait d'accord. Et désolé si j'ai bouleversé ton approche Mr Spi, je te laisse les rênes :)

#47 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 26 August 2013 - 15:43 PM

Citation

Bah moi ça me semble normal, tout dépend de ce que tu entend par "tout le reste", disons que apprendre à se servir des bases (syntaxe, variables, tableaux, boucles, fonctions et début de structure) me semble indispensable avant de se lancer dans quelque chose de plus élaboré (qui ne veut pas forcément dire plus complexe).

De la même manière, il me parait normal de commencer par apprendre ce qu'est un objet dans la mesure ou Tout est objet.
Cela permet de mieux comprendre - je trouve - pourquoi une chaine de caractère contient des propriété et des méthodes ; pourquoi les opérations mathématique s'écrive 'Math.monoperation' , etc...

En PHP, par exemple, c'est différent. Les classes me paraissent moins essentielle pour comprendre comment s'articule le langage car on utilise très peu d'objet. Mais en AS, tout est orienté objet et je trouve que c'est presque contre-nature de vouloir faire sans.

Parce qu'une fois qu'on a compris ce qu'était une classe, c'est facile de comprendre ce qu'est un MovieClip, un Sprite ou une Shape ; quelle relation existe entre eux.

Citation

Si on prend le bouquin de T. Imbert, les classes et la programmation orientée objet ça commence au chapitre 8, avant on a tout le reste

Il me parait logique, d'une certaine manière, qu'on aborde les bases du vocabulaire avant d'aborder les classes, mais pour moi on fait cela parce qu'on pourra réutiliser ce qui a été appris avant dans le cour sur les classes. C'est une raison davantage logistique que logique.
Ecrire des classes n'est pas plus compliqué que de tout écrire d'un bloc.

Tu peux trouver cela plus facile à apprehender, mais ce n'est qu'un point de vue - et mon point de vue ne vaut pas plus que le tien :) -

Mais tu occultes tout une partie de mon argumentation : l'utilisation de flashDevelop et son auto-complétion.
Je ne sais pas si aujourd'hui tu t'en sers ou si tu codes toujours dans l'IDE comme c'était le cas quand on s'était vu. Si tu ne t'en sers pas, il est normal que tu ne ressentes pas la plus-value, pourtant elle est énorme.
En fait, ce qui a fait que les classes ont été une révélation, c'est moins la logique des classes que l'auto-complétion de flashDevelop qui élimine 90% des fautes de frappes.

#48 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 26 August 2013 - 16:22 PM

Citation

Mais tu occultes tout une partie de mon argumentation : l'utilisation de flashDevelop et son auto-complétion

Ha non non, pas du tout, je n'y répond pas car je pense que tu as raison et il n'y a pas débat là dessus, c'est tout Image IPB

Citation

Je ne sais pas si aujourd'hui tu t'en sers ou si tu codes toujours dans l'IDE comme c'était le cas quand on s'était vu.

J'ai lâché l'IDE il y a un moment et je suis passé à FD oui, je me suis mis au classes assez tard pour ma part, j'avais pris mes habitudes et je n'y voyais pas beaucoup d'intérêt sur mes petits projets, Flash étant plus un jeu avec lequel je jouais tout seul qu'un outil de travail utilisé en équipe pour moi à cette époque. Je reconnais que l'autocomplétion est un gros plus, bien que je trouve qu'elle ait aussi ses défauts, mais c'est un autre débat.

Il ne faut pas oublier non plus que tous les langages ne sont pas orientés objets, le procédural ça a de gros défauts surtout au niveau lisibilité, longueur et maintenance du code, mais aussi des avantages, le paradigme de la conception objets n'a été introduit que bien plus tard dans l'évolution des langages comme le C++ par exemple, et de l'avis de beaucoup c'est plus abstrait et donc moins simple à saisir, bien que pas forcément plus compliqué à programmer.

Si tu veux la question ne se pose pas ici dans les termes "les classes c'est mieux ou pas ?", mais plutôt "est-ce bien le moment d'aborder les classes alors qu'il manque à l'auteur du sujet certaines bases de l'utilisation du langage ?". Le but est juste d'essayer de faire avancer pas à pas quelqu'un qui souhaite faire un jeu mais essayes d'aller trop vite (du moins à mon sens). Je ne débat pas du bien fondé de faire de la POO, j'y ai été réticent des années durant mais cette période est révolue. Ensuite question apprentissage, lorsqu'on suis des cours il va sans dire qu'on aborde rapidement la POO, mais c'est parce qu'on dispose d'un suivit sur le long terme avec l'objectif de devenir développeur, mais si on apprend sur le tas c'est moins simple et a mon sens il vaut mieux commencer en procédural puis se pencher sur l'objet dès que le projet demande une programmation plus importante et plus structurée.

Ce sera d'ailleurs la suite de ce petit thread d'entraide sur la création d'un premier jeu, lorsque la structure de base sera fonctionnelle j'aurais tendance à dire qu'à présent il faut essayer de la voir en POO, pourquoi on fait une classe "Ballon" et une classe "Collisions", et une classe "Birds", qui pilote le tout et comment les petits bout s'assemblent pour former un tout cohérent, et je pense que d'un coup les choses seront plus facile à mettre en place une fois qu'on se sera pris la tête à factoriser son code avec des fonctions et des tableaux, mais là encore ce n'est qu'un avis, je peux me tromper.

#49 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 28 August 2013 - 17:10 PM

Voir le messagedraad, le 25 August 2013 - 21:18 PM, dit :


for(i=0; i<tableau4.length; i++){
if(tir.hitTestObject(tableau4[i]))
{

if(tableau4[i] == bal17) {
nbdeballonshoot ++
TA3 = getTimer();
trace("TA3")
}
 

Ca marche, mais tu te complique la vie, imagine que tu ai 10 000 ballons, tu va devoir écrire ton test pour chaque ballon ! Si tu utilise mieu les tableau, tu pourra trouver automatiquement le bon ballon et le bon timer en fonction de ce dernier comme le conseille Mr Spi. L'interet des tableau, c'est de pouvoir conserver un ordre de classement facilement accessible si tu ne connais pas exactement l'instance que tu souhaite interroger, mais si tu la connais, tu peux aussi utiliser un Objet qui va te servir a stocker tes ballons et tes timers non plus par ordre d'apparrition, mais par clef de recherche :

Exemple, si tes ballons etendent la classe Sprite


private var tousMesBallons  : Object = {};
private var tousMesNumero :Object  = {};
private var numeroDuDernierBallonClique :int = -1;
private var pointsComboDeClic                             :int = 0;

private function creerDesBallons (nombreDeBallons:uint):void
{
        for (var i:int = 0; i < nombreDeBallons; i++)
        {
                var instanceDeBallon :Ballon = new Ballon ();
                instanceDeBallon.name = String(i);
                tousMesBallons[instanceDeBallon.name] = instanceDeBallon;
                tousMesTimer[instanceDeBallon.name]  = i;
                instanceDeBallon.addEventListener(MouseEvent.Click, clicSurUnBallon );
        }
}
private function clicSurUnBallon (e:MouseEvent):void
{
         var ballonQuiEstClique :Ballon = e.currentTarget as Ballon;
         if(tousMesNumero[ballonQuiEstClique.name] == numeroDuDernierBallonClique + 1)
         {
                 pointsComboDeClic  ++;
                 numeroDuDernierBallonClique ++;
         }
         else
         {
                pointsComboDeClic  = 0;
         }
 


Ainsi, en donnant un nom a chacun de tes ballons, tu peux te servir de ce nom pour definir une clef d'accès dans ton objet :

tousMesBallons["LeNomDeMonBallon"] = quelqueChose;

Ensuite tu peux rappeller cette clef a n'importe quel moment, et celà te rendra la valeur associé a cette clef, en l'occurence ton instance de Ballon.

trace (tousMesBallons["LeNomDeMonBallon"]);
--> quelqueChose;

Et cela t'evitera de definir un ecouteur pour chaque ballon, un seul ecouteur qui gere n'importe quelle situation !

Tu as donc un objet qui garde en mémoire tous tes ballons en utilisant pour clef leur valeur 'name' (qui doit être un String), et la meme chose pour les numeros de tes ballons.

Merci Draad,

je vais étudier ça.

#50 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 28 August 2013 - 17:20 PM

Hello,

J'ai toujours un problème pour faire pour gameOver.

Voici le code:

//END GAME


addEventListener(Event.ENTER_FRAME, gameover);

function gameover(evt:Event)
{
if (nbdebirds == 0)
{


gotoAndStop(2);
removeEventListener(Event.ENTER_FRAME, controlbird);
removeEventListener(Event.ENTER_FRAME, debuteshoot);
removeEventListener(Event.ENTER_FRAME, ballonShoot17);
}
}

L'ecran de game over s'affiche comme prévu, mais j'ai des erreurs en cascade qui s'affichent dans la console:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
TypeError: Error #2007: Parameter child must be non-null.

Je ne sais pas comment arrêter mes interpolations avec tweenMax comme ceux ci ne sont pas dans des écouteurs d’événements que je peut stopper.
(Interpolation déclencher ni par un événement enter frame, ni par un clic de souris etc...)

Bref comment stopper "net" le code ?

Merci pour les réponses

#51 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 28 August 2013 - 17:40 PM

Quand tu travailles avec du code tu dois oublier la timeline.

Tu ne peux pas "stopper" du code, tu peux stopper tous les écouteurs, et ainsi faire en sorte que le code ne s'exécute plus, mais il est toujours présent, et les objets en mémoire aussi si tu ne les as pas supprimés.

Au lieux de faire un "gotoAndStop(2)" pour afficher un game over, fait plutôt un panneau (objet) que tu viens afficher par dessus le reste avec un simple "addChild".

Généralement dans un jeu on fait une fonction à la fin qui est chargée de tout nettoyer, par exemple une fonction "gameOver" qui se charge de couper tous les écouteurs, vider la scène de tout ce qui est affiché, vider tous les objets en mémoire qu'on ne souhaite pas conserver, et afficher un panneau de fin ou une cinématique. Ce n'est pas plus compliqué que le reste, ton panneau de fin est juste un clip exporté pour AS depuis la bibliothèque, vider un tableau ça se fait en une ligne : "monTableau = []" etc...

En étant malin tu devrais même avoir une fonction "init" qui se charge de remplir et initialiser tes objets et tableaux.

#52 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 28 August 2013 - 23:28 PM

Hello Spi, et merci pour ta réponse.

OK donc je procède comme ça pour vider la scène de mes occurrences ? :


removeChild(occurence1);   //hôte l'occurrence de la liste d'affichage
occurence1 = null;               //supprime totalement l'occurrence 1 au passage du ramasse miette.
 

J'utilise TweenMax pour mes interpolation.

TweenMax.to(ballonBleu1, 15, {x: -300});

Mais si je procède ainsi j'aurai surement une erreur du style "TypeError: Error #1009: Cannot access a property or method of a null object reference." non ?

#53 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 28 August 2013 - 23:42 PM

Il existe des solutions simples pour supprimer tout ce que tu as affiché sur ta scène d'un coup, mais cela demande que tu aie bien fait les choses c'est à dire pas de frames sur ta timeline, etc....

Si j’écris ceci :


function gameover():void{

        while(numChildren>0) removeChildAt(0);

}
 


Avec ça je supprime tous les objets qui se trouvent dans la liste d'affichage de mon objet Stage, autrement dit ta scène.
Moi généralement je met ça dans la fonction "init()" comme ça ça se fait au moment où je lance le jeu et pas quand je fini (j'ajoute souvent un panneau GameOver par dessus le jeu qui tourne encore dessous mais sans que le joueur puisse jouer).

Ensuite :

occurence1 = null;

Pourquoi pas, mais est-ce vraiment utile ?
A la fin de ton jeu, le joueur a deux choix, soit il arrête de jouer (et dans ce cas il ferme la page), soit il recommence.
Or toutes les occurrences que tu crée, tu les recrée à chaque début de partie.
Donc elles sont recréées automatiquement au moment où tu relance la partie, c'est à dire réinitialisées.
Construire un jeu c'est aussi se poser les questions utiles qui vont t'éviter de te casser la tête a coder des trucs inutiles.
Quand on construit un jeu on triche souvent, on utilise des petites astuces qui nous font gagner du temps.
Là par exemple je n'y vois pas forcément un grand intérêt vu que ton jeu comprend un nombre limité d'objets toujours recréés en début de partie, donc c'est pas quelques objets restant en mémoire entre deux lancement de partie qui va gêner. Tu aurait en revanche quelques centaines voire milliers d'objets à traiter là ce ne serait pas pareil et il faudrait faire attention à toutes les ressources mémoire, mais pour ça faut maîtriser le processus de création/destruction de tous tes objets, on arrive peu à peu à l'intérêt des classes Image IPB

Citation

J'utilise TweenMax pour mes interpolation.
Si tu sait créer une Tween tu dois savoir l'arrêter Image IPB
Elle ne te renverra une erreur que si elle est en train de tourner et ne trouve plus l'objet dont elle a besoin.
Il faut donc arrêter (ou attendre qu'elle s'arrête) la tween avant de supprimer tes objets.

#54 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 28 August 2013 - 23:53 PM

Je te recommande de faire une pause dans la création de ton programme et de te faire ce tuto : http://forums.mediab...cice_-_demineur

Il n'y en a pas pour longtemps (30 minutes ou 1 h max), ce qui est intéressant c'est la construction du code.
Essayes de voir comment tu peux te simplifier la vie en ordonnant bien ton code, chaque partie a une tâche précise à faire et traite des ensembles d'objets, le tout est ordonné logiquement pour que la séquence d'actions permette au jeu de tourner en boucle indéfiniment (relancer des parties etc...).

#55 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 29 August 2013 - 00:14 AM

Citation

Je te recommande de faire une pause dans la création de ton programme et de te faire ce tuto : http://forums.mediab...cice_-_demineur

Je vais le faire merci !


Citation

Si tu sait créer une Tween tu dois savoir l'arrêter Image IPB

Hélas non ! Je suis en train d'essayer avec TimelineMax, sinon je sais pas.

Merci pour ton soutiens Spi.

#56 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 29 August 2013 - 00:22 AM

Citation

Hélas non ! Je suis en train d'essayer avec TimelineMax, sinon je sais pas.

Première chose à faire, ouvrir la notice : http://www.greensock...k/TweenMax.html
On y trouve : http://www.greensock...l#killAll%28%29

Et si tu utilise TweenLite : http://www.greensock.../TweenCore.html

Je n'utilise jamais de Tween, donc je me trompe peut-être, mais la doc est toujours ton amie.

#57 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 29 August 2013 - 00:45 AM

Voir le messageMonsieur Spi, le 29 August 2013 - 00:22 AM, dit :

Première chose à faire, ouvrir la notice : http://www.greensock...k/TweenMax.html
On y trouve : http://www.greensock...l#killAll%28%29

Et si tu utilise TweenLite : http://www.greensock.../TweenCore.html

Je n'utilise jamais de Tween, donc je me trompe peut-être, mais la doc est toujours ton amie.

Oui j'avais commencer un jeter un oeil, mais c'est une fois de plus ton aide qui est fort utile.
J'ai trouvé mon bonheur dans tes liens !
Et hop plus d'erreur #1009 ou #2007

TweenMax.killAll(false, true, true);


Encore merci et bonne nuit Spi. (je vois que tu est un couche tard aussi ^^)

#58 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 14 September 2013 - 02:06 AM

Hello,


Je voulai savoir s'il est possible d'interpoler avec Tweenmax la dernière image clé d'un clip ?

Merci.

#59 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 16 September 2013 - 12:14 PM

Salut,

Peux-tu être plus précis ?
Pourquoi passer par un Tweenmax ?
Ce que tu veux faire ne peut pas simplement se faire via un peu de code ?

#60 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 16 September 2013 - 19:37 PM

coucou :)

si je comprends ton idée : oui, mais en pensant bien à arrêter la lecture du-dit clip (stop()) ;)

… et c'est sans doute une rustine douteuse :s
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#61 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 16 September 2013 - 20:46 PM

Hello vous deux.(Hey Spi !)

Merci pour les réponses.

Ben en fait je pose la question car j'ai fait un clip qui contient quatre image et représente un personnage qui se transforme en boule de feu.
Sur la dernière image clé (qui contient un stop()) il ne reste que la boule de feu.

Ensuite je souhaite interpoler cette boule de feu de manière à ce qu'elle soit 700% plus grosse !

Ce que je fait avec le code suivant :

TweenMax.to(lightFire, 0.2, {scaleX:7, scaleY:7, x:305.95, ease:Back.easeIn, ease:Circ.easeOut});


Biensur le code crée une interpolation du clip tout entier. (Et non pas de la boule sur ma dernière image) Et donc le grossissement est décentrer car le point de transformation du clip n'est pas au centre de la boule de la dernière image.

Je rattrape ceci en ajoutant avec x:305.95

Je me suis donc demandé si on pouvais interpoler non pas le clip mais seulement la dernière image de celui ci !

#62 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 16 September 2013 - 22:43 PM

Coucou,

Pourquoi ne pas simplement mettre ton point de pivot au centre du clip? Ainsi, si tu touche au scale, ce dernier ne changera pas de place.

#63 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 19 September 2013 - 20:50 PM

Hey,

Oui Draad, ça doit être faisable de modifier mon clip en ce sens. Merci.

#64 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 28 September 2013 - 04:30 AM

Hello,


J'ai un problème.

voici le contexte:

Jusqu'ici mes occurrences étaient disposé sur la scène par glisser-déposer.

il s'agit des occurrences (de type clip qui contienne une petite animation pour certaine) "balAttaque1" etc...

Que j 'ai ajouté dans un tableau :


var stockBalls:Array = [];  //tableau pour stocker les ballons

//ajoute les ballons dans le tableau.

stockBalls.push(balAttaque1);      
stockBalls.push(balAttaque2);
stockBalls.push(balAttaque3);


Puis : (dans un evenement ENTER_FRAME)


function testCollisionsBirds():void{
        for(i=0; i<stockBalls.length; i++){
                if(stockBalls[i].hitTestObject(controlbird1)) {
                        removeChild(stockBalls[i]);
                       stockBalls.splice(i,1);  //pour effacer les balls du tableau
                        trace("ballon détruit");
                }


        }



Le code marchait bien jusqu'à ce que je décide de supprimez les occurrences sur la scène et de les importer
dynamiquement sur la scène avec du code:



var balAttaque1:BallonBleu = new BallonBleu();
addChild(balAttaque1);
balAttaque1.x = 374,20;
balAttaque1.y = -97,25;

var balAttaque3:BallonJaune = new BallonJaune();
addChild(balAttaque3);
balAttaque3.x = 1211,70;
balAttaque3.y = 616,90;

 

Et maintenant j'ai une erreur :

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()


Que faire ?

Merci

#65 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 28 September 2013 - 04:54 AM

EDIT: Problème résolu !



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)