Go Down

Topic: [aide] Détecter des collisions d'un jeu vidéo (Read 601 times) previous topic - next topic

N0ciple

Sep 01, 2012, 12:17 am Last Edit: Sep 01, 2012, 07:02 am by Jean-François Reason: 1
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  :P ). Mais bref assez parlé de moi, parlons de mon projet!

Je cherche à coder un jeu tout simple (en apparence  :smiley-sweat: ) 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 : http://code.google.com/p/arduino-tvout/

Et evidement à vous montrer le code :D

Code: [Select]
/*
-------------------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,
Code: [Select]
#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!  ;)

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  :~

barbudor

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
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Go Up