[aide] Détecter des collisions d'un jeu vidéo

Bonjour/Bonsoir!

Comme je suis un (petit) nouveau, je me permet de me présenter, j'ai 19 ans, je suis étudiant en prépa (en PC* pour ceux que ça intéresse) et je tripatouille mon arduino depuis... Quelque chose comme 7 mois (d'après la date d'achat de mon arduino :stuck_out_tongue: ). Mais bref assez parlé de moi, parlons de mon projet!

Je cherche à coder un jeu tout simple (en apparence :sweat_smile: ) au quel vous avez déjà certainement joué. Je ne crois pas qu'il ait un nom... j'ai vu qu'on l'appelait Blitz à certains endroit, c'est ce que j'ai fait.
il s'agit d'un jeu avec un bombardier qui se déplace de la gauche vers la droite et qui descend progressivement. Le but étant de larguer des bombes pour détruire des bâtiments sans s'écraser dessus.
Une image (de mauvaise qualité) vaut mieux qu'un long discourt. Ça ressemble à ça:


Sur cette photo, la 2ème tour est en train de s'afficher!

Pour l'instant, voilà où j'en suis:
-j'arrive à faire défiler l'avion

  • à lâcher des bombes quand j'appuie sur le bouton
  • à afficher BOUM! quand la bombe touche le sol
  • à afficher les 2 tours

Ce qui me pose problème:
- Je me suis arrangé pour que les 2 tours aient une position alléatoire mais j'ai beau reseter l'arduino, elles apparaissent toujours au même endroit! c'est comme si les variable de position étaient définies à l'upload du scketch et ne changeaient plus jamais!
- quand une bombe tombe, il y a un affreux clignottement de tout l'écran! (propablement à cause de la fonction millis()...)
-quand une bombe touche une tour, celle-ci reste affichée!

Ce qui reste en projet:
-Créer des niveaux de plus en plus dur
-faire descendre l'avion à chaque passage
-pourquoi pas enregistrer les High Score dans l'EEPROM

Voilà il me reste à vous dire que j'utilise la librairie TVout, disponible ici : Google Code Archive - Long-term storage for Google Code Project Hosting.

Et evidement à vous montrer le code :smiley:

/*
-------------------Blitz----------------------
A game where you have to destroy buldings by dropping bombs.
By Robin Dupont | email: robin.dpnt@gma**il.com (remove the 2 * )
Feel free to share or modify this code!
This code use the TVout librairy available here:
http://code.google.com/p/arduino-tvout/
----------------------------------------------
*/


#include <TVout.h>
#include <fontALL.h>
#include "Bomber.h"
#include "Bomb.h"
#include "Tower.h"

TVout TV;

int i=0; //Position initiale du bombardier

int m=i;

int j; // Variable de position (axe Y) pour les bombes

int p=(TV.vres()/10)+5; // position du bombardier sur l'axe des Y (pour l'instant il ne descend pas!)

long prev = 0;          //
int interval = 10;      // Variables utilisée pour le délais avec la fontion millis()
int interval2 = 500;    // (prev est l'abréviation de previous )
long prev2 = 0;         //

int pos1; //
int pos2; // Position des Tours

boolean chk1; //
boolean chk2; //Variables pour vérifier que l'on puisse ou pas afficher les tours

void setup(){
  chk1=true;//
  chk2=true;// Booléen réglé sur vrai par défaut
  
  TV.begin(PAL,120,96);
  pinMode(2,INPUT); // pin pour le bouton

intro(); // Affiche l'intro

}
  
void check(){
 if(j=TV.vres()-5){            //
  if (m+14<pos1<m+20){         // If statement pour vérifier si une bombe est en contact avec une tour
       chk1=false;}            //
       else{chk1=true;}        //
     if (m+14<pos2<m+20){      //
       chk2=false;}            //
     else{chk2=true;}          //
 }
}



void intro() {
  while(digitalRead(2)== LOW){
 TV.select_font(font8x8);                            //Ecran d'intro. Juste pour se la péter et écrire son nom sur la télé devant les potes! :p
    TV.print(20,TV.vres()/3,"BLITZ v0.5");           //
  TV.select_font(font4x6);                           //
  TV.print(20,(TV.vres()/3)+10,"By Robin Dupont");   //
  TV.select_font(font6x8);
  TV.bitmap(30,(TV.vres()/3)+25,Bomber);
  TV.bitmap(45,(TV.vres()/3)+40,Bomb);
  TV.bitmap(37,(TV.vres()/3)+48,Bomb);
 }
}                                                   




void pos(){                                         //Set a ramdom position to the 2 Buldings
  pos1= random(15,105);                             //
  pos2 = random(15,105);
  if (abs(pos1-pos2)<6){                            //If statement pour éviter que les 2 tours se chevauchent
  if (pos1>pos2){
    pos1=pos1+3;
    pos2=pos2-3;
  }
  else if (pos1<pos2){
    pos1=pos1-2;
    pos2=pos2+2;
  }
  }
}


void affichage(){                           //Affichage des 2 tours
if (chk1 == true){
  TV.bitmap(pos1,TV.vres()-20,Tower);}          
if (chk2 == true){
  TV.bitmap(pos2,TV.vres()-20,Tower);}
}




void loop(){
 int hauteur = TV.vres();
 int largeur = TV.hres();

delay(1000);  // delay pour éviter que le 1er appuie sur le bouton soit pris en compte

  pos();           //crée les coordonnée en x des tours


// Grosse boucle for quio fait tous fonctionner

  for ( i=0 ; i < largeur;i++){
    
    
    TV.bitmap(i,p,Bomber);   // afficher le bonbardier
    
    
    affichage();           // afficher les 2 tours
 
    if (i > largeur - 5){
      i=0;}                 // pour faire revenir l'avion à son point de départ
      
      
    TV.delay(25);
    
    TV.clear_screen();

    if (digitalRead(2) == HIGH){  //check si le bouton est pressé
  
    const int x = i;
    int k = i*10;
    for (j=p;j<=hauteur;){      //for loop pour faire tomber les bombes
    
      TV.clear_screen();
      TV.bitmap(TV.hres()/2,TV.vres(),Tower);  //Affichage des tours, de la bombe et du bombardier pendant la chute de la bombe
      TV.bitmap(x+15,j,Bomb);      //+15 pour que la bombe soit lachée au millieu de l'avion
      TV.bitmap((k/10),p,Bomber); // k/10 pour que l'avion n'avance pas trop vite
      
      unsigned long now = millis();  //Fait tomber la bombe
     if (now - prev > interval){
       prev = millis(),
       j++;
     
   }
     
     if (now - prev2 > interval2){ //Fait voler l'avion pendant que la bombe tombe
       k++; 
     }
     
     if (j>=hauteur){
      TV.print(x+3,j-10,"BOUM!");}    // écrit BOUM! quand la bombe touche le sol
   
    affichage (); //affiche les tours pendant la chute de la bombe
    
      i=k/10; // redonne la bonne valeur à i
   }
   
  }
 }
 
}

Pour ceux qui ne seraient pas familiers avec TVout,

#include "Bomber.h"
#include "Bomb.h"
#include "Tower.h"

C'est juste pour les image bmp transformées en code hexa !

Bien, ceci étant dit, Je tiens à préciser que je ne commente d'habitude pas vraiment mes codes et que je ne sais pas si il y a une façon particulière de le faire, donc j'ai commenté à ma façon. Si certains point sont obscures, n'hésitez pas à me demander des précisions! :wink:

Là où je sollicite votre aide, c'est pour résoudre les points de "Ce qui me pose problème:". Si vous pouviez me donner quelques astuces qui permettraient de débloquer la situation, et ne vous privez pas pour critiquer âprement mon code qui doit être assez "brouillon" je pense XD !

Bref, Bonne lecture et bonne journée/soirée!

EDIT: j'avoue que je titre n'a pas trop de rapport, où ne couvre pas la totalité du sujet mais je ne sais pas quoi mettre :~

le générateur de nombre aléatoire est un générateur pseudo-aléatroire
La valeur d'initialisation au reset étant toujours la même, la séquence sera toujours identique.
A moins de donner au début du programme une semence vraiment aléatoire au générateur.
Relire la page : http://arduino.cc/en/Reference/Random