Bonjour à tous !
Avec un groupe d'amis nous sommes actuellement entrain de réaliser un casse brique en Java. Nous avons presque atteint notre bute, toutefois il nous reste quelques trucs à régler :
IMPORTANT :
- L'ajout de collision sur les briques et les faire disparaitre quand toucher.
- L'ajout de vie.
OPTIONNEL :
- Ajouter une image en fond.
Alors pour la collision des briques nous avons une petite idée mais on ne sait pas vraiment comment réaliser cela. On penser parcourir chaque élément du tableau avec une boucle mais pour ajouter la collision nous n'avons pas d'idée.
Pour ce qui est des vies, nous y sommes presque. Nous avons un menu qui nous permet de relancer le jeux ou de le quitter, pour quitter ça marche, pour relancer aussi sauf que cela garde l'ancienne fenêtre active (ce qui pause problème car elle comporte un son). J'ai déjà essayer d'ajouter un this.dispose(); mais cela refuse de compiler après coup.
Et pour l'image, celle-ci se positionne au dessus de tout nos JComponent ce qui est un peu gênant ![]()
Je suis contient que je demande beaucoup d'aide, mais le temps joue contre nous alors si une tête de plus pouvez nous aider ce serait génial ! ![]()
Les codes actuelles : (ne comprenant pas le son ni l'image car il rajouterait du code inutile au problème rencontré).
Classes APPLI (gérant le lancement de l'application).
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Appli extends JFrame implements KeyListener{
public Dessin d;
public Balle balle;
public Raquette raq;
public Appli(){
super("Casse Brick");
balle = new Balle();
raq = new Raquette();
balle.setRaquette(raq);
raq.setBalle(balle);
d = new Dessin(balle,raq);
this.addKeyListener(this);
this.setContentPane(d);
this.setSize(600,600);
this.setVisible(true);
this.setResizable(false);
}
public static void main (String[] args){
new Appli();
}
public void keyPressed(KeyEvent e){
int i=e.getKeyCode();
switch(i){
case KeyEvent.VK_SPACE:
d.go();
break;
case KeyEvent.VK_RIGHT:
raq.deplaceDroite();
break;
case KeyEvent.VK_LEFT:
raq.deplaceGauche();
break;
}
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){
}
}
La classe Balleimport javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Balle extends JComponent implements Runnable{
public int x, y, taille;
private int dx,dy;
private Raquette raq;
private Balle balle;
Thread t=new Thread();
int raqx;
protected boolean enCours = false;
private int life;
public void setRaquette(Raquette raq){
this.raq = raq;
}
public Balle(){
super();
taille = 10;
this.x = 295;
this.y = 490;
this.dx = 7;//deplacement des x
this.dy = -5;//déplacement des y
//t = new Thread(this);
}
public boolean enCours(){return this.enCours;}
public void paintComponent(Graphics g){
g.fillOval(x,y,taille,taille);
}
public void demarre(){
this.enCours = true;
this.t=new Thread(this);
this.t.start();//lance le run!
}
public void run(){
while(y != -1 && enCours && life<3){
try{
Thread.sleep(20);
}catch(InterruptedException ie){}
x = x + dx;
y = y + dy;
if(y+dy<0){dy=-dy;}
if(x+dx <= 0 || x+dx >= 590){dx=-dx;}
raqx=raq.getValeur();
int raqx2=raqx+100;
if(y>=492 && y<=496 && x<=raqx2 && x+taille>=raqx){
dy=-dy;
}
if(y>600){
reset();
dy=-dy;
life=life+1;
}
if(life==3){
System.exit(0);
}
this.getParent().repaint();
}
}
public void reset(){
this.x=295;
this.y=490;
this.taille=10;
raq.setX(250);
enCours = false;
}
}
La classe Raquette :import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Raquette extends JComponent
{
public int x;
private boolean descend,droite;
private Balle balle;
public void setBalle(Balle b){
this.balle = b;
}
public Raquette(){
super();
x = 250;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.fillRect(x,500,100,10);
}
public void deplaceGauche(){
if(x>0){
x = x-15;
}
else{
}
repaint();
}
public void deplaceDroite(){
if(x<500){
x = x+15;
}
else{
}
repaint();
}
protected int getValeur(){
return x;
}
protected void setX(int x){
this.x=x;
}
}
La classe Brique :import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Brick extends JComponent{
private int x, y;
private Color c;
public static final Color[] coul = {Color.YELLOW,Color.BLACK,Color.RED,Color.BLUE,Color.GREEN};
public Brick(int x, int y){
super();
this.x = x+2;
this.y = y+1;
this.c = c;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(this.c);
g.fillRect(x*70,y*30,50,10);
}
}
Et finalement la classe Dessin( car nous avons du "redessiner certains éléments pour les intégrer dans la classe appli).import javax.swing.*;
import java.awt.*;
public class Dessin extends JPanel{
Balle b;
Raquette r;
Brick[][] bricks;
public Dessin(Balle b, Raquette r){
super();
bricks = new Brick[5][12];
for(int i = 0 ; i < 5 ; i++){
for(int j = 0 ; j < 12 ; j++){
bricks[i][j] = new Brick(i,j);
this.add(bricks[i][j]);
}
}
this.b = b;
this.r = r;
this.add(this.b);
this.add(this.r);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
this.b.paintComponent(g);
this.r.paintComponent(g);
for(int i = 0 ; i < 5 ; i++){
for(int j = 0 ; j < 12 ; j++){
bricks[i][j].paintComponent(g);
}
}
}
public void go(){
if(!this.b.enCours()){this.b.demarre();}
}
}
Voila, merci d'avance et bonne journée.
c'est quoi la question en fait ?
Oui effectivement si j'oublie de préciser
en somme suggérer des pistes pour les problèmes qu'il nous reste à résoudre
Collision entre la balle et une brique, ça revient à faire une collision entre un cercle et un rectangle.
Lien : https://openclassrooms.com/courses/theorie-des-collisions/formes-simples
Oui et réfléchir à ce genre de cas : Frame1 pas de collision, Frame2 tu es déjà rentré dans la brique, Frame3: ta balle va rebondir du mauvais côté
J'ai regardé pour les collisions je ne suis pas sur de tout comprendre, et qu'est ce qu'une frame exactement ? Je n'ai pas encore vue cette notion en cours ![]()
J'ai parcouru quelques sites et chacun propose plein de solution du coup je suis un perdu.
J'ai demandé de l'aide à mon prof tout à l'heure, il nous a donné comme conseil de récupérer la position des briques pour la comparer à la position de la balle qu'il faut aussi récupérer puis faire en sorte qu'il y ai les collisions. Sur le coup ça me semble clair, toutefois je n'ai absolument aucune idée de la façon dont récupérer la position de chaque brique sachant que c'est un tableau.
Alors j'avais fait un cass brick en java.
C'était y'a plus d'1 ans donc je pourrais pas t'aider en précision mais effectivement y'avais utiliser un tableau ou je rangeais toutes les bricks comme ça je tcheckais en permanence si la boule est rentré en collision avec une brick.
Pour les collisions je te conseille de regarder du coder overlaps() (en gros ça regarde si quelque chose rentre en contact avec le rectangle)
J'ai pas regardé le code mais pour l'image assure toi que tu draw l'image avant de draw tes JCompenent
En Swing?
![]()
Voila , on a récupérer la position de la ballepar rapport à celle de chaque brique maintenant il suffit d'importer le tableau dans la classe balle pour ajouter les collisions, des idées ? ![]()
Ce que je ferrai si j’étais toi :
Dans la classe Brique, un arraylist de brique STATIC accompagnée de son getter.
A chaque instanciation de brique, tu rajoute celle ci dans l'arraybricks.add(this);
Ainsi, a chaque deplacement de la balle, avant de la redessiner, tu verifie que aucuns points de la circonférence n'entre en contact avec aucunes briques. Si c'est pas le cas, tu supprime la brique en question et tu la retire de la liste avant de gerer la nouvelle trajectoire de la balle.