C 'est un début de casse brique développé avec une structure orienté objet.
L'algorithme de collisions n'est pas totalement au point.
Source / Exemple :
import java.applet.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Event;
import java.lang.Math;
import java.awt.Point;
import java.util.*;
import java.io.*;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
;
// réalisé par fats
public class jeujeu extends Applet implements Runnable
{
public Raquette raquette;
public Balle boule;
public Menu menu;
public static boolean casse = false;
public Brique tableau [][] = new Brique [4][6]; // tableau d'objet de type Brique
int pt =0;
int largeur;
int hauteur;
public static int nbbrique = 24;
public static int direction =1; // indique le sens de deplacement de la boule ici (vers la droite : 1 / vers la gauche : -1)
public static int directionNS = 1; // vers le bas
public static boolean premierefois = true;
public static boolean perdu = false ;
public static boolean demarrage = true;
private Thread th;
Graphics g;
Graphics d; // servira au double buffer
private static int point ;
private Image Image;
public void init()
{
setBackground (Color.black);
boule = new Balle ();
raquette = new Raquette(50,165,35,6); // creation d'objets : raquette et balle
menu = new Menu();
int x =0;
int y=0;
for (int L= 0; L < 4;L++){ //ligne
for( int C = 0 ; C< 6 ; C++){ // colonne
tableau[L][C] = new Brique (x,y,25,15);
if (C==5){x=0;}
else {x=x+35;}}
y = y+25; }
}
public void start ()
{
th = new Thread (this);
th.start();
}
public void stop()
{
}
public void destroy()
{
}
public void run ()
{
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while (!(perdu) && !demarrage){
boule.move(); // appel de methode de deplacement
raquette.collisionboule(boule); // appel de methode de controle collision raquette
repaint();
try
{
Thread.sleep (15);
}
catch (InterruptedException ex)
{
}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
public void paint (Graphics g)
{
if(premierefois){
menu.presentation (g);
}
if(perdu){
menu.perdu(g);
}
raquette.dessiner(g);
boule.dessiner(g);
menu.score(g);
if (nbbrique >0){ // on vérifie que toutes les briques ne sont pas cassées
int L=0;
int C=0;
for ( int i= 0; i<6;i++){ // je commence par la premiere ligne dans le jeu en partant du bas
for (L=0; L<4;L++){
if (tableau[L][i].getcasse()==false){
tableau[L][i].collision(boule);
tableau[L][i].dessiner(g);
}
}
}
}
else {
jeujeu.perdu= true;
}
}
public void update (Graphics g)
{
Image = createImage (this.getSize().width, this.getSize().height);
d = Image.getGraphics ();
d.setColor (getBackground ());
d.fillRect (0, 0, this.getSize().width, this.getSize().height);
d.setColor (getForeground());
paint (d);
g.drawImage (Image, 0, 0, this);
}
public class Balle { // creation de la classe Balle
private int radius ;
private int posx ;
private int posy;
public int posx2;
public int posy2;
public int posx3;
public int posy3;
public int posx4;
public int posy4;
private int outdroit = 188; // delimitation de la zone de jeu
private int outgauche = 5;
private int outhaut = 5;
private int outbas = 178;
private int centrex, centrey;
public int dx=2,dy=2; // vitesse
public Balle (){
radius = 8; // rayon du cercle
posx=50;
posy = 150;
posx2 = posx + (radius*2) ;
posy2 = posy ;
posx3 = posx ;
posy3 = posy+ (radius*2); //
posx4 = posx3 + (radius*2); // x ------------------x2
posy4 = posy2 + (radius*2); // | |
// x3------------------ x4
}
public int getradius(){
return this.radius;
}
public int getX2 (){
return this.posx2;
}
public int getX3 (){
posx3 = posx ;
return this.posx3;
}
public int getX4 (){
posx4 = posx3 + (radius*2);
return this.posx4;
}
public int getY2 (){
return this.posy2;
}
public int getY3 (){
posy3 = posy+ (radius*2);
return this.posy3;
}
public int getY4 (){
posy4 = posy2 + (radius*2);
return this.posy4;
}
public int getcentrex () {
centrex = (posx + (radius/2));
return this.centrex;
}
public int getcentrey () {
centrey = (posy + ( radius/2));
return this.centrey;
}
public int getX (){
return this.posx;
}
public int getY(){
return this.posy;
}
public void setX(int x){
this.posx = x;
}
public void setY (int y){
this.posy = y;
}
public void move (int dx , int dy){
this.dx = dx;
this.dy = dy;
collision();
}
public void move (){
posx += dx;
posy += dy;
collision();
}
public void collision(){
if (posx < outgauche ){
dx = -dx; // repart vers la droite
direction = 1;
}
if (posx > outdroit ){
dx=-dx; // repart vers la gauche
direction =-1;
}
if(posy < outhaut ){
directionNS=-1;
dy =-dy;
}
if(posy >= outbas ){
directionNS = 1 ;
perdu = true;
}
}
public void dessiner( Graphics g){
g.setColor (Color.green);
g.fillOval(this.posx,this.posy, 2*radius, 2*radius); // la balle
g.setColor (Color.yellow);
g.fillOval(centrex, centrey, 5, 5); // le centre du cercle
}
} // fin classe Balle
public class Raquette { // creation de la classe raquette
protected int largeur;
protected int hauteur;
protected int posx ;
protected int posy;
private int posx2;
private int posy2;
private int posx3;
private int posy3;
private int posx4;
private int posy4;
private int dx,dy;
protected int centrex;
protected int centrey;
public Raquette(int x, int y, int largeur, int hauteur) {
this.largeur = largeur;
this.hauteur = hauteur;
point = 0;
this.posx = x;
this.posy = y;
posx2 = posx + largeur ;
posy2 = posy ;
posx3 = posx ;
posy3 = posy+ hauteur; //
posx4 = posx3 + largeur; // x ------------------x2
posy4 = posy2 + hauteur; // x3------------------x4
}
public int getcentrex () { // on calcul le centre de l'objet
centrex = (posx + (largeur/2));
return this.centrex;
}
public int getcentrey () {
centrey = (posy + (hauteur/2));
return this.centrey;
}
public int getX (){
return this.posx;
}
public int getX2 (){
posx2 = posx + largeur ;
return this.posx2;
}
public int getX3 (){
posx3 = posx ;
return this.posx3;
}
public int getX4 (){
posx4 = posx3 + largeur;
return this.posx4;
}
public int getY (){
return this.posy;
}
public int getY2 (){
posy2 = posy ;
return this.posy2;
}public int getY3 (){
posy3 = posy+ hauteur;
return this.posy3;
}public int getY4 (){
posy4 = posy2 + hauteur;
return this.posy4;
}
public void setX(int x){
this.posx = x;
}
public void setY(int y){
this.posy = y;
}
public void collisionboule (Balle balle){
this.dx = balle.dx ;
this.dy = balle.dy ;
if (balle.getX()>=this.posx+2 && balle.getX()<= this.posx + largeur-1){ // milieu raquette
if(balle.getY()>= this.posy-1){
balle.setY(this.posy-3);
point+=15;
directionNS = -directionNS;
balle.move(dx,-dy);
} }
if (balle.getX()>this.posx+largeur-1 && balle.getX()<= this.posx + largeur+3){ // coin droit de la raquette
if (balle.getY()+4>= this.posy && balle.getY()+4<=this.posy+2){
balle.setY(this.posy-3);
point+=15;
if (direction == -1){ // sens negatif (mouvement de la balle vers la gauche)
balle.move(-dx,-dy); // La balle repart dans l'autre sens
directionNS = -directionNS;
direction = -direction;}
else{
balle.move(dx,-dy); // sinon elle conserve son sens de deplacement sur x
directionNS = -directionNS;
}
} }
if (balle.getX()>= this.posx-3 && balle.getX()<=this.posx){ // coin gauche de la raquette
if (balle.getY()+2>= this.posy && balle.getY()+2<=this.posy+2){
balle.setY(this.posy-3);
point+=15;
if (direction ==1){ // sens positif (vers la droite)
balle.move(-dx,-dy); // La balle repart dans l'autre sens
directionNS = -directionNS;
direction = -direction;}
else{
balle.move(dx,-dy);
directionNS = -directionNS;
}
}}
repaint();
}
public void dessiner (Graphics g){ // dessine la raquette
g.setColor(Color.red);
g.fillRect(this.posx-3,this.posy,largeur+3,hauteur);
repaint();
}
} // fin classe Raquette
public class Brique extends Raquette { // on herite de raquette et de ses fonctionnalités
private boolean casseb ;
private double u , v;
private double distance = 0;
double chevx, chevy;
public Brique(int x, int y, int largeur, int hauteur) {
super(x,y,largeur,hauteur);
u = 0;
v = 0;
chevx=0;
chevy=0;
casseb= false;
}
public boolean distance (Balle balle){ // méthode permettant de calculer la distance des objets et de voir s'il y a collision
u = balle.getcentrex() - this.getcentrex();
v = balle.getcentrey() -this.getcentrey();
double distance = Math.sqrt((u*u)+(v*v)); // on calcul la distance
if (distance <= 2*balle.getradius()+1 ){
if (balle.getY()<= this.getY3() && balle.getY() >= this.getY()){
if (balle.getX()>=this.getX() && balle.getX()<=this.getX2());
return true;
}
}
//if (balle.getY()<this.getY3() && balle.getY() > this.getY()){ //
//if(balle.getX()> this.getX() && balle.getX()< this.getX2()){
// return true;}}
//if (balle.getY2()< this.getY3() && balle.getY3() > this.getY()){
// if(balle.getX2()> this.getX3() && balle.getX2()< this.getX4()){ return true;}}
return false;
}
public void collision (Balle balle) { // on redefinit la methode collision
if (distance(balle) && casseb==false){
balle.move(-balle.dx, -balle.dy);
direction = -direction;
directionNS = -directionNS;
casseb=true;
nbbrique--;
point = point + 3;
}
}
public boolean getcasse(){
return this.casseb;
}
public void dessiner (Graphics g){
if (casseb==false){
g.setColor(Color.blue);
g.fillRect(this.posx+25,this.posy,largeur,hauteur);
g.setColor (Color.yellow);
g.fillOval(this.getcentrex()+25, this.getcentrey(), 5, 5); // pt jaune permettant de reperer le centre de l'objet
repaint();}
}
}
public class Menu {
private int dx,dy;
public Menu(){
this.dx = boule.dx;
this.dy = boule.dy;
}
public void presentation (Graphics g){
g.setFont(new Font("Arial",Font.BOLD,14));
g.setColor(Color.green);
g.drawString("SQUASH GAME",50,110);
g.drawString("START -> ENTER",50,130);
if (!demarrage && !perdu){
premierefois = false;
g.setColor(Color.black);
g.fillRect(0,0,size().width, size().height);
}
}
public void perdu (Graphics g){
g.setFont(new Font("Arial",Font.BOLD,14));
g.setColor(Color.green);
g.drawString("GAME OVER",60,80);
g.drawString("SCORE : "+ point, 60, 130);
}
public void score (Graphics g ){
g.setFont(new Font("Arial",Font.BOLD,13));
g.setColor (Color.yellow);
g.drawString("Score : "+ point, 20, 190);
}
} // fin classe Menu
public boolean mouseMove(Event evt, int x, int y) // methode de pingpong
{ raquette.setX(x); repaint(); return true;}
public boolean keyDown(Event evt, int key) {
if(key == Event.ENTER) {
if(demarrage && !(perdu)){ // test récupere l'entrée et verifie si le programme a demarrer
jeujeu.demarrage= false;
jeujeu.perdu = false;
start(); // si c'est pas le cas on le demarre
}
}
return true;
}
} // fin classe pingpong
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.