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
Enregistrer un commentaire