Forums Développement Multimédia

Aller au contenu

[exercice] Jeu de Snake

CODE

8 réponses à ce sujet

#1 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 26 November 2012 - 17:58 PM

Bonjour,

Voici un petit exercice pour réaliser un jeu de SNAKE.
J'ai préféré monter un exercice et non un tutorial, partant du principe que vous avez déjà au moins une petite expérience dans la création de jeux et que vous connaissez les pré-requis.

Je vous laisses y jeter un œil ici : http://forums.mediab...ercice_le_snake

Puis nous pouvons en discuter si vous le souhaitez ;-)

Sachez également que cet exercice fait partie d'une série, vous avez déjà eu le TAQUIN hier, je vais continuer avec :

Centripede
Missile command
Space invader
Asteroids
...

etc... jusqu'à ce que j'en aie marre ;-)

#2 Angelstreet

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 214 messages

Posté 26 November 2012 - 19:41 PM

Salut,
J'ai essayé le jeux du snake par contre il faut cliqué deux fois sur le swf pour activer le clavier sinon on peut pas bouger le snake.
En tout cas en cliquant rejouer chez moi le déplacement du snake ne marche pas. (problème de focus).

(hors sujet: Je savais pas que l'on pouvait intégré unswf sur mediabox !)

#3 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 26 November 2012 - 20:05 PM

Ha oui tient, effectivement petit pb de focus, bah pas très grave je corrigerai mais ça n'a pas de rapport direct avec le principe du jeu ;-)

#4 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 02 December 2012 - 09:46 AM

coucou;
bon travail; bien clair et bien expliqué. Par contre je ne pense que l'utilisation de bolean pour la direction soit un bonne idée.Une simple variable sens par exemple qui vaut 1 ou - 1 suffit..
dans le Down tu imputes ta variable dans le UP tu la remets a 0

// Appuyer sur une touche
function appuie(e:KeyboardEvent):void {
if(e.keyCode==39) sens=1
if(e.keyCode==37) sens = -1;
}
//puis
angle += sens*20
 
pour le jeu ce n'est pas un problème de focus..tu ajoutes un écouteur au stage alors qu'il faudrait l'ajouter au panneaux..(a mon idée)

panneaux.buttonMode = true;
panneaux.addEventListener(MouseEvent.CLICK,commencer);
panneaux.addEventListener(KeyboardEvent.KEY_DOWN, appuie);
panneaux.addEventListener(KeyboardEvent.KEY_UP, relache);
 
Sinon merci pour la peine que tu te donnes a nous expliquer..

#5 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 02 December 2012 - 11:18 AM

Salut,

Merci de tes retours.

Citation

Par contre je ne pense que l'utilisation de bolean pour la direction soit un bonne idée.

Elle ne serait pas bonne dans le cas où il faudrait optimiser à mort, car elle impose un transtypage d'un Boolean en un entier.
C'est cependant la formulation la plus courte et la plus pratique, par exemple avec ta solution le snake conservera le dernier sens trouvé pour tourner, or avec ma formulation lorsque aucune touche, ou les deux sont enfoncées le "sens" de rotation est de 0. On s'économise beaucoup de lignes de code inutiles avec ma solution, et le but des exercices et de vous montrer différentes manières de faire ;-)

Concernant la perte de focus, en fait c'est normal, il ne faut pas ajouter les écouteurs sur les panneaux, ce n'est pas logique, les panneaux ne sont pas sensés intervenir dans la partie, on devrait même les supprimer totalement, là ça marche car les objets panneaux sont toujours présents, on peut donc leur ajouter des évènements clavier. Ce qu'il se passe en réalité c'est que le focus est donné au dernier objet sur lequel on a cliqué, donc sur les panneaux, il faut recliquer pour donner le focus au stage et donc écouter les évènements clavier qui lui sont associés. Pour corriger ça il suffit de redonner le focus au stage avec une petite ligne dans la fonction "commencer" :

stage.focus = stage;

Et le tour est joué, plus de problème de focus ;-)

Merci des retours je vais corriger pour le focus.


EDIT : voilà code corrigé pour le focus et SWF corrigé remis en ligne ;-)

#6 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 02 December 2012 - 13:10 PM

coucou;
dans mon code il ne conserve pas le dernier sens trouvé pour tourner; si tu lâches la touche droite ou gauche il continu droit dans la direction initée. si tu appuies simultanément sur les deux touches il va dans la direction de la première touche appuyée ( dans le sens chronologique) mais ca ne présente ici que très peu d’intérêt . Bien sur que c'est intéressant de voir d'autre manière de faire; mais ici je ne vois pas trop ce que tu supprimes comme ligne de code..(si tu peux developper ?) par contre je supprimes une variable et des transtypage a mon sens inutile..Mais cest qu'un avis sans plus.

Pour le focus merci pour les explications.

Fichier(s) joint(s)



#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 02 December 2012 - 13:55 PM

Prenons un exemple concret, essayes avec un perso que tu dois déplacer dans les 4 directions et orienter dans la direction choisie, l'écriture classique reviendrait à peu près à ça :


var droite:int = 0;
var gauche:int = 0;
var haut:int = 0;
var bas:int = 0;

function appuie(e:KeyboardEvent):void{
        var k:int = e.keyCode;
        if (k==39)      droite = 1;
        if (k==37)      gauche = 1;
        if (k==40)      bas = 1;
        if (k==38)      haut = 1;
}

function relache(e:KeyboardEvent):void{
        var k:int = e.keyCode;
        if (k==39)      droite = 0;
        if (k==37)      gauche = 0;
        if (k==40)      bas = 0;
        if (k==38)      haut = 0;
}

function bouge():void{
        if (droite)     {
                perso.x +=  T;
                perso.rotation = 0;
        }

        if (gauche)     {
                perso.x -=  T;
                perso.rotation = 180;
        }

        if (haut) {
                perso.y -=  T;
                perso.rotation = 270;
        }

        if (bas) {
                perso.y +=  T;
                perso.rotation = 90;
        }
}
 

Avec mon écriture :


function appuie(e:KeyboardEvent):void {
        var k:int = e.keyCode;
        bouge(int(k==39)-int(k==37),int(k==40)-int(k==38));
}

function bouge(X:int, Y:int):void{
        perso.x+=X*T;
        perso.y+=Y*T;
        perso.rotation = X*90+(Y+Math.abs(Y))*90;
}
 

Dans ma version pas besoin d'écouter le relâchement de la touche, ni d'utiliser un tas de variables pour ce cas là inutiles ;-)

Maintenant ce n'est pas une obligation d'écrire comme j'ai choisi de le faire, c'est juste que ça me parait bien plus court et que c'est à mon sens bien de montrer qu'on peut condenser son code avec quelques astuces.

Comment de ton côté écrirais-tu le même programme ?
Je me trompe peut-être et il y a sans doute des méthodes plus simples que celles que j'ai choisi.

#8 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 04 December 2012 - 00:45 AM

coucou;
j'aurai fait ca..


stage.addEventListener(KeyboardEvent.KEY_DOWN, appuie);
var X:int;
var Y:int;
var R:int;
var T:int=5
var tab:Array=[[-1,0,2],[0,-1,3],[1,0,0],[0,1,1]];
function appuie(e:KeyboardEvent):void {
            var k:int = e.keyCode;
  for (var i:int =0 ; i<4;i++) {
   if(k==37+i) { bouge(tab[i][0],tab[i][1],tab[i][2]); break;}
  }}

function bouge(X:int, Y:int,R:int):void{
            perso.x+=X*T;
            perso.y+=Y*T;
            perso.rotation = R*90;
}
 

disons que mon approche permet d'ajouter plein de d'option dans la fonction bouge.;sans être tributaire de true et de false; a mon humble avis ce que tu fais est une utilisation ingénieuse de true et de false;mais avec un porte limitée c'est bien sur qu'un avis

Ce que j'ai ecrit doit etre perfectible..lol

et continue de creuser; c'est très interessant ce que tu fais..A mon avis tu utilises trop peu les operateurs sur le bit dans tes jeux

Fichier(s) joint(s)



#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 04 December 2012 - 11:32 AM

Yop,

Tu passes par un tableau, effectivement tu étend tes possibilités, ça marche aussi ;-)
Pour les opérateurs binaires, ce n'est pas mon fort, la preuve pour le Pong où je croyais tenir une bonne astuce et finalement je me suis trompé dans le raisonnement même si le résultat est correct, donc à part quelques opérations simples comme des divisions je ne pense pas en utiliser beaucoup dans ces exercices, et comme le faisait remarquer Lilive hier sur le Pong, pas sur que ce soit idéal pour le public vidé.

Merci de tes retours en tout cas ;-)



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

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