C'est un petit casse brique (applet) rien de révolutionnaire qui prend sa source dans les précédents codes, aujourd'hui il a bien évolué.
Les évolutions :
-approche orienté objet
-utilisation d'un pattern Strategy
-un nouvel algorithme de collisions plus efficace sur certains points
-des bonus à récupérer
-Lecture/Ecriture du score et du niveau (utilisable hors IDE après avoir signé l'applet)
-Tableau de levels facilement éditable
Il est fonctionnel et sous licence Gnu/Gpl.
Source / Exemple :
/*
<JAVABREAK GAME (version 1.0) is a Java applet of the classic breakout game>
Copyright (C) 2011 BENMAMMAR FAHEM <fate12346@gmail.com>
*
With thanks to Legrand Benoit <www.trivialpourgeek.com> for his participation
in the first phase of the adaptation of this program in OOP.
*
JAVABREAK GAME is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
JAVABREAK GAME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with JAVABREAK GAME. If not, see <http://www.gnu.org/licenses/>.
import java.applet.*;
import java.awt.*;
import java.awt.Event;
public class JavaBreakGame extends Applet implements Runnable {
private static Jeu jeu;
public static boolean encour = true;
public static boolean perdu = false;
public static boolean pause = false;
public static boolean etat ;
public static int referentiel;
public static boolean tetebrule = false;
public static boolean changer;
public int levelActuel;
public static Fichier fichier;
public static AudioClip S0,S1, S2, S3,S4,S5;
Image Image;
Graphics d;
Graphics g;
public void init(){
fichier = new Fichier("test.txt");
levelActuel = fichier.chargerFichier();
//levelActuel=0;
//Bonus.scoreDuJeu=0;
changer = true;
etat = true;
referentiel = 0;
this.setSize(440, 300);
S0=getAudioClip(getCodeBase(), "ennemi.wav");
S1=getAudioClip(getCodeBase(), "level+1.wav");
S2=getAudioClip(getCodeBase(), "bonus.wav");
S3=getAudioClip(getCodeBase(), "retrorebond.wav");
S4=getAudioClip(getCodeBase(), "riregrave.wav");
S5=getAudioClip(getCodeBase(), "skywalker.wav");
setBackground (Color.black);
jeu = new Jeu(levelActuel);
}
public void start (){
Thread th = new Thread (this);
th.start ();
}
public void run (){
while (!(perdu)&& !(encour))
{
if (!pause)
{
levelActuel = jeu.getLevelActuel(); // on met a jour la variable
if(jeu.outLife()){
stopMove();
}
jeu.mouvementEtCollisionDuJeu();
if (jeu.plusDeBrique()){
if (jeu.getLevelActuel() <= 10){
fichier.enregistrerFichier(jeu.getLevelActuel(),Bonus.scoreDuJeu);
S1.play();
changer = true;
encour = true;
}
}
if (jeu.finDuJeu()){
fichier.enregistrerFichier(0,0); // on revient au debut
perdu =true;
}
repaint();
try
{
Thread.sleep (8);
}
catch (InterruptedException ex)
{
}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
}
public void paint (Graphics g){
jeu.affichageJeu(g);
levelActuel = jeu.getLevelActuel(); // on met à jour la valeur de la variable
if (levelActuel<=9){ // On affiche le menu de presentation
if(encour==true){
g.setColor (Color.WHITE);
g.setFont(new Font("Arial",Font.BOLD,14));
g.drawString("JAVABREAK GAME",80,140);
g.drawString("START -> ENTER",310,140);
g.drawString("PAUSE -> BAS",310,155);
if (changer==true) // A chaque changement de niveau on affiche le nouveau niveau
{
g.setFont(new Font("Arial",Font.BOLD,13));
g.drawString("NIVEAU " + ((levelActuel+1)),110,157);
}
}
}
if (pause && !(perdu)) // si le jeu est en pause mais n'est pas termine
{
g.setFont(new Font("Arial",Font.BOLD,14));
g.setColor (Color.white);
g.drawString("REJOUER !", 85, 145);
}
if((perdu)){
g.setFont(new Font("Arial",Font.BOLD,14));
g.setColor (Color.WHITE);
g.drawString("GAME OVER",85,140);
g.drawString("SCORE : "+ Bonus.scoreDuJeu, 85, 157);
g.setFont(new Font("Arial",Font.BOLD,10));
}
g.setColor(Color.red);
}
public void update (Graphics g) {
Image = createImage (this.getSize().width, this.getSize().height);
d = Image.getGraphics ();
paint (d);
g.drawImage (Image, 0, 0, this);
}
public boolean mouseMove(Event evt, int x, int y) {
jeu.getListeLevels().get(levelActuel).getBarre().setPositionBarreX(x);
int positionXbarre = jeu.getListeLevels().get(levelActuel).getBarre().getPositionBarreX();
if(etat){ // etat du clic cela permet de differer et conserver le traitement des informations
etat = false;
reference (etat,positionXbarre);
}
if (!(etat)){
etat = true;
reference (etat,positionXbarre);
}
repaint();
return true;
}
public void reference (boolean etat, int position){ // on prend l'ancienne position de la raquette
// on regarde le mouvement de la raquette par rapport à son ancienne position
if (etat){
referentiel = position;
}
else{
if (position > referentiel){
jeu.getListeLevels().get(levelActuel).getBarre().setDirectionBarre(1);
}
else{
jeu.getListeLevels().get(levelActuel).getBarre().setDirectionBarre(-1);
}
}
}
public boolean keyDown(Event evt, int key) { // recupere une valeur pour afficher le titre du jeu
if( key ==Event.ENTER)
{
if (!perdu && encour )
{
encour= false;
perdu = false;
changer=false;
start();
}
pause = false;
return true;
}
if( key ==Event.DOWN){
pause=true;
return true;
}
return false;
}
public void stopMove(){ // on arrete le jeu lorsqu'il n'a plus de balle
if (Bonus.vie>=0) { // quand la balle est out on en met une nouvelle en place
pause = true;
int positionBarreX = jeu.getListeLevels().get(levelActuel).getBarre().getPositionBarreX();
int positionBarreY = jeu.getListeLevels().get(levelActuel).getBarre().getPositionBarreY();
jeu.getListeLevels().get(levelActuel).getListeBalles().add(new Balle(positionBarreX, positionBarreY-5, 5,45, 1, -1, 3));
}
else{
fichier.enregistrerFichier(jeu.getLevelActuel(),Bonus.scoreDuJeu);
jeu.setFinDuJeu(true);
}
}
}
24 déc. 2014 à 20:51
10 oct. 2011 à 14:20
C'est mieux que la première version, c'est certain. Par contre, tu peux ne poster que le dossier src, les .class sont inutiles et perturbent même l'affichage de l'arborescence.
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.