Jeu de voiture a 300 km/h

 


  Je developpe un jeu pour Android ( smartphone). 

   C'est juste un prototype jouable. Mais je compte l'améliorer, surtout le décor.

Ik y à encore beaucoups de travail à faire, comme l'optmisation, la compatibilité entre les divers ecrans, car la rotation d'un plan par exemple et en fonction de la taille de l'écran. Le joueur recoit un choc sur le pare-brise lirsqu il heurt un obstacle ( ici une voiture). La route defile vite et on à une grande sensation de vitesse. 





/*

                DANGEROUS GIRL


   vois etes dans une voiture et vois devez

   eviter des obstacles sur la route


   si vous percutez la vitre se brise de plus en plus

   

    obstacle :

    

    aliens

    

    robotoïdes

   

    terminators



 Dans la vrais vie a cette vites

 vous n avez droit qu a 1 seul impact...

 descendre encore un peux le vockput

*/



boolean enTrainDeTournerDroite;

boolean enTrainDeTournerGauche;



boolean DEBUG = false;

float voitureX, voitureY;

float voitureVitesse = 5;

float obstacleX, obstacleY;

float obstacleVitesse = 7;

int score = 0;

int impact=0;

int defil=0;

PImage cockpitt;

int mouse =0;


PImage i1,i2,i3,i4;


PImage textureImage;

float quadSize = 300; // Taille du quad

float squareSize=200;

PImage img;



PImage fond;

int panorama; // utile pour avoir un find a 360 degrees


PImage lamp;

// defilement du decor

int defilement;



PImage obstacle;

int obstaclepos;


void setup() {

  orientation(PORTRAIT);

  

  fullScreen(P3D);

  

  cockpitt = loadImage("t.png");

  

  i1 = loadImage("i1.png");

  i2 = loadImage("i2.png");

  i3 = loadImage("i3.png");

  

  i4 = loadImage("i4.png");

  textureImage = loadImage("r.jpg");

  img = loadImage("1.png");

   fond = loadImage("espace.jpg");

  

  // serie de dessins qui defilent

  lamp=loadImage("lamp.png");

  

  

  voitureX = width / 2;

  voitureY = height - 100;

  obstacleX = random(width - 50);

  obstacleY = -50;

  

  panorama=0;

  

  defilement =0;

  

  // quelques dangers de la route

  obstacle = loadImage("voiture.png");

}


void draw() {

  background(0);

  noStroke();

  

  // Déplacer la voiture avec la souris

  

  // un effet de vibration

  // mais on va le mettre sans

  // que le score ne bouge

  pushMatrix();

  

  

  

  translate( random(6),random(6),0);

  

  

  




  

  // Configuration de la caméra

  //camera(width/2.0, height/2.0, (height/2.0) / tan(PI/6), width/2.0, height/2.0, 0, 0, 1, 0);

  

  // Dessin du quad texturé

  


  

  

  

  

  

  

  

  pushMatrix();

  

  //attention a cette ligne

  translate(width/2, height/4, -10); // Position du quad au sol

  //rotateX(PI/2.3); // Rotation du quad pour qu'il soit à plat

  //translate(0, 0, -37); //

  // Application de la texture au quad

 /* beginShape();

  texture(textureImage);

  // premier sommet haut gauche

  vertex(-700, quadSize, 0, 0, 0);

  // haut droit

  vertex(700, quadSize, 0, 1, 0);

  // bas droit ( x et y) et

  vertex(   quadSize/12 , -quadSize, 0, 1, 1);

  // bas gauche

  vertex(-  quadSize/12  , -quadSize, 0, 0, 1);

  endShape(CLOSE);

  */

 // textureMode(NORMAL);

//rotateX(1.4);


if ( 1==1)

{

  pushMatrix();

  textureWrap(REPEAT);

  //pour trouver la bonne hauteur

  //translate(0, mouseY, -1001);//vy-1

  translate(0, 491, -2001);//vy-1

  //rotateX(1.5 );

  

  // plus incliné

  rotateX(1.58 );

beginShape(QUAD);

texture(img);

int vx=2100;

int vy = 2000;// 1600 avec rot 1.5



int ll = img.height*1;

//defil+=62+obstacleVitesse*4;


defil+=obstacleVitesse;


if ( defil > 10000) defil=0;


int z=-111;

int y=0;

//mouse= int(voitureX); n oublie pas que tu es a -vy et pas à y=0, le rectangle est en coird negatif pour ses sommets du haut

vertex(-vx + mouse, -vy + y, z, 0, -defil);

vertex(vx + mouse, -vy + y, z, 1024*3, -defil);




vertex(vx + mouse, vy + y, z, 1024*3, ll-defil); // Vous pouvez ajuster la division ici

vertex(-vx + mouse, vy+ y, z, 0, ll-defil); // Vous pouvez ajuster la division ici




/*

haut gauche

vertex(-1000, -100, 0, 0, 0);

// haut droit

vertex(1000, -100, 0, 1, 0);

// bas droit

vertex(1000, 100, 0, 1, 1);

vertex(-1000, 100, 0, 0, .5);

*/



endShape();

popMatrix();

  

  }

  

 /*

 

 beginShape(); 

 texture(textureImage);

  vertex(-700, -squareSize/2, 0, 0, 0);

   vertex(squareSize/2, -squareSize/2, 0, 1, 0);

    vertex(squareSize/2, squareSize/2, 0, 1, 1); 

    vertex(-700, squareSize/2, 0, 0, 1);

     endShape(CLOSE);

 

 */

 

 

 popMatrix();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 pushMatrix();

 translate( random(16),random(16),0);

    image( fond, -200 -voitureX+sin( voitureX)*17 +panorama,0, width*2 ,height/2);

  popMatrix();

  

  defilement+=150;

  // le trajet de l image suit une courbe de bezier

  if ( defilement > 2000) defilement = 0;

  //image ( lamp, 0,100, 250,900);

 // image ( lamp,width/2 - defilement/2  ,100- defilement/2.7, int(defilement/4) ,defilement*2);

  

  

   // traits de vitesse orientables

  trait.drawEtoile();// est ce aussi simple ?, j arrive pas à croire que ça l est

  

  

  // les voitures

  // suivent une trajectoire de bezier si ça tourne

  //image( obstacle, obstacleX-voitureX -obstacleY,  -50+height/2+obstacleY/10  ,1+ obstacleY/4,1+obstacleY/4);

  //image( obstacle, obstacleX -voitureX/2,  -50+height/2+obstacleY/30  ,1+ obstacleY/6,1+obstacleY/6);

  // finalement c est la ligiqye du jeu a rempenser, plus simple : les voitures aparaissent

  // au milieu de l ecran, joueur x n existe pas et on doit simplement

  // les eviter

  //image( obstacle, obstacleX-voitureX*2,  -50+height/2  ,100,100);

  

  //image( obstacle, voitureX,  -50+height/2  ,100,100);

  // on a une voiture qui apparait au milieu ( plus ou moins) de la

  // route et on doit l eviter

  //image( obstacle, obstacleX-obstacleY/7,  height/2  ,obstacleY/7,1+obstacleY/7);

  // obstacleX-obstacleY/7 :: permet de corriger l effet de grosissement pour qu il reste bien droit

  //if ( obstacleX> width/2)

  //image( obstacle, obstacleX,  height/2  ,obstacleY/7,1+obstacleY/7);

  //else

  

  //image( obstacle, obstacleX-obstacleY/7,  height/2  ,obstacleY/9,1+obstacleY/9);

  

  // pour ne pas avoir un defilement continue on a mis

  // un random negatif sur obstacleY, on

  // affichera donc obstacleY que lorsqu il sera positif

  if ( obstacleY >0)

  //image( obstacle, obstacleX-obstacleY/7,  height/2  ,obstacleY/9,1+obstacleY/9);

  

  image( obstacle, obstacleX-obstacleY/7,  height/2  ,obstacleY/4,1+obstacleY/4);

  

  

  

  

  /*  Gestion des disparition 

  du champs de vision des voitures

  

  */

  

  // la voiture s ecarte un peu si elle n est pas en façe

  if ( obstacleY > height-(height/2) )

  if( obstacleX + 50 > width/2 && obstacleX < width/2 + 50)

    {// a mettre en bas

    }

  else 

  // la voiture vire a droite ou gauchepour laisser passer ce taré

  if ( obstacleX > width/2) obstacleX+=4;

  else obstacleX-=4;

  

  

  // çe serait genial si on avait une pire animation a l ecran lorsqu on se grash

  

  

  

  

  // cockpitt, impact et gui devant

   fill(int(random(55))+200,255);

   // lorsque l on se prend un impact

   //rect(0,0, width, height);

   

  rect(-10,height/2+100+200,width+10,height/2);

  

  image(cockpitt,-10,300,width+10,height-300);

  

  

  

  // les inpact s afgichent la ou ils ont impactes

  

  // en agilete on maintient une version fonctionemlle meme si la class impact

  // n est pas encore là

  if ( impact >=1)

  image(i1,123,300,200,300);

  if ( impact >2)

  image(i2,423,500,200,300);

  if ( impact >3)

  image(i3,423,200,500,500);

  if ( impact >4)

  image(i4,123,200,700,700);

  if ( impact >5)

  image(i2,323,200,700,700);

  

  

  

  

  

   // affichagevduvregime moteur et de la vitesde

   fill(255);

   

   /*textSize(38);

   text( (int(random(45))+230) , width - 200, height-450);

   textSize(18);

   text( "km/h" , width - 180, height-430);

   */

   /*textSize(51);

   text( (int(random(45))+230) , width - 250, height-490);

   textSize(28);

   text( "km/h" , width - 180, height-490);

   */

   textSize(51);

   text( (int((random(5))+100+obstacleVitesse*9)) , width - 250, height-400);

   textSize(28);

   text( "km/h" , width - 180, height-400);

 

   

   //image(cockpitt,-10,height,width+10,height);


  if (mousePressed ) {


    if ( mouseX < width/2)

    {

      voitureX -= 12;

      // nouveau systeme de jeu

      //obstacleX+=12;

      //pour eviter de tricher, si on se colle a gauche continuellement

        if ( voitureX > 50)

        obstacleX+=12;

      

      

      ++panorama;

      

      // on fait bouger la route

      mouse += 12;if( mouse> width) mouse = width;

      

      

      }

      

      else

      // SUPERIEUR A LA MOITIEE DE L ECRAN

      {

        

        voitureX += 12;

        

        --panorama;

        

          // nouveau systeme de jeu

      //obstacleX-=12;

      //pour eviter de tricher, si on se colle a droite

        if ( voitureX < width-50)

        obstacleX-=12;

        

        mouse -=12;if( mouse < -width) mouse= -width;

      }

  }

  

  

  if ( voitureX > width-50) voitureX = width-50;

  if ( voitureX < 0) voitureX = 0;

  

  // Faire avancer l'obstacle et v����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rifier s'il touche la voiture

  obstacleY += obstacleVitesse;

  

  if (obstacleY > height) {

    

    // noiveau systeme du jeux plus simple

    //obstacleX = width/2;//  random(width - 50);

    // plus ou moins

    //obstacleX = width/2+random(49);//

    //pour une difficulté equitable, kes voitures

    // doivent apparaître 

    // un peu decalées

    // pour eviter que le joueur fasse du jim canard repetitif surtout !

    switch(int(random(2)))

    {

      case 1: obstacleX = width/2+random(149);//

      break;

      case 2 :obstacleX = width/2-random(149);//

      break;

      default: obstacleX = width/2;//

    }

    

    

    //obstacleY = -50;

    // pour ne pas qu il y est un defilement continue d'obstacle

    obstacleY = -300-random(300);

    // c'est la nuit donc pas trop de monde

    

    

    score++;

    obstacleVitesse += 0.5; // augmenter la vitesse de l'obstacle

  }

   else 

   

   //if (obstacleY + 50 > voitureY && obstacleX + 50 > voitureX && obstacleX < voitureX + 50)

    

   if (obstacleY + 50 > voitureY && obstacleX + 50 > width/2 && obstacleX < width/2 + 50)

    {

    ++impact;

    

    // rajoute une image d impact sur le parebrise

    

    // nouveau systeme de jeux plus simple

    obstacleX = width/2;//random(width - 50);

    // plus ou moins

    obstacleY = -50;

    --score;

    // on va ��������tres sympas

    obstacleVitesse -= 0.5;

    

    if ( impact > 5)

    gameOver();

  }

  

  

  

  

  

  

  

  if ( DEBUG)

  {

  // Afficher la voiture

  fill(255, 0, 0);

  rect(voitureX, voitureY, 50, 100);

  

  // Afficher l'obstacle

  fill(0, 255, 0);

  rect(obstacleX, obstacleY, 50, 50);

  }

  

  

  

  popMatrix();

  

  

  

  

  

  

  // Afficher le score

  fill(255);

  //textSize(28);

  /*textAlign(RIGHT);

  text("Score : " + score, width - 20, 80);

  // on a droit a 5 collisions max

  text("Impact : " + impact, width - 20, 120);

  */

  

  textSize(28);

  textAlign(RIGHT);

  text("Score : " + score, width - 20, 80);

  // on a droit a 5 collisions max

  text("Impact : " + impact, width - 20, 120);

  

  text("mousex : " + mouseX/100, width - 230, 120);

  

  text("mousey : " + mouseY, width - 230, 140);

  

  

  

}


void gameOver() {

  textAlign(CENTER);

  textSize(64);

  fill(255, 0, 0);

  text("GAME OVER... \n dans la vrais bie vous n auriez \n eux droit qu a un deul crash", width / 2, height / 2);

  noLoop();

}














/************

  

    les traits de vitesse


*////////////




class Etoiles

{

  

  ArrayList<Star> stars;

int numStars = 100;


  Etoiles() {

 // size(800, 600, P3D);

  // Initialisation des ��toiles

  stars = new ArrayList<Star>();

  for (int i = 0; i < numStars; i++) {

    float x = random(-width, width);

    float y = random(-height, height);

    float z = random(width);

    stars.add(new Star(x, y, z));

  }

}


// trait.drawEtoile()

void drawEtoile() {

  pushMatrix();

 

  // tourne lorsque le joueur tourne evidemment

  translate(mouseX, height/2);

  

  // Mise �� jour et affichage des ��toiles

  for (Star star : stars) {

    star.update();

    star.display();

  }

  

  popMatrix();

  

}


class Star {

  float x, y, z;

  float pz;  // Position z précédente

  

  Star(float x, float y, float z) {

    this.x = x;

    this.y = y;

    this.z = z;

    pz = z;

  }

  

  void update() {

    // D��placement de l'étoile vers l'avant

   // VITESSE

    z = z - 100;

    

    // Réinitialisation de la position une fois que l'étoile est sortie de l'écran

    if (z < 1) {

      z = width;

      x = random(-width, width);

      y = random(-height, height);

      pz = z;

    }

  }

  

  void display() {

    fill(255);

    noStroke();

    

    // Conversion des coordonn��es 3D en coordonnées 2D

    float sx = map(x / z, 0, 1, 0, width);

    float sy = map(y / z, 0, 1, 0, height);

    

    // Calcul de la taille de l'��toile en fonction de sa profondeur

    //float r = map(z, 0, width, 8, 0);

    

    // Dessin de l'��toile

    // ELLIPSE

    

    //rect(sx, sy, r, r);

   // rect(sx, sy, 1, 1);

    // Dessin d'un trait pour créer une traînée

    float px = map(x / pz, 0, 1, 0, width);

    float py = map(y / pz, 0, 1, 0, height);

    stroke(255);// sx et sy

    fill(255,34);

    //rect(px, py, 2, 2);

    // on affiche que les traits du haut

   // if ( sy < 100)

   // on reduit sy poir ne pas qu il touche le cockpitt

   if ( sy > 200) {

     px=0;

     py=0;

     

     }

     strokeWeight(int(sy/100)); 

     // pour ne pas avoir

     if ( sy < 100)

    line(px, py, sx, sy);

    noStroke();

    

    

    // Mise à jour de la position z précédente

    pz = z;

  }

}


}


 Etoiles trait = new Etoiles();



Commentaires