Un p'tit bomberman en java, c'est sympa mais

Méthode simple :

Tu décomposes en petites étapes de temps, toutes identiques (-> 2 Threads)

Soit DUREE_ETAPE la durée d’une de ces étapes

while(true) {

-> Tu récupères le temps présent (currentTimeMillis)

-> Récupération des actions de l’utilisateur -> Déplacement, …

-> Gestion des bombes, des adversaires, …

-> Tu comptes le temps écoulé depuis le début de la boucle

-> Tu rafraichis l’ecran

-> Tu endors le Thread pendant DUREE_ETAPE - temps ecoule dans la boucle

}

OK dac, je vais essayer ca aujourd’hui

Voici l’archive zip de mon projet java. J’attends tout commentaires dessus, vu que comme je l’ai dit plus haut, je débute, et que donc ma facon de penser est peut etre totalement a revoir

http://s11.yousendit.com/d.aspx?id=02G7WX8PWRCFJ1Y22ODUK5LI4S

maj : j’ai rajouté du son, mais un truc que je comprends pas, c’est pourquoi lorsqu’on fait exploser plusieurs bombes rapidement le son déconne complètement…

oooooooooook

Bon, en fait, on efface et on recommence tout… :sweat: :sweat: :sweat:

Alors, desormais, j’ai décidé grace aux conseils avisés de mon prof de passer par une programmation objet (oui, bon, on est en java, d’accord :whistle: ). Du coup, j’ai créé une interface me permettant pour chaque classe l’implémentant de se dessiner comme un grand sur un canva.

Grace a ca, j’ai enfin réussi a créer une animation et mon cher et tendre petit bonhomme arrive enfin a bouger ses p’tites pattes et a avancer… :smiley: Mais le problème c’est que mon approche ayant totalement changée, ce p’tit sagouin ne se bloque plus contre les murs (bah non, en fait la classe personnage ne voit pas la classe mur :pfff: ). Alors, j’ai pensé faire un masque, mais le problème, c’est qu’il faudrait qu’a chaque cassage de mur, le masque soit recréé… ca risque d’etre un peu lourd. Donc en fait, je me demandais comment faire…

Si jamais quelqu’un a une solution svp :stuck_out_tongue:

Une idée comme ça:

Tu crées une fonction publique ds ta classe mur qui prends en paramètres les coord x et y de ton bonhomme de jeu et qui retourne 0 ou 1 suivant la presence d’un mur ou pas.

Tu appelles cette fonction ds ta classe personnage à chaque déplacement

Ben… ouaip’, y’a vraiment de l’idée, sauf que ma je crée pleins de murs, alors comment faire en sorte que cette fonction soit lancée pour tous ces objets là? :heink:

Fais une classe mère Plateau qui contient toutes les classes Mur.
Dans la classe Plateau, tu pourrais faire une matrice (x,y) où x et y dimensions du plateau de jeu.
Tu remplis ta matrice au fur et à mesure avec des 0 ou des 1 suivant la présence de mur ou non.
Apres, t’as juste à interroger MatriceMurs(a,b) pour savoir s’il y a un mur à cette endroit

Merci beaucoup, je m’y mets tout de suite, en faite, c’est presque comme un masque, sauf que j’interroge une matrice de booleens quoi… :stuck_out_tongue:

Allez, au boulot et merci encore [:lapinbilly]

Bah voilà, grace a tes conseils, mon bestiau avance dans les cases comme il faut, s’arrete quand il faut, et de plus j’ai réussi a dire qu’il faudrait que mes cases ‘sautent’ lorsque ma bombe explose. :sol:

Le problème, c’est que j’ai des threads. Un pour mon personnage, et un pour ma bombe. Le truc, c’est que je ne sais pour quelle raison, ces deux threads sont en relation, alors que pourtant j’ai cru comprendre que c’était censé etre séparé. Alors je précise que la classe du personnage est Runnable, vu qu’elle hérite d’une classe mère => impossible d’hériter de Thread, alors que ma classe bombe est elle un héritage de la classe Thread. :pt1cable:

J’ai vu sur le net que si j’avais plusieurs implémentation de Runnable, toutes ces classes étaient synchronisées. Que si mes classes étaient des héritages de Thread, alors elles étaient toutes séparées. Mais je ne sais pas quand j’ai un Runnable et un Thread pourquoi ces deux là devraient etre liés. :sweat:

Vous savez comment remédier a ca? :stuck_out_tongue:

Que veux-tu dire par “liés”?

synchronisées si tu préfères

En fait, lorsque ma bombe est posée, son thread devrait etre lancé une et une seule fois, et à la vitesse donnée par son sleep(). Le problème, c’est qu’en réalité la bombe est synchronisée avec mon runnable du perso et a donc le meme sleep que ce dernier et de plus se répète car le thread se relance… et ca, bah… je l’veux pas trop :non:

???

Tu peux mettre ton code

Tu veux dire que le contenu de run() est spontanément joué plusieurs fois? Je ne pense pas…

public class Bombe extends Thread implements ItfDessin
{

public void run()
{
for (int i=0; i<16;i++)
{
contexte.repaint();
try{Thread.sleep(200);}
catch (Exception t) {};
}
compteur = 16;
}
}

Ca c’est ma classe bombe

public class Humain extends Personnage implements ItfDessin, Runnable
{

public void run()
{
boolean bouge;
for (int k=0; k< 7; k++)
{
bouge = true;
contexte.repaint();
if (direction == 1)
{
if (positiony <4)
bouge = false;
if (bouge)
for (int i=4; i<26;i++)
if (masque[positionx+i][positiony-4] != 0)
bouge = false;
if (bouge)
positiony -= 4;
}
if (direction == 2)
{
if (positiony >419)
bouge= false;
if (bouge)
for (int i= 4;i<26;i++)
if (masque[positionx+i][positiony+30] != 0)
bouge = false;
if (bouge)
positiony += 4;
}
if (direction == 3 )
{
if (positionx <4)
bouge=false;
if (bouge)
for (int i=4;i<26;i++)
if (masque[positionx-4][positiony+i] != 0)
bouge = false;
if (bouge)
positionx -=4;
}
if (direction == 4)
{
if (positionx >419)
bouge=false;
if (bouge)
for (int i=4;i<26;i++)
if (masque[positionx+30][positiony+i] != 0)
bouge = false;
if (bouge)
positionx += 4;
}
try{Thread.sleep(100);}
catch (Exception t) {};
}
compteur = 8;
contexte.repaint();
}
}

Bon, le masque c pour la position, savoir si il bougera ou pas, c tout…

Et l’appel :

public class Dessin extends Canvas
{
Humain Vassago;
public void bomb()
{
// Création d’une bombe temporaire pour aligner la bombe finale sur la grille
Bombe temp = new Bombe(Vassago.get_Positionx(),Vassago.get_Positiony(),3);
int x = temp.get_Positionx() / 30;
int y = temp.get_Positiony() / 30;
Bombe bomb2 = new Bombe(x30,y30,1);
Sprites[y][x] = bomb2;
masque = bomb2.explosion(x,y);
}


Vassago = new Humain(j30,i30,2,4);

public void paint(Graphics g)
{
	for (int i=0; i<15; i++)
		for (int j=0; j<15; j++)
			g.drawImage(sol,i*32,j*32,32,32,this);
	for (int i=0;i<15;i++)
		for (int j=0;j<15;j++)
			Sprites[i][j].draw(g);
}

Les Sprites sont mes objets qui ont tous la fonction draw(g) afin de permettre de les dessiner quand je veux… :stuck_out_tongue:

En vrac :

for (int k=0; k< 7; k++)
-> Dans le vrai jeu, il y a possibilité de changer de direction en cours, ce n’est pas seulement un déplacement de case en case
Comme ça il ne se déplace que de 28 pixels, je me trompe?

Tes coordonnées Bombe/Perso ont l’air en base 30, pourtant, dans le dernier paint, tu dessines des images en 32 * 32

Ta suite
if (direction == X)
peut être remplacée par un switch ou au moins, tu peux mettre du else if pour éviter de passer en revue tous les blocs à chaque fois

Tu as le droit d’associer plus d’un traitement dans une conditionnelle en utilisant {}… Pas besoin de if (bouge) à la suite

Ton perso ne peut aller que de case en case, tes murs sont des cases entières (si tu respectes le système original) :

  • Pourquoi tester des positions en cours alors que ton perso est sûr de pouvoir finir son déplacement s’il l’a commencé? Ne suffit-il pas de tester s’il peut se déplacer dans une direction à la saisie des touches?
  • Pourquoi tester autant de position?
  • Pourquoi avoir fait un masque au pixel si un masque à la case suffit?

Sinon, pour ton problème de Thread, puis-je voir les constructeurs de Bombe/Humain/Personnage?