IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

jeu avec vaisseau qui tire des missiles


Sujet :

2D Java

  1. #1
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut jeu avec vaisseau qui tire des missiles
    Bonjour,

    Pour me changer les idées de mes révisions java, j'ai refait un peu d'algo avec java en utilisant processing.

    Voici le code d'un mini (voire micro) jeu qui est fonctionnel et qui tourne sur processing 3, le but étant de toucher le vaisseau 10 fois pour le détruire. Les déplacements se font avec flèche gauche et droite, puis up pour tirer.

    Mon problème est que je voudrais tirer un missile, plutôt qu'un rayon comme c'est le cas actuellement (ligne 57) et je ne sais pas comment m'y prendre
    deuxième problème, je voudrais que mon vaisseau ne sorte pas du cadre gauche et droite de ma fenêtre.

    IL y a bien sûr beaucoup d'autres choses à faire évoluer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    //partie 50 rebonds
    boolean isKey;
    boolean vaisseauKill;
     
    int vaisseauX;
    int vaisseauY;
    int vitesseX;
    int vitesseY;
     
     
    int vitesseC;
    int canonX;
    int canonY1;
    int canonY2;
    int canonYH;
     
    int cpt;
    int cptDestroy;
    int cptFrame;
     
    color rouge = color(255, 0, 0);
    color vert = color(0, 255, 0);
    color blanc = color(255, 255, 255);
    color bleu = color(0, 0, 255);
    color valeur;
     
    void setup() {
      vaisseauKill=false;
      isKey=false;
      background(0);
      frameRate(60);
      size(600, 600);
      vitesseC=5;
     
      cptDestroy=0;
      cptFrame = 0;
      vitesseX = 2;
      vitesseY = 2;
     
      canonX = width/2;
      canonY1 = height-10;
      canonY2 = height-25;
      canonYH = height-35;
     
      vaisseauX = 130;
      vaisseauY = 100;
    }
     
    void isKeyPressed() {
      if (key == CODED) {
        if (keyCode==RIGHT) {
          canonX+=vitesseC;
        } else if (keyCode==LEFT) {
          canonX -= vitesseC;
        } else if (keyCode==UP) {
          if (cptFrame>0) {
            if (canonX>vaisseauX-25 && canonX<vaisseauX+25) {
              line(canonX, canonY2, canonX, vaisseauY+10);
              if (cptFrame==3) {
                cptDestroy++;
              }
            } else {
              strokeWeight(4);
              stroke(0, 255, 115);
              line(canonX, canonY2, canonX, 0);
            }
            cptFrame--;
          }
        }
      }
    }
     
    void createCanon() {
      strokeWeight(25);
      stroke(255, 255, 255);
      line(canonX, height, canonX, height);
      strokeWeight(4);
      stroke(255, 255, 255);
      line(canonX, canonY1, canonX, canonY2);
    }
     
    void createVaisseau() {
     
      vaisseauX += vitesseX;
      vaisseauY += vitesseY;
      noStroke();
     
      if (cptDestroy>=0 && cptDestroy<3 ) {
        ellipse(vaisseauX, vaisseauY, 50, 20);
        fill(bleu);
      } else if (cptDestroy>=3 && cptDestroy<6) {
        ellipse(vaisseauX, vaisseauY, 50, 20);
        fill(rouge);
      } else if (cptDestroy>=6 && cptDestroy<10) {
        ellipse(vaisseauX, vaisseauY, 50, 20);
        fill(vert);
      } else if (cptDestroy==10) {
        ellipse(vaisseauX, vaisseauY, 50, 20);
        fill(blanc);
        vaisseauKill=true;
        vitesseY = 10;
        vitesseX = 0;
      }
    }
     
    void draw() {
      background(0);
     
      if (vaisseauX-25<0) {
        vitesseX =-vitesseX;
        cpt++;
      }
      if (vaisseauX+25>width ) {
        vitesseX = -vitesseX;
        cpt++;
      }
      if (vaisseauY-10<0 ) {
        vitesseY = -vitesseY;
        cpt++;
      }
      if (vaisseauY+10>height-100 && vaisseauKill==false) {
        vitesseY = -vitesseY;
        cpt++;
      }
     
      text(cpt, width -50, height -20);
      text(cptDestroy, width -150, height -20);
      if (cptDestroy>=10) {
        text("YOU WIN", width/2, height/2);
        textSize(25);
      }
     
      createVaisseau();
      createCanon();
      if (isKey==true) 
        isKeyPressed();
    } 
     
    void mousePressed() {
      vitesseX=-vitesseX;
      vitesseY=-vitesseY;
    }
     
    void mouseDragged() {
      vaisseauX = mouseX;
      vaisseauY = mouseY;
    }
     
    void keyReleased() {
      isKey=false;
    }
     
    void keyPressed() {
      isKey=true;
      cptFrame=3;
    }
    Si vous avez des pistes de réflexions.
    Merci

    Post à déplacer si pas au bon endroit, mais je ne savais pas où poster. Vous remerciant de votre compréhension.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par olivier252 Voir le message
    deuxième problème, je voudrais que mon vaisseau ne sorte pas du cadre gauche et droite de ma fenêtre.
    Pour faire ça, il suffit au moment de bouger ton vaisseau (le canon en fait) de tester sa coordonnée X, ici dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (keyCode==RIGHT) {
          canonX+=vitesseC;
        } else if (keyCode==LEFT) {
          canonX -= vitesseC;
        }
    Lorsqu'on va à gauche, on teste si canonX après mouvement est < 0 et si oui, on le force à zéro. Et à droite, c'est pareil sauf qu'on teste si canonX + largeur du canon > à largeur d'écran de jeu. Si oui on force canonX pour qu'il soit plaqué à droite : canonX = largeur de l'écran - largeur du canon.



    Citation Envoyé par olivier252 Voir le message
    Mon problème est que je voudrais tirer un missile, plutôt qu'un rayon comme c'est le cas actuellement (ligne 57) et je ne sais pas comment m'y prendre
    Pour faire ça, tu dois gérer un nouveau "mobile" (un nouveau sprite en gros). C'est très similaire au fonctionnement du vaisseau, pour l'affichage et le déplacement, sauf que ses coordonnées vont évoluer différemment. Basiquement, au début, le x et le y vont être relatif au canon (x = milieu du canon par exemple, et y = y du canon), puis y va évoluer (avec sa propre vitesse) pour aller vers 0, par exemple. Il suffira de détecter y<0 pour qu'il n'existe plus.
    On peut donner un peu plus de dynamisme en donnant une légère vitesse latérale, qui varie aléatoirement et qui est initialisée par la vitesse latérale du canon (si l'utilisateur tape droite et up en même temps, on donne une petite vitesse latérale vers la droite).

    Ensuite, tu as un choix à faire :
    1. un et seul missile et tant qu'il n'est pas sorti de l'écran (ou qu'il a touché le vaisseau), on ne peut pas tirer
      dans ce cas, il te suffit d'un moyen de savoir qu'il y a un missile en vol, par exemple y < 0 le missile n'existe pas, y>=0 le missile est en vol (donc à afficher, susceptible de toucher le vaisseau (test à faire), etc).
    2. on peut tirer un certain nombre de missiles (limité pour pas que ça rame s'il y a trop de missiles à gérer). Dans ce cas, c'est exactement pareil, sauf qu'il faut en gérer plusieurs, par exemple, via un tableau et une classe qui stocke les coordonnées x y du missile et on répétera le traitement pour autant de missile qu'il y en a. Pour gérer l'existence ou pas, on va utiliser une astuce basée sur le faite que deux missiles tirés l'un après l'autre vont forcément disparaître l'un après l'autre dans le même ordre (on peut aussi gérer des cases vides ou pas, mais c'est plus lent, sauf si le nombre max est atteint). Sauf si tu veux des missiles qui n'ont pas la trajectoire que j'ai donnée mais une autre, par exemple, missile à tête chercheuse : dans ce cas, ce sera beaucoup plus simple via une liste (avec un impact sur les performances)...ou limiter à un seul missile max à tête chercheuse, genre bonus spécial...
      donc si les missiles ne font que monter vers le haut de l'écran, il suffit de deux index : celui de la première cellule du tableau qui contient un missile tiré et celle de la dernière (on les fait varier chaque fois qu'un missile "disparait"), et on parcourt de l'un à l'autre avec un modulo pour boucler sur le tableau


    Enfin, pour savoir si un missile touche le vaisseau, il faut un petit test de collision. Une simple comparaison de coordonnées, ou utilisation de la méthode intersects de java.awt.Rectangle. Et ça aussi c'est une condition de "disparition".
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Merci pour ta réponse, si je te suis bien pour le déplacement du canon, tu me conseilles de faire ceci ?
    Si c'est le cas ça crée le problème de fixer le vaisseau sur le bord droit sans plus pouvoir le bouger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (key == CODED) {
        if (keyCode==RIGHT && canonX<width-12.5) {
          canonX+=vitesseC;
        } else {
          vitesseC=0;
        }
    Exemple pour le côté droit

    Erreur de ma part : confusion entre position et vitesse-->problème réglé reste plus qu'à faire les missiles

  4. #4
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    C'est bon premier problème réglé, je tire de beaux missiles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2016] Envoi d'emails HTML avec variables qui contiennent des diacritiques
    Par dpoel dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/09/2019, 10h42
  2. Réponses: 7
    Dernier message: 04/09/2010, 12h51
  3. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 02h13
  4. webpart avec onglet qui contient des webparts
    Par Vincent Bob dans le forum SharePoint
    Réponses: 1
    Dernier message: 09/05/2008, 10h55
  5. [langage C][débutant] un vaisseau qui tire
    Par shinkyo dans le forum GLUT
    Réponses: 12
    Dernier message: 10/06/2006, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo