Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2015-01-06 20:15:28 Pong tout seul

Dante235
membre
Date d'inscription: 2014-12-05
Messages: 14

Pong tout seul



Bonjour je travail sur une sorte de jeu pong un peu particulier, il s'agit d'un jeu pong tout seul et inversé, la balle se trouvant dans un arc non fermé, l'idée est que la balle soit renvoyé  à l'extérieur de l'arc qui est mouvant les point sont soustrait d'un compteur chaque fois que la balle sortira de l'ecran, pour le moment je suis parvenu à obtenir ce que je souhaitais en terme de forme du jeu et d'animation, ce qui me pose problème par contre concerne le système de détection de collision, en effet j'aimerais que la raquette circulaire renvoie la balle comme dans le jeu original mais là, après pas mal de recherche je ne vois pas trop comment traiter le problème (avec une raquette plate c'est assez facile mais bon ici ???) quelqu'un aurait-il une idée en vous remerciant d'avance.

float angle = radians(250);
float c=cos(angle);
//float tailleBalle = 13;

float nouvellePosXBalle = 250;
float nouvellePosYBalle = 250;
float deplacementXBalle = 2;
float deplacementYBalle = -0.6;

void setup(){
  rotate(radians(90));
  size(500,500);
  smooth(4);
  ellipseMode(CENTER);
  noLoop();
}

void draw(){

background(255);
action();
dessinerBalle();
mouvementBalle();
dessinerRaquette();
rebond();
}

void keyPressed(){
loop();
}
void mousePressed(){
loop();
}


void action(){
  if (key == CODED) {
    if (keyCode == LEFT) {
      c+=1;
    }
      if(keyCode == UP){
      c=c;
   
    }else if (keyCode == RIGHT) {
      c-=1;
      
    }
  }
}

void rebond(){
if ( (nouvellePosXBalle+6 > width && deplacementXBalle > 0) || (nouvellePosXBalle-6 < 0 && deplacementXBalle < 0) ) {
   deplacementXBalle = -deplacementXBalle;
}
if ( (nouvellePosYBalle+6 > width && deplacementYBalle > 0) || (nouvellePosYBalle-6 < 0 && deplacementYBalle < 0) ) {
   deplacementYBalle = -deplacementYBalle;
}
}

void dessinerBalle(){
//tailleBalle = tailleBalle +0.5;
fill(200,0,0);
noStroke();
ellipse(nouvellePosXBalle,nouvellePosYBalle,13,13);
}

void mouvementBalle(){
nouvellePosXBalle = nouvellePosXBalle + deplacementXBalle;
nouvellePosYBalle = nouvellePosYBalle + deplacementYBalle;
}

void dessinerRaquette(){
translate(width/2,height/2);
rotate(radians(c));
noFill();
stroke(200,0,0);
strokeWeight(13);
strokeCap(ROUND);
arc(0,0,250,250,radians(-70),angle);
}

Hors ligne

 

#2 2015-01-08 08:57:36 Re : Pong tout seul

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Pong tout seul



Bonjour,

Il existe un objet dans Processing qui est très utile pour ce type de problème :
https://www.processing.org/reference/PVector.html

Le PVector permet de stocker des coordonnées et de faire des opérations aisément d'addition de vecteurs etc.

Donc, ton code peut se simplifier. Voici une approche perfectible (il faut implémenter la sortie de le balle en fonction de l'angle) :

PVector position, vitesse, centre;
float angle, taille;
int rayonBalle, rayonRaquette, epaisseurRaquette;

void setup() {
  size(500, 500);
  position = new PVector(200, 200);
  vitesse = new PVector(2, -0.6);
  centre = new PVector(width / 2, height / 2);
  angle = 0;
  taille = 360;
  rayonBalle = 7;
  rayonRaquette = 125;
  epaisseurRaquette = 14;
  smooth(4);
  ellipseMode(CENTER);
  noLoop();
}

void draw() {
  background(255);
  action();
  dessinerBalle();
  mouvementBalle();
  dessinerRaquette();
  rebond();
}

void keyPressed() {
  loop();
}

void mousePressed() {
  loop();
}

void action() {
  if (keyPressed) {
    if (key == CODED) {
      if (keyCode == LEFT) {
        angle += 2;
      }
      if (keyCode == RIGHT) {
        angle -= 2;
      }
    }
  }
}

void rebond() {
  if (position.dist(centre) > (rayonRaquette - rayonBalle - epaisseurRaquette / 2)) {
    float t = vitesse.mag();
    PVector v = new PVector(position.x - centre.x, position.y - centre.y);
    float arc = PVector.angleBetween(vitesse, v);
    v.mult(-1);
    v.rotate(arc);
    v.normalize();
    v.setMag(t);
    vitesse = v;
    taille -= 10;
  }
}

void dessinerBalle() {
  fill(200, 0, 0);
  noStroke();
  ellipse(position.x, position.y, 2 * rayonBalle, 2 * rayonBalle);
}

void mouvementBalle() {
  position.add(vitesse);
}

void dessinerRaquette() {
  translate(centre.x, centre.y);
  rotate(radians(angle));
  noFill();
  stroke(200, 0, 0);
  strokeWeight(epaisseurRaquette);
  strokeCap(ROUND);
  arc(0, 0, 2 * rayonRaquette, 2 * rayonRaquette, 0, radians(taille));
}

Hors ligne

 

#3 2015-01-09 19:12:01 Re : Pong tout seul

Dante235
membre
Date d'inscription: 2014-12-05
Messages: 14

Re: Pong tout seul



Salut Mushussu
Merci pour le code je vais le potasser big_smile, navré je n'ai pas été trop clair sur mon explication du jeu effectivement la balle rebondie à l'intérieur du cercle, mais la raquette ne change pas de taille par contre la balle oui (peut etre de quelques pixesl tout les 10 rebonds par exemple ou suivant un compteur je n'ai pas encore décidé big_smile ) donc l'objectif est de faire sortir la balle du cercle par le petit trou (c'est probablement pour cette raison que tu m'indiquais "il faut implémenter la sortie de le balle en fonction de l'angle" je suppose? wink le plus rapidement et donc marquer un point qui se soustraira d'un compteur affichant 999

Bref je vais essayer de comprendre le fonctionnement de Pvector, je te remercie d'avance de ne pas me donner la solution tout de suite wink J'épluche en ce moment la doc de référence sur le site de processing mais j'entrevois déjà l'intérêt de cette classe. (même si mon cerveau approche la fusion:)


Par contre j'en profite pour poser une autre question sous forme de piste différente qui m'est venue à l'esprit (en bon feignant) je m'étais demandé s'il n'était pas possible de faire détecter par la balle la couleur de la raquette bon je sais que mon code est simpliste et ne fonctionne pas en rebond mais je le place quand même

int nouvellePosXBalle = 250;
int nouvellePosYBalle = 250;
int deplacementXBalle = 2;
int deplacementYBalle = -1;
int c;

void setup(){
  background(255);
  size(400,400);
  frameRate(15);
  }

void draw(){
  background(255);
  
  dessinArc();
  dessinCercle();
  rebond();
color c = get(nouvellePosXBalle,200);
println(red(c));
}


void dessinCercle(){
//  fill(200,0,0);
//  noStroke();
  stroke (128,0,0);
  strokeWeight(2);
  ellipse(nouvellePosXBalle,200,10,10);
  nouvellePosXBalle = nouvellePosXBalle + deplacementXBalle;

}

void rebond(){
if ( (nouvellePosXBalle+5 > width && deplacementXBalle > 0 ) || (nouvellePosXBalle-5 < 0 && deplacementXBalle < 0) ) {
   deplacementXBalle = -deplacementXBalle;
}
if(c==25){
  nouvellePosXBalle = -deplacementXBalle;
}

}

void dessinArc(){
  noFill();
  stroke(25,0,0);
  strokeWeight(13);
  arc(width/2,height/2, 250, 250, radians(-180), radians(0));
}

Juste pour savoir si c'est une piste envisageable.

Merci pour tout

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2025