Ajoutez de la profondeur à votre jeu avec le défilement parallèle

Deux fois par mois, nous revoyons certains des articles préférés de nos lecteurs dans l’histoire d’Activetuts +. Ce tutoriel a été publié pour la première fois en octobre 2009 (et a amené Michael à être invité à devenir Activetuts + Tech Editor!)

C'est une technique très simple que vous pouvez utiliser pour ajouter une illusion de profondeur à n'importe quel jeu à défilement horizontal. Pendant que j'explique comment cela est réalisé, nous allons également examiner la possibilité de créer des arrière-plans se répétant à l'infini..


introduction

Vous pouvez voir la base défilement parallaxe effet au travail dans la démo. En ajustant les vitesses de défilement de certains objets, il est possible de modifier leur proximité ou leur éloignement..

Ce tutoriel expliquera comment coder l'effet et comment faire en sorte que la caméra du jeu semble suivre la voiture. Enfin, il expliquera comment créer des arrière-plans se répétant à l'infini, comme dans Scooby Doo.


Étape 1: La configuration

Si vous utilisez Flash, créez un nouveau fichier Flash ActionScript 3.0. Définissez la taille de la scène comme vous le souhaitez. J'ai choisi le défaut 550 par 400 pixels.

Si vous n'utilisez pas l'IDE Flash, ne vous inquiétez pas. Il suffit de créer un nouveau projet AS3. Le fichier zip contient un fichier SWC avec tous mes graphiques, vous pouvez donc les utiliser simplement en les ajoutant à votre bibliothèque. Ignore toutes les étapes du dessin si tu le fais.

Si vous sont en utilisant l'IDE Flash mais vous ne voulez rien dessiner, le zip contient également un fichier FLA contenant tous mes MovieClips :)


Étape 2: dessiner une voiture

Créez un nouveau symbole MovieClip et dessinez une voiture. Vous pouvez l'animer si vous le souhaitez. Voilà le mien:

Essayez de centrer la voiture de sorte que son point d’immatriculation (la petite croix) soit à peu près à mi-chemin. Cela permettra à la caméra de le suivre plus tard..


Étape 3: Exportez votre voiture pour ActionScript

Cliquez avec le bouton droit sur le symbole de votre voiture dans la bibliothèque et sélectionnez Propriétés:

Donnez une classe à votre voiture (Voiture va faire) et vérifier la Exporter pour ActionScript boîte (cela nous permet d'accéder à la voiture en utilisant le code). Aussi, vérifiez la Exporter en première image box (sinon, il faudra faire un préchargement).


Étape 4: tracez une route

Créez un autre nouveau symbole, mais cette fois dessinez une route:

Faites-le plus large que la scène, mais contrairement à la voiture, alignez le point d'alignement avec le bord gauche de la route. Cela aidera plus tard, lorsque nous aurons besoin de le transformer en un motif répétitif.

Comme pour la voiture, donnez une classe à la route, exportez-la pour ActionScript et exportez-la dans la première image..


Étape 5: Créer la classe de document

Créez un nouveau fichier AS et collez-y le code suivant:

 package import flash.display.MovieClip; Classe publique ParallaxDemo étend MovieClip fonction publique ParallaxDemo () 

Enregistrer ceci sous ParallaxDemo.as, dans le même dossier que votre fichier FLA (ou votre projet, si vous n'utilisez pas l'EDI).

Si vous utilisez l'EDI, assurez-vous de définir ceci comme classe de document dans le panneau de propriétés de votre document:

Vous ne savez pas ce que nous faisons ici? Découvrez mon petit conseil sur l'utilisation d'une classe de document.


Étape 6: Configurer la voiture et la route

Créez de nouvelles instances de votre voiture et de votre route dans le fichier AS: (lignes 6, 7, 11, 12)

 package import flash.display.MovieClip; public class ParallaxDemo étend MovieClip public var car: Car; route publique var: route; fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); 

Étape 7: Positionnez la voiture et la route

Si vous utilisez mes graphiques, vous pouvez simplement copier le code suivant (lignes 14-17):

 package import flash.display.MovieClip; public class ParallaxDemo étend MovieClip public var car: Car; route publique var: route; fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); car.x = 275,0; car.y = 235,0; route.x = 0,0; road.y = 294,0; 

Sinon, vous devrez déterminer où placer votre voiture et votre route au départ. Créez un nouveau calque dans la timeline de votre FLA, puis transformez-le en calque guide en cliquant dessus avec le bouton droit de la souris et en sélectionnant Guider. Flash ignorera tout ce que vous ferez dans cette couche lorsqu'il créera un fichier SWF. Alors, faites glisser votre voiture et les symboles de route ici..

Assurez-vous que le bord gauche de votre route est aligné sur le bord gauche de la scène et que la voiture est à peu près au centre (horizontalement). Puis ajustez-les pour qu'ils s'emboîtent l'un dans l'autre:

Maintenant, prenez mon code ci-dessus et ajustez-le pour qu'il corresponde aux coordonnées x et y de votre voiture et de votre route. En cliquant sur votre voiture ou sur votre route, vous pourrez voir ces valeurs dans le panneau Propriétés..


Étape 8: Ajoutez vos symboles sur la scène

Si vous testez votre film maintenant, vous ne verrez rien. Nous devons ajouterChild () la voiture et la route à la scène:

 fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); car.x = 275,0; car.y = 235,0; route.x = 0,0; road.y = 294,0; stage.addChild (route); stage.addChild (voiture); 

(Assurez-vous d'ajouter la route en premier, sinon la voiture sera recouverte!)

Testez votre film maintenant, et il devrait ressembler à ceci:


Génial! Bon, d'accord, ce n'est pas encore spectaculaire. Mais maintenant que la configuration est terminée, nous pouvons rendre cela plus intéressant. Pour commencer, faisons bouger cette voiture?


Étape 9: Ajouter un écouteur d'événement ENTER_FRAME

Modifiez votre classe de document pour ajouter un écouteur d’événement à déclencher sur chaque image: (lignes 4, 23, 26-29)

 package import flash.display.MovieClip; import flash.events.Event; public class ParallaxDemo étend MovieClip public var car: Car; route publique var: route; fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); car.x = 275,0; car.y = 235,0; route.x = 0,0; road.y = 294,0; stage.addChild (route); stage.addChild (voiture); addEventListener (Event.ENTER_FRAME, onEnterFrame);  fonction publique onEnterFrame (evt: Event): void 

Si vous avez conservé la cadence par défaut de 12 images par seconde, la fonction onEnterFrame () sera appelée tous les 1 / 12ème de seconde..


Étape 10: déplacez cette voiture!

Si nous continuons à augmenter la position x de la voiture?

 fonction publique onEnterFrame (evt: Event): void car.x = car.x + 10; // Si vous êtes prêt à relever un défi, essayez d'ajouter // des commandes de base du clavier pour permettre au joueur d'accélérer // et de décélérer. 

? on peut faire avancer la voiture?

? juste au bord de l'écran!


Étape 11: suivez cette voiture!

C'est loin d'être idéal. Après quelques secondes, nous ne pouvons même plus voir la voiture. Faisons en sorte que la "caméra" semble suivre la voiture.

Qu'est-ce que cela veut dire exactement? Eh bien, fondamentalement, nous avons besoin de la voiture pour rester au même endroit, alors que la route semble reculer.

Cela signifie que nous pourrait faire quelque chose comme ça:

 fonction publique onEnterFrame (evt: Event): void road.x = road.x - 10; 

? mais cela ne ferait que compliquer les choses plus tard. Par exemple, imaginons si nous voulions ajouter d’autres voitures à la route, des bonus, des marées noires, etc. il faudrait déplacer chacun d'entre eux à l'envers dans la fonction onEnterFrame ().

Non, il existe une technique beaucoup plus simple que nous pouvons utiliser. Au lieu d’ajouterChild () - la voiture et la route à la scène, nous créons un nouvel objet, addChild () leur, puis nous nous déplaçons ce objet en arrière dans la fonction onEnterFrame ().

Cela semble plus compliqué que ça. Laissez-moi vous montrer le code actuel:

 package import flash.display.MovieClip; import flash.events.Event; public class ParallaxDemo étend MovieClip public var car: Car; route publique var: route; public var roadContainer: MovieClip; fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); car.x = 275,0; car.y = 235,0; route.x = 0,0; road.y = 294,0; roadContainer = new MovieClip (); roadContainer.addChild (route); roadContainer.addChild (voiture); stage.addChild (roadContainer); addEventListener (Event.ENTER_FRAME, onEnterFrame);  fonction publique onEnterFrame (evt: Event): void car.x = car.x + 10; roadContainer.x = roadContainer.x - 10; 

Dans lignes 9 et 21 nous créons un nouveau MovieClip vierge appelé roadContainer. Flash définit automatiquement ses valeurs x et y sur 0.

Dans lignes 22 et 23 nous ajoutons la route et la voiture au conteneur de route, au lieu de la scène. Dans ligne 25 nous ajoutons le roadContainer lui-même à la scène - et puisque la voiture et la route sont maintenant ajoutées au roadContainer, cela nous permet de les voir sur la scène.

Ligne 32 est la partie la plus importante. Ici, nous reculons le conteneur roadConter du même montant que celui que nous venons de déplacer. avant. Cela signifie que tout ce qui se trouve à l'intérieur du roadContainer est déplacé de 10 pixels vers la gauche, mais comme la voiture vient d'être déplacée de 10 pixels vers la droite, elle reste au centre de l'écran..

C'est un peu comme monter l'escalier roulant. Si vous montez à la même vitesse que vous descendez, vous ne semblez pas bouger vers une personne qui se tient dans les escaliers à côté de vous..

L'effet global:

La voiture reste au centre! Génial. Eh bien, à part le trou blanc béant. Mais nous y arriverons. Maintenant, si vous voulez ajouter plus de voitures à la route, tout ce que vous avez à faire est d’ajouterChild () à la routeContainer.


Étape 12: améliorer ce qui suit

Le problème avec le simple fait de déplacer le conteneur dans son ensemble légèrement vers l’arrière est qu’il n’est pas très flexible. Que se passe-t-il si le joueur utilise un bonus pour téléporter la voiture de 100 pixels en avant au lieu de 10? Et si nous voulions que la caméra soit centrée sur une voiture différente?

Lorsque le fichier SWF est chargé pour la première fois, la position x de la voiture est 275 et la position x du roadContainer est 0. Comment évoluent-elles au fil du temps??

  • Début: voiture.x est 275, roadContainer.x est 0
  • Frame 1: car.x vaut 285, roadContainer.x vaut -10
  • Frame 2: car.x vaut 295, roadContainer.x vaut -20
  • Frame 3: car.x vaut 305, roadContainer.x vaut -30

Voyez-vous une règle générale reliant les deux? Sinon, regardez ceci:

  • Début: voiture.x est 275, roadContainer.x est 275 - 275
  • Frame 1: car.x vaut 285, roadContainer.x vaut de 275 à 285
  • Frame 2: car.x vaut 295, roadContainer.x vaut de 275 à 295.
  • Frame 3: car.x vaut 305, roadContainer.x vaut de 275 à 305

La connexion est un peu plus évident maintenant! Mettons cela dans le code:

 fonction publique onEnterFrame (evt: Event): void car.x = car.x + 10; roadContainer.x = 275 - car.x; 

Vous pouvez faire ce que vous aimez avec la voiture maintenant. Accélérez-le, téléportez-le pour transmettre un nombre aléatoire de pixels, arrêtez-le, peu importe! La caméra le suivra quand même.

Et si vous voulez que la caméra suive un objet différent, remplacez simplement car.x avec otherObject.x dans la ligne nous venons de changer.


Étape 13: prolonger la route

Il est temps de réparer le vide blanc sans fin du néant au bout du chemin.

Le moyen le plus simple de rallonger la route consiste simplement à ajouter une autre instance du symbole de route à la droite de notre symbole existant, comme suit: (lignes 9, 22, 23, 27)

 package import flash.display.MovieClip; import flash.events.Event; public class ParallaxDemo étend MovieClip public var car: Car; route publique var: route; public var road2: Road; public var roadContainer: MovieClip; fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); route2 = nouvelle route (); car.x = 275,0; car.y = 235,0; route.x = 0,0; road.y = 294,0; road2.x = road.x + road.width; road2.y = road.y; roadContainer = new MovieClip (); roadContainer.addChild (route); roadContainer.addChild (road2); roadContainer.addChild (voiture); stage.addChild (roadContainer); addEventListener (Event.ENTER_FRAME, onEnterFrame);  fonction publique onEnterFrame (evt: Event): void car.x = car.x + 10; roadContainer.x = 275 - car.x; 

Voici à quoi ressemble le mien quand il est exécuté:

Oh cher. Mieux réparer cet écart.


Étape 14: Faites attention à l'écart

(Si vous ne dessinez pas vos propres graphiques, passez à l'étape 17.)

Le problème est à la ligne 22 du code ci-dessus, road2.x = road.x + road.width. Les routes largeur la valeur doit être légèrement plus grande que ma route semble effectivement être.

Même si votre route n'a pas le même problème, il se peut qu'elle ne s'emboîte pas parfaitement. Alors, retournez sur votre FLA et faites glisser un autre symbole de route de la bibliothèque vers votre couche Guide..

Assurez-vous qu'il a la même position y que le premier segment de route, puis déplacez-le horizontalement jusqu'à ce qu'il n'y ait plus d'espace libre:


Étape 15: Ajustez la jointure

Si les bords de vos deux symboles ne se rejoignent pas parfaitement, double-cliquez sur l'un d'eux. Vous pourrez l'éditer et voir immédiatement comment les modifications que vous apportez affectent l'autre:

Utilisez cette astuce pour ajuster les bords du symbole afin que la jointure soit propre..


Étape 16: Travaillez en largeur

À la place d'utiliser largeur de route pour savoir où le deuxième segment de route devrait être placé, nous allons utiliser un numéro que j'appelle le largeur.

Pour trouver ce numéro pour votre route, il suffit de prendre la position x de votre symbole de route le plus à droite (dans votre couche Guide) et de soustraire la position x de votre symbole de route le plus à gauche..

Tout ce que vous faites ici consiste à déterminer le nombre de pixels que doivent séparer vos deux segments de route pour obtenir la même jointure parfaite que vous venez de créer dans Flash..


Étape 17: Ajouter une variable de largeur

Créer une nouvelle variable numérique, largeur de la route, et définissez sa valeur sur le nombre que vous avez défini à l'étape précédente: (Si vous utilisez mes graphiques, ce nombre est 653,7.)

 public class ParallaxDemo étend MovieClip public var car: Car; route publique var: route; public var road2: Road; public var roadContainer: MovieClip; public var roadBreadth: Number; fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); route2 = nouvelle route (); largeur de la route = 653,7;

Étape 18: Remplacer la largeur par la largeur

Remplacez la ligne:

 road2.x = road.x + road.width;

avec:

 road2.x = road.x + roadBreadth;

Maintenant, testez-le. Il devrait y avoir aucun espace:

Génial! Nous courons toujours dans le vide blanc sans fin, bien que?


Étape 19: Faire l’arrière-plan répété à l’infini

Nous pourrions créer une route3, une route4 et une route5, etc., en les plaçant chacune à la droite de celle qui les précède, mais quel que soit le nombre de segments que nous avons créés, la voiture finira par atteindre la fin..

Pour une meilleure solution, repensez à votre enfance. Avez-vous déjà joué à ce jeu dans lequel vous prétendez que le sol est en lave, mais vous devez vous rendre à l’autre bout de la pièce? (Si non, bon sang, allez y jouer maintenant, c'est très amusant.)

Je ne sais pas pour vous, mais chez moi, les coussins de canapé étaient considérés comme résistants à la lave, pouvant servir de tremplins. Nous n’avions qu’un couple, ce qui n’était pas suffisant pour atteindre le fond de la pièce - mais j’ai fini par comprendre comment les amener plus loin..

J'allongeais les deux coussins pour faire un petit chemin et me dirigeais vers le deuxième. Ensuite, je prenais celui qui se trouvait derrière moi, le déposais devant moi et le franchissais. En prenant à plusieurs reprises celui qui se trouve derrière moi et en le déplaçant devant moi, je pouvais me rendre où bon me semblait..

Nous pouvons utiliser la même technique pour que la route dure à jamais, sans avoir à utiliser plus de deux segments. Tout ce que nous avons à faire est de détecter quand un segment de route est "derrière" la caméra et de le déplacer devant elle..

Qu'est-ce que je veux dire par "derrière" la caméra? Je veux dire que le bord droit du segment se situe en dehors du bord gauche de la scène. Nous pouvons utiliser cette instruction if pour vérifier que:

 si (road.x + roadBreadth + roadContainer.x < 0 )  //road is behind the camera 

Curieux de savoir pourquoi cela fonctionne? Sinon, passez à l'étape suivante. Sinon, laissez-moi vous expliquer:

  • road.x est le nombre de pixels à droite du bord gauche de la route par rapport au bord gauche de roadContainer
  • road.x + roadBreadth est le nombre de pixels à droite du droite-le bord de la route se trouve à partir du bord gauche de la route
  • roadContainer.x est le nombre de pixels situés à droite du bord gauche de roadContainer par rapport au bord gauche de la scène (puisque roadContainer se déplace constamment vers la gauche, le résultat est généralement négatif).
  • Ainsi, (road.x + roadBreadth + roadContainer.x) correspond au nombre de pixels à droite du droite-le bord de la route vient du bord gauche de la scène.

Phew! OK, je l'avoue, c'est assez déroutant. Si vous souhaitez une explication plus approfondie, n'hésitez pas à demander dans les commentaires :)


Étape 20: Déplacez la route devant la caméra

Maintenant que nous pouvons dire quand le segment de route est derrière la caméra, nous devons le déplacer à nouveau devant la caméra.

Si nous avons déplacé la route à droite par largeur de la route nombre de pixels, il serait exactement au même endroit que l’autre segment de route. Nous devons donc le déplacer vers la droite de deux fois plus:

 si (road.x + roadBreadth + roadContainer.x < 0 )  road.x = road.x + (2 * roadBreadth); 

Mettez cela dans votre fonction onEnterFrame () et testez-le:


Comme vous pouvez le constater, un segment de route se répète, mais l’autre ne l’est pas encore..


Étape 21: Déplacement de l’autre segment de route

Nous pouvons simplement copier le code ci-dessus pour notre autre segment de route, route2:

 fonction publique onEnterFrame (evt: Event): void car.x = car.x + 25; roadContainer.x = 275 - car.x; si (road.x + roadBreadth + roadContainer.x < 0 )  road.x = road.x + (2 * roadBreadth);  if ( road2.x + roadBreadth + roadContainer.x < 0 )  road2.x = road2.x + (2 * roadBreadth);  

Testez à nouveau:


Fantastique! Un fond à défilement latéral en boucle infinie :) Maintenant, créez l’effet de parallaxe actuel?


Étape 22: Créer des Rolling Hills

(Ignorez cette étape si vous utilisez mes graphiques.)

Nous allons avoir besoin d'un fond répétitif pour montrer le défilement de la parallaxe. J'ai choisi des collines, mais vous pouvez créer des bâtiments, des forêts, des sculptures extra-terrestres - tout ce que vous voulez!

Vous pouvez utiliser quelques astuces pour donner l’impression que vous dessinez est plus loin que la voiture:

  1. Utilisez des couleurs plus ternes (par exemple, une nuance de vert plus foncée pour votre herbe)
  2. Dessine moins de détails (pas de touffes d'herbe)
  3. Ajouter un effet "flou" sur les bords (car la caméra est centrée sur la voiture)

Suivez les mêmes étapes de base que nous avons utilisées pour dessiner la route:

  • Faites le symbole plus large que la scène
  • Alignez le symbole de sorte que le point d'alignement se trouve sur le bord gauche
  • Donnez-lui un nom de classe, exportez-le pour ActionScript et exportez-le dans le premier cadre.
  • Ajustez la jointure pour vous assurer que deux symboles s’emboîtent parfaitement
  • Déterminez la "largeur" ​​du symbole

Voilà le mien:


Étape 23: Codez les collines

Le code concernant les collines est presque exactement le même que celui que nous venons d’écrire concernant les routes. Essayez de l'écrire vous-même. J'ai collé mon fichier AS avec tous les nouveaux ajouts ci-dessous, vous pouvez donc vous y référer si vous le souhaitez:

 package import flash.display.MovieClip; import flash.events.Event; public class ParallaxDemo étend MovieClip public var car: Car; route publique var: route; public var road2: Road; public var roadContainer: MovieClip; public var roadBreadth: Number; public var hills: Hills; public var hills2: Hills; public var hillsBreadth: Number; public var hillsContainer: MovieClip; fonction publique ParallaxDemo () car = new Car (); route = nouvelle route (); route2 = nouvelle route (); largeur de la route = 653,7; collines = nouvelles collines (); hills2 = new Hills (); collinesLargeur = 890,5; car.x = 275,0; car.y = 235,0; route.x = 0,0; road.y = 294,0; road2.x = road.x + roadBreadth; road2.y = road.y; collines.x = 0; hills.y = 14,5; hills2.x = hills.x + hillsBreadth; hills2.y = hills.y; roadContainer = new MovieClip (); roadContainer.addChild (route); roadContainer.addChild (road2); roadContainer.addChild (voiture); hillsContainer = new MovieClip (); hillsContainer.addChild (collines); hillsContainer.addChild (hills2); stage.addChild (hillsContainer); stage.addChild (roadContainer); addEventListener (Event.ENTER_FRAME, onEnterFrame);  fonction publique onEnterFrame (evt: Event): void car.x = car.x + 10; roadContainer.x = 275 - car.x; si (road.x + roadBreadth + roadContainer.x < 0 )  road.x = road.x + (2 * roadBreadth);  if ( road2.x + roadBreadth + roadContainer.x < 0 )  road2.x = road2.x + (2 * roadBreadth);  hillsContainer.x = 275 - car.x; if ( hills.x + hillsBreadth + hillsContainer.x < 0 )  hills.x = hills.x + (2 * hillsBreadth);  if ( hills2.x + hillsBreadth + hillsContainer.x < 0 )  hills2.x = hills2.x + (2 * hillsBreadth);    

(Les nouvelles lignes sont les suivantes: 12-15, 24-26, 35-38, 45-47, 49 et 67-75. Comment avez-vous fait?)

Voici le résultat:


Vous vous demandez peut-être pourquoi j'ai pris la peine de créer un HillsContainer. Si oui, alors bien repéré! Nous pourrions simplement ajouterChild () les collines au roadContainer - mais la création d'un nouveau conteneur pour l'arrière-plan est ce qui nous permet de créer l'effet de parallaxe réel.


Étape 24: L’effet de parallaxe réel

L'effet nécessite uniquement de changer une ligne de code:

 hillsContainer.x = 275 - car.x;

dans ceci:

 hillsContainer.x = (275 - car.x) * 1/5;

Cela fait défiler les collines au 1 / 5ème de la vitesse de la route et de la voiture.

Cela ressemble à ceci:


Vous n'êtes pas obligé d'utiliser 1/5; augmentez ou diminuez cette valeur jusqu'à ce que la vitesse vous convient.

Pourquoi ça marche? Eh bien, rappelez-vous que nous voyons les choses dans un cône de vision; plus on voit quelque chose de loin, plus on en voit. Donc, si nous passons devant deux objets de la même taille, mais qu'un est plus éloigné, le plus proche des deux semblera se déplacer plus rapidement, comme ceci:


Ajoutons un autre calque d'arrière-plan, encore plus éloigné que les collines.


Étape 25: Créer des montagnes

C'est exactement la même chose que de créer la route et les collines, donc je ne vais même pas coller le code cette fois! Je ne ferai que poster une photo de mes montagnes?

? vous dire que la largeur de mes montagnes est 751,5, x est 0 et y est 63,0; rappelez-vous de créer un nouveau MovieClip mountainContainer; et vous faire savoir que mes montagnes défilent au 1/16 de la vitesse de ma route.

Oh, et te montrer le résultat:



Étape 26: Créez le ciel

Le ciel est beau et facile. Comme c'est très loin, il défile si lentement qu'il semble à peine défiler. Les nuages ​​et les oiseaux se déplacent, bien sûr, et le soleil se lève et se couche, mais rien de tout cela n'est dû à un effet de défilement de parallaxe. Cela signifie que nous n'avons rien à faire dans le ciel!

(L’exception à cette règle est si la caméra voyage vraiment, vraiment rapide - comme la vitesse d'un avion ou d'une fusée. Même alors, assurez-vous de le faire défiler très lentement.)

Donc, inutile de s’inquiéter de la largeur ici ou de la création d’une image qui se répète à l’infini. C'est toujours une bonne idée de faire un skyContainer, cependant, juste pour garder les choses cohérentes. Mon ciel n'est qu'un rectangle bleu:

Si vous le placez à x = 0, y = 0, cela couvrira toute la scène. Voici à quoi cela ressemble dans le fichier SWF:



Étape 27: Créer un grand arbre au premier plan

Nous avons créé beaucoup d'objets d'arrière-plan, mais rien de plus proche de la caméra que la voiture. Comme vous le réalisez sûrement, un tel objet devrait défiler plus rapide que le roadContainer, alors essayons ceci.

Pour mon objet de premier plan, j'ai dessiné un arbre:

L'arbre est un peu différent des autres objets que nous avons fabriqués jusqu'à présent car il n'est pas fait pour faire une boucle - il reste seul, il ne se joindra pas à un autre arbre qui se trouve à côté. Cela signifie que nous n'avons jamais besoin que d'un seul arbre à l'écran à la fois (d'autant plus qu'il est si gros!)

Nous n’avons donc besoin que d’un seul objet Tree dans le code. Écrivez le code pour cet objet. Si vous utilisez mes graphiques, la position x de départ sera 780.0 et la position y sera 175.0..

Comme l'arbre va défiler, nous avons toujours besoin d'un conteneur Tree, et nous avons encore besoin d'un arborescence. Cependant, cette fois, treeBreadth contrôle juste le nombre de pixels entre chaque arbre. J'ai utilisé un joli tour 1000.0 pour le mien.


Étape 28: Faites défiler l'arbre

Comme il n'y a qu'un seul arbre, le code de défilement est beaucoup plus simple:

 treeContainer.x = (275 - car.x) * 3; if (tree.x + treeBreadth + treeContainer.x < 0 )  tree.x = tree.x + (2 * treeBreadth); 

Rien de compliqué :) Notez qu'il défile trois fois plus rapide que la route. Voici le résultat final:


Toutes nos félicitations! Vous avez créé une caméra à défilement dynamique, des arrière-plans se répétant à l'infini et un effet de pseudo-parallélisme 3D :)


Autres idées à essayer

Voici quelques autres choses que vous pouvez faire avec le même code:

Si vous créez un shoot-up et que vous souhaitez que toutes vos explosions apparaissent plus proches de la caméra que vos ennemis, créez simplement un nouveau conteneur d'explosions, ajoutez-le à Child () à n'importe quelle explosion, même vitesse que les ennemisContainer.

Placez le score du joueur, son compteur de points de vie, les boutons Muet et Pause, ainsi que toute autre partie de l'interface de votre jeu dans un même conteneur. Placez ce conteneur devant tous les autres conteneurs, mais ne le faites pas défiler. C'est un moyen facile de séparer la caméra et les ressources d'un jeu de son interface..

Essayez d’avoir un contenant immobile tout en faisant défiler les contenants devant lui et derrière lui dans des directions opposées. Cela crée un effet de rotation sympa, comme on le voit environ cinq minutes après le clip de Blanche-Neige de Disney!


Conclusion

Merci d'avoir lu ce tutoriel; J'espère que vous avez aimé. Si quelque chose n'était pas clair du tout ou si vous souhaitez poser des questions à propos de l'effet, merci de poster un commentaire ci-dessous.

En parlant de commentaires, si vous créez quoi que ce soit à l'aide de ce tutoriel, j'aimerais bien pouvoir poster un lien pour que je puisse le voir :)