Bonjour à tous, je suis nouvelle sur ce forum et viens de commencer la programmation cette année.
Ayant choisi la spécialité ISN au bac, je dois réaliser un jeu sur processing, mais voilà, je suis bloquée et fais donc appel à votre aide. Il s'agit d'un jeu où l'on doit réaliser un hamburger mais mon probléme est que les aliments ne s'empile pas tous correctement, de plus j'ai du mal a faire tomber mes objets de façon répétitive.
Voici mon programme:
int fond;// variable globale qui permettra d'empiler les aliments.
float x;
float y;
float vitesse;
PImage painporteur;
PImage salade;
PImage cornichon;
PImage fromage;
PImage oignon;
PImage pain;
PImage steak;
PImage tomate;
Painporteur monPainporteur = new Painporteur();
Salade maSalade= new Salade(5);
Cornichon monCornichon = new Cornichon(5);
Fromage monFromage = new Fromage(5);
Oignon monOignon = new Oignon(5);
Pain monPain = new Pain(5);
Steak monSteak = new Steak(5);
Tomate maTomate = new Tomate(5);
void setup(){
size(1300,675);
smooth();
painporteur=loadImage("painporteur.png");
salade=loadImage("salade.png");
cornichon=loadImage("cornichon.png");
fromage=loadImage("fromage.png");
oignon=loadImage("oignon.png");
pain=loadImage("pain.png");
steak=loadImage("steak.png");
tomate=loadImage("tomate.png");
}
void draw(){
background(0);
cursor(HAND);
monPainporteur.display();
maSalade.contact();
maSalade.display();
monCornichon.display();
monCornichon.contact();
monFromage.display();
monFromage.contact();
monOignon.display();
monOignon.contact();
monPain.display();
monPain.contact();
monSteak.display();
monSteak.contact();
maTomate.display();
maTomate.contact();
}
class Painporteur{
float x;
float y;
Painporteur(){
x=0;
y=665;
}
void display() {
stroke(0);
fill(175);
if (mouseX<width-130) x = mouseX;
else x=width-130;
image(painporteur,x,600);
}
}
class Salade{
float x;
float y;
float vitesse;
int fond=580;
int touche;//il a atterri sur le sandwich
Salade( float nouvY){
x=random(30,1160);
y=nouvY;
vitesse=random(1,1.5);
touche=0;
}
void display(){
image(salade,x,y,175,300);
y+=vitesse;
}
void contact(){
if(((y<fond)&&( y>fond-10))&&((x>monPainporteur.x-15)&&(x<monPainporteur.x+15))){
vitesse = 0; fond=fond-40;
touche =1;}
if (touche==1) x=monPainporteur.x;
}}
class Cornichon{
float x;
float y;
float vitesse;
int fond=500;
int touche;//il a atterri sur le sandwitch
Cornichon(float nouvY){
x=random(30,1160);
y=nouvY;
vitesse=random(1,1.5);
touche=0;
}
void display(){
image(cornichon,x,y);
y+=vitesse;
}
void contact(){
if(((y<fond)&&( y>fond-10))&&((x>monPainporteur.x-15)&&(x<monPainporteur.x+15))){
vitesse = 0; fond=fond-40;
touche =1;}
if (touche==1) x=monPainporteur.x;
}}
class Fromage{
float x;
float y;
float vitesse;
int fond=600;
int touche;//il a atterri sur le sandwitch
Fromage(float nouvY){
x=random(30,1105);
y=nouvY;
vitesse=random(1,1.5);
touche=0;
}
void display(){
image(fromage,x,y);
y+=vitesse;
}
void contact(){
if(((y<fond)&&( y>fond-10))&&((x>monPainporteur.x-15)&&(x<monPainporteur.x+15))){
vitesse = 0; fond=fond-40;
touche =1;}
if (touche==1) x=monPainporteur.x;
}}
class Oignon{
float x;
float y;
float vitesse;
int fond=500;
int touche;//il a atterri sur le sandwitch
Oignon(float nouvY){
x=random(30,1145);
y=nouvY;
vitesse=random(1,1.5);
touche=0;
}
void display(){
image(oignon,x,y);
y+=vitesse;
}
void contact(){
if(((y<fond)&&( y>fond-30))&&((x>monPainporteur.x-30)&&(x<monPainporteur.x+30))){
vitesse = 0; fond=fond-40;
touche =1;}
if (touche==1) x=monPainporteur.x;
}}
class Steak{
float x;
float y;
float vitesse;
int fond=555;
int touche;//il a atterri sur le sandwitch
Steak(float nouvY){
x=random(30,1100);
y=nouvY;
vitesse=random(1,1.5);
touche=0;
}
void display(){
image(steak,x,y);
y+=vitesse;
}
void contact(){
if(((y<fond)&&( y>fond-30))&&((x>monPainporteur.x-30)&&(x<monPainporteur.x+30))){
vitesse = 0; fond=fond-40;
touche =1;}
if (touche==1) x=monPainporteur.x+25;
}}
class Tomate{
float x;
float y;
float vitesse;
int fond=625;
int touche;//il a atterri sur le sandwitch
Tomate(float nouvY){
x=random(30,1125);
y=nouvY;
vitesse=random(1,1.5);
touche=0;
}
void display(){
image(tomate,x,y);
y+=vitesse;
}
void contact(){
if(((y<fond)&&( y>fond-30))&&((x>monPainporteur.x-30)&&(x<monPainporteur.x+30))){
vitesse = 0; fond=fond-40;
touche =1;}
if (touche==1) x=monPainporteur.x;
}}
class Pain{
float x;
float y;
float vitesse;
int touche;//il a atterri sur le sandwitch
Pain(float nouvY){
x=random(30,1110);
y=nouvY;
vitesse=random(1,1.5);
touche=0;
}
void display(){
image(pain,x,y);
y+=vitesse;
}
void contact(){
if(((y<fond)&&( y>fond-30))&&((x>monPainporteur.x-30)&&(x<monPainporteur.x+30))){
vitesse = 0; fond=fond-40;
touche =1;}
if (touche==1) x=monPainporteur.x;
}}
Je vous remercie par avance, en espérant recevoir des réponses car c'est urgent.
Dernière modification par muse (2015-05-02 13:53:45)
Hors ligne
Ton projet est rigolo.
Pour commencer, j'ai du retailler toutes tes images pour qu'elles soient de la même taille (125 x 88).
Pour moi, il vaut mieux créer une classe aliment générique.
Ensuite, il faut deux liste une des aliments à mettre qui diminue à chaque fois qu'un aliment est dans le hamburger et une autre qui est le hamburger qui grandit à chaque aliment.
ArrayList<Aliment> aliments; ArrayList<Aliment> hamburger;
La classe Aliment devrait contenir comme variable la position de l'aliment, sa vitesse et une image à afficher.
class Aliment { float x, y, vitesse; PImage img; Aliment(String s) { x = random(30, 1160); y = 0; vitesse = random(5, 10); img = loadImage(s); } }
Il faut ensuite initialiser les listes et les éléments de la liste d'aliments et l'unique élément de la liste hamburger qui est composé du pain porteur.
J'ai surcharger le constructeur avec un constructeur qui a comme paramètre supplémentaire s'il fait partie du hamburger. et donc sa position y est fixe.
Voici les éléments pour commencer.
Hors ligne
Je te remercie énormément! C'est vrai que l'idée de créer une classe aliment m'a l'air très bien, je vais tester ça et je te remercie encore une fois.
Hors ligne
Par contre avec quoi as tu retaillé les images? Car avec Gimp je n'arrive qu'à redimensionner la fenêtre, mais pas l'image en elle même car il y a un canal alpha.
Hors ligne
Je l'ai fait avec Gimp, tu fais une sélection de 125 x 88 que tu places autour de l'image puis tu vas dans Image / Rogner sur la sélection. Et hop !
Sinon, voici les images retaillées :
Hors ligne
Ah d'accord, je ne savais pas, merci beaucoup c'est vraiment gentil!
Hors ligne
Donc la classe Aliment devra comporter toutes les autres classes (tomates, salade...), c'est bien ça? Parce que je sais pas exactement comment m'y prendre, s'il ne faut mettre qu'une image dans la classe Aliment
Hors ligne
Tu oublies les autres classes. Il n'y a que la classe Aliment, ce sont les instances de la classe qui représentent les différents aliments. Tu peux les instancier comme cela :
La variable img de la classe s'initialise pour chaque instance de la classe Aliment avec un chemin vers une image différent (cornichon.png …)
Hors ligne
Ah d'accord j'vais tester ça, merci beaucoup de ton aide
Hors ligne
Voilà à quoi ressemble mon programme pour l'instant, je n'ai pas encore fait l'empilement avec les listes car je ne sais pas comment m'y prendre, je dois utiliser une boucle?
ArrayList<Aliment> aliments;
ArrayList<Aliment> hamburger;
void setup(){
size(1300,675);
smooth();
aliments = new ArrayList<Aliment>();
aliments.add(new Aliment("salade.png"));
aliments.add(new Aliment("cornichon.png"));
aliments.add(new Aliment("fromage.png"));
aliments.add(new Aliment("oignon.png"));
aliments.add(new Aliment("steak.png"));
aliments.add(new Aliment("tomate.png"));
aliments.add(new Aliment("pain.png"));
hamburger = new ArrayList<Aliment>();
}
void draw(){
background(0);
cursor(HAND);
for (Aliment a : aliments) {
a.display();
}
for (Aliment a : hamburger){
a.display();
}
}
class Aliment {
float x, y, vitesse;
PImage img; PImage painporteur;
Aliment(String s) {
x = random(30, 1160);
y = 0;
vitesse = random(5, 10);
img = loadImage(s);
painporteur = loadImage("painporteur.png");
}
void display(){
imageMode(CENTER);
image(img,x,y);
image(painporteur,mouseX,645);
y+=vitesse;
}
}
Hors ligne
Bonjour,
Le pain porteur est aussi un aliment donc il n'a rien à faire dans la classe. C'est un aliment et c'est le premier étage de ton hamburger, donc il faut l'inclure dans ta liste de hamburger.
Dans tes classes, n'hésite pas à séparer les méthodes. La fonction affichage est différente de la méthode de mise à jour des paramètres.
Voilà ce que je te propose de faire :
ArrayList<Aliment> aliments; ArrayList<Aliment> hamburger; void setup() { size(1300, 675); smooth(); aliments = new ArrayList<Aliment>(); aliments.add(new Aliment("salade.png")); aliments.add(new Aliment("cornichon.png")); aliments.add(new Aliment("fromage.png")); aliments.add(new Aliment("oignon.png")); aliments.add(new Aliment("steak.png")); aliments.add(new Aliment("tomate.png")); aliments.add(new Aliment("pain.png")); hamburger = new ArrayList<Aliment>(); hamburger.add(new Aliment("painporteur.png", true)); imageMode(CENTER); } void draw() { background(0); cursor(HAND); for (Aliment a : hamburger) { a.miseAjourEmpilement(); a.display(); } for (Aliment a : aliments) { a.miseAjour(); a.display(); } } class Aliment { float x, y, vitesse; PImage img; Aliment(String s) { x = random(30, 1160); y = 0; vitesse = random(5, 10); img = loadImage(s); } Aliment(String s, boolean e) { this(s); if (e) { y = height - 100; } } void miseAjourEmpilement() { x = mouseX; } void miseAjour() { y+=vitesse; } void display() { image(img, x, y); } }
Ensuite, il faut que tu vérifies dans la méthode miseAJour si l'aliment qui choie est dans la zone de contact du hamburger. Comme toutes les images ont la même hauteur, il est simple de calculer la hauteur actuelle du hamburger.
S'il est dans la zone alors la méthode doute renvoyer true et ainsi tu pourras ajouter cette instance à la liste hamburger et la retirer de la liste aliments.
Hors ligne
Bonjour, j'ai essayé de faire ce que tu m'as proposé pour l'empilement mais le problème est que le joueur doit empiler le maximum d'aliments jusqu'à ce que le pain du haut arrive, il ne doit donc en avoir qu'un seul et la hauteur du hamburger sera aléatoire.
Hors ligne
J'ai eu un problème pour changer les aliments de listes, voici mon programme:
ArrayList<Aliment> aliments;
ArrayList<Aliment> hamburger;
PImage burger;
void setup() {
size(1300, 675);
smooth();
burger=loadImage("Burger.png");
image(burger,0,0);
aliments = new ArrayList<Aliment>();
aliments.add(new Aliment("salade.png"));
aliments.add(new Aliment("cornichon.png"));
aliments.add(new Aliment("fromage.png"));
aliments.add(new Aliment("oignon.png"));
aliments.add(new Aliment("steak.png"));
aliments.add(new Aliment("tomate.png"));
aliments.add(new Aliment("pain.png"));
hamburger = new ArrayList<Aliment>();
hamburger.add(new Aliment("painporteur.png", true));
imageMode(CENTER);
}
void draw() {
cursor(HAND);
background(burger);
for (Aliment a : hamburger) {
a.miseAjourEmpilement();
a.display();
}
for (Aliment a : aliments) {
a.miseAjour();
a.display();
}
}
class Aliment {
float x, y, vitesse;
PImage img;
Aliment(String s) {
x = random(30, 1160);
y = 0;
vitesse = random(4, 6);
img = loadImage(s);
}
Aliment(String s, boolean e) {
this(s);
if (e) {
y = height - 100;
}
}
void miseAjourEmpilement() {
x = mouseX;
aliments.add(new Aliment("salade.png"));
aliments.add(new Aliment("cornichon.png"));
aliments.add(new Aliment("fromage.png"));
aliments.add(new Aliment("oignon.png"));
aliments.add(new Aliment("steak.png"));
aliments.add(new Aliment("tomate.png"));
aliments.add(new Aliment("pain.png"));
}
void miseAjour() {
int touche=0;
int largeur=mouseX;
int hauteur=88;
int fond= height - 90;
y+=vitesse;
if(((y<fond)&&(y>fond-50))&&((x>largeur-40)&&(x<largeur+40))){
touche = 1;
fond = fond - hauteur;
vitesse = 0;}
if (touche==1){
x = mouseX;
aliments.remove(new Aliment("salade.png"));
aliments.remove(new Aliment("cornichon.png"));
aliments.remove(new Aliment("fromage.png"));
aliments.remove(new Aliment("oignon.png"));
aliments.remove(new Aliment("steak.png"));
aliments.remove(new Aliment("tomate.png"));
aliments.remove(new Aliment("pain.png"));
}
}
void display() {
image(img, x, y);
}}
Hors ligne
Il faut bien que tu comprennes ce qui est dans la classe et hors de la classe.
Regarde des tutoriels sur les classes , la notion d'instance, tu mélanges un peu tout. Voici, ce que j'ai fait :
ArrayList<Aliment> aliments; ArrayList<Aliment> hamburger; void setup() { size(1300, 675); smooth(); noCursor(); aliments = new ArrayList<Aliment>(); aliments.add(new Aliment("salade.png")); aliments.add(new Aliment("cornichon.png")); aliments.add(new Aliment("fromage.png")); aliments.add(new Aliment("oignon.png")); aliments.add(new Aliment("pain.png")); aliments.add(new Aliment("steak.png")); aliments.add(new Aliment("tomate.png")); hamburger = new ArrayList<Aliment>(); hamburger.add(new Aliment("painporteur.png", true)); imageMode(CENTER); cursor(HAND); } void draw() { background(0); for (Aliment a : hamburger) { a.miseAJour(); a.affichage(); } for (int i = 0; i < aliments.size (); i++) { Aliment a = aliments.get(i); boolean empilement = a.miseAJour(hamburger.size()); if (empilement) { hamburger.add(a); aliments.remove(a); } a.affichage(); } } class Aliment { float x, y, vitesse; float decalage; PImage img; Aliment(String s) { x = random(30, 1160); y = 0; vitesse = random(5, 10); img = loadImage(s); decalage = 0; } Aliment(String s, boolean e) { this(s); if (e) { y = height - 100; } } void miseAJour() { x = mouseX - decalage; } boolean miseAJour(int empilement) { if ((x > mouseX - 40) && (x < mouseX + 40) && (y > height - 110 - empilement * img.height / 4) && (y < height - 100 - empilement * img.height / 4)) { y = height - 100 - empilement * img.height / 4; decalage = mouseX - x; return true; } else { y += vitesse; if (y > height) { x = random(30, 1160); y = 0; } return false; } } void affichage() { image(img, x, y); } }
Hors ligne
Bonjour,
Ah d'accord, oui en effet, j'ai un peu tout mélangé ce qui a crée un gros bug. Merci beaucoup, j'ai regardé des tutos notamment ceux de Shiffman qui sont trés bien
Juste une derniere chose, par quel moyen je pourrais arrêter le jeu ("Game over" ou "You win") lorsque le pain final est posé? (si le pain est posé avant que tous les autres aliments soient déjà attraper alors on a perdu, mais s'il estposé en dernier alors on a gagné)
Dernière modification par muse (2015-05-12 20:10:48)
Hors ligne