Bonjour ! Je recherche actuellement mon nouveau dieu... J'ai récemment créé un programme sur Java et j'ai presque fini de le porter sur Android. Android Studio ne trouve aucune erreur dans le code, le XML est nickel, pourtant l'appli continue de crasher sans raison. Sachant que le débuggeur ne trouve rien, y'aurait t'il quelqu'un pour me dire ce qui ne va pas dans ce code?
Classe principale :
public class MainActivity extends AppCompatActivity {
TableauClass plate = new TableauClass();
Player J1 = new Player(1,1);
Bat b1 = new Bat(plate.casePlateau);
Slime s1 = new Slime(plate.casePlateau);
TextView etiqPlateau = (TextView) findViewById(R.id.etiqPlateau);
TextView etiqVie = (TextView) findViewById(R.id.etiqVie);
TextView etiqScore = (TextView) findViewById(R.id.etiqScore);
private void propetiqPlateau() {
plate.casePlateau[J1.yPlayer][J1.xPlayer] = J1.iconPlayer; // on met l'icone du joueur dans le plateau
plate.casePlateau[b1.y][b1.x] = b1.icon; // on positionne la bat
plate.casePlateau[s1.y][s1.x] = s1.icon; // on positionne le slime
//affichage de l'écran de démarage
etiqPlateau.setText("<html><font color = #FFFFFF>░░░░░░\\|||/░░░░░░░░░<br>░░░░░░(o░o)░░░░░░░░░┌─┬──────┐<br>,~ooO~~(_)~~~~~~,░░░│</font><font color = #00FF00>☻</font><font color = #FFFFFF>│joueur│<br>|░░░░░HELL'S░░░░|░░░│m│murs░░│<br>|░░░░░REVENGE░░░|░░░│s│sol░░░│<br>|░░░░░░░░░░░░░░░|░░░│</font><font color = #00FFFF>J</font><font color = #FFFFFF>│Slime░│<br>'~~~~~~~~~~~Ooo~'░░░│</font><font color = #FFFF00>B</font><font color = #FFFFFF>│bat░░░│<br>░░░░░|__|__|░░░░░░░░│</font><font color = #FF0000>@</font><font color = #FFFFFF>│sortie│<br>░░░░░░||░||░░░░░░░░░└─┴──────┘<br>░░░░░ooO░Ooo░░░░░░░░<br><br> appuyer sur une touche pour commencer</font><html>");
//Affichage de la vie
etiqVie.setText(J1.affVie());
etiqVie.setTextColor(Color.RED);
//Affichage du score
etiqScore.setTextColor(Color.GREEN);
etiqScore.setText("<html>SCORE = "+J1.score+"<br>HIGHSCORE = "+J1.highScore+"<html>");
}
private void changeNiveau(){ // changement de niveau
plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's'; // on met un s à la place du joueur
J1.xPlayer = 1; // on positionne le joueur en 1-1
J1.yPlayer = 1;
plate.initTableau(); // on ititialise le plateau
plate.casePlateau[J1.yPlayer][J1.xPlayer] = J1.iconPlayer; //on affiche je joueur
b1.vie=8; // on remet les monstre au max
b1.posMonstre(plate.casePlateau);
s1.vie=4;
s1.posMonstre(plate.casePlateau);
plate.casePlateau[b1.y][b1.x] = b1.icon; // affichage des monstres
plate.casePlateau[s1.y][s1.x] = s1.icon;
etiqPlateau.setText(plate.affplate());
J1.vie = J1.vie +3;
etiqVie.setText(J1.affVie());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void buttonClickRight(View view) { //Quand on clique sur DROIT
if (J1.vie >0) { //Si la vie est >0
plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's';
if(plate.casePlateau[J1.yPlayer][J1.xPlayer+1] == 's'){
J1.xPlayer =J1.xPlayer+1;
J1.score ++;
}
}else{ //si la vie est inférieure ou égale à 0
etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
}
}
public void buttonClickLeft(View view) { //Quand on clique sur GAUCHE
if (J1.vie >0) { //Si la vie est >0
plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's';
if(plate.casePlateau[J1.yPlayer][J1.xPlayer-1] == 's'){
J1.xPlayer =J1.xPlayer-1;
J1.score ++;
}
}else{ //si la vie est inférieure ou égale à 0
etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
}
}
public void buttonClickUp(View view) { //Quand on clique sur HAUT
if (J1.vie >0) { //Si la vie est >0
plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's'; // on place un s à la place du joueur
if(plate.casePlateau[J1.yPlayer-1][J1.xPlayer] == 's'){ // on vérifie si on a un s au dessus
J1.yPlayer =J1.yPlayer-1; // si oui, on valide de déplacement
J1.score ++; // on gagne un point
}
}else{ //si la vie est inférieure ou égale à 0
etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
}
}
public void buttonClickDown(View view) { //Quand on clique sur BAS
if (J1.vie >0) {
plate.casePlateau[plate.h - 2][plate.l - 2] = 's';
plate.casePlateau[J1.yPlayer][J1.xPlayer] = 's';
if(plate.casePlateau[J1.yPlayer+1][J1.xPlayer] == 's') {
J1.yPlayer =J1.yPlayer+1;
J1.score ++;
}
}else{ //si la vie est inférieure ou égale à 0
etiqPlateau.setText("<html><font color = #FFFFFF>▄██▀▀▀█▄░▄██▀▀▀██▄░▄██▀█▄█▀██▄░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░█░░░██░██░░░<br>██░░░▄▄▄░██▄▄▄▄▄██░██░░░▀░░░██░██▀▀▀<br>██░░░░██░██░░░░░██░██░░░░░░░██░██░░░<br>▀██▄▄▄█▀░██░░░░░██░██░░░░░░░██░██▄▄▄<br>░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░<br>▄██▀▀▀██▄░▀██▄░░██▀░██▀▀▀░██▀▀▀▀██▄░<br>██░░░░░██░░░██░░██░░██░░░░██░░░░░██░<br>██░░░░░██░░░██░░██░░██▀▀▀░██▄▄▄▄▄▀▀░<br>██░░░░░██░░░██░░█▀░░██░░░░██░░░░░██░<br>▀██▄▄▄██▀░░░░▀█▀░░░░██▄▄▄░██░░░░░██▄<br><br>░░appuyer░sur░\"R\"░pour░recommencer░░</font><html>"); // -> GAME OVER
}
}
public void buttonRestart(View view) { //Quand on clique sur redémarrer
changeNiveau();
etiqPlateau.setText(plate.affplate());
if (J1.score > J1.highScore){
J1.highScore = J1.score;
}
J1.score = 0;
J1.vie = 20;
etiqVie.setText(J1.affVie()); // affichage de la vie
etiqScore.setText("<html>SCORE = "+J1.score+"<br>HIGHSCORE = "+J1.highScore+"<html>");
}
}
Classe qui gère les entités :
public abstract class Entity {
Random rand = new Random();
public char icon; // charatère représentant l'objet à l'écran
public int vie; // point de vie
public int x; // posistion initiale en X
public int y; // position initiale en Y
public int att; // points d'attaque
public int point; // score que rapporte le monstre
public Entity(char[][] plate, int c, char d,int e, int f){ // constructeur de l'objet
/*
do{ // boucle
x = rand.nextInt(plate[0].length-1)+1; // X généré aléatoiremet en fonction de la longuer du plateau
y = rand.nextInt(plate.length-1)+1; // Y généré aléatoiremet en fonction de la hauteur du plateau
}while (plate[y][x]!='s'); // tant que ce n'est pas une case Sol ('s')
*/
posMonstre(plate);
vie = c; // attribution de la vie
icon = d ; // attribution de l'icone
att = e; //attribution de l'attaque
point = f; // attribution du score
}
public void posMonstre(char[][] plate){
do{ // boucle
x = rand.nextInt(plate[0].length-1)+1; // X généré aléatoiremet en fonction de la longuer du plateau
y = rand.nextInt(plate.length-1)+1; // Y généré aléatoiremet en fonction de la hauteur du plateau
}while (plate[y][x]!='s'); // tant que ce n'est pas une case Sol ('s')
}
public void move (Player j, char[][] p){ // algorithme de déplacement du monstre
int yp = j.yPlayer; // position Y du joueur
int xp = j.xPlayer; // position X du joueur
int vp = j.vie; // vie du joueur
int attp = j.att; // attaque du joueur
int v;
int h;
int va;
int ha;
if (vie<=0){ //si je monstre est mort, on le positionne en 0-0 et on sort de la boucle
x=0;
y=0;
return;}
p[y][x]='s'; // on place une case sol à l'emplacement du monstre avant de le déplacer
v = yp - y; // on regarde de quel coté est le joueur en Y
h = xp - x; // on regarde de quel coté est le joueur en X
va = v;
ha = h;
if (v < 0){va=-v;} // valeur absolue en Y -> distance verticale
if (h < 0){ha=-h;} // valeur absolue en X -> distance horizontale
if (va>=ha){ // si la distance verticale est plus grande que l'hoizontale, on se déplace en Y
if (v>0 && p[y+1][x]=='s'){ // si c'est une case sol en bas, le déplacement est validé
y = y + 1;
}else if (v<0 && p[y-1][x]=='s'){ // si c'est une case sol en haut, le déplacement est validé
y = y - 1;
}
}else{ // sinon déplacement en X
if (h>0 && p[y][x+1]=='s'){// si c'est une case sol à droite, le déplacement est validé
x = x + 1;
}else if (h<0 && p[y][x-1]=='s'){// si c'est une case sol à gauche, le déplacement est validé
x = x - 1;
}
}
p[y][x]=icon; // on place l'icone du monstre dans sa nouvelle position
if (ha+va==1){ // si on est à une case du joueur -> combat
vie = vie - attp; // le monstre perd les points de vie équivalents à l'attaque du joueur
j.vie = vp - att;// le joueur perd les points de vie équivalents à l'attaque du monstre
if (vie <= 0){ // si la vie du monstre tombe à 0
p[y][x]='s'; // on efface le monstre du plateau
j.score = j.score + point; // le joueur a son score qui augmente
}
}
}
}
Le code qui crée le tableau :
public class TableauClass {
Random rand = new Random(); // rand sert à générer des nombres aléatoires
int h ; // hauteur du plateau de jeu
int l ; // largeur du plateau de jeu
char casePlateau [][]; // tableau à double entrée d'entiers représentant le plateau
public void initTableau(){ // remplissage du tableau avec murs et sols
h = rand.nextInt(10-4+1)+4; //hauteur aléatoire entre 4 et 14
l = rand.nextInt(10-4+1)+4; // largeur aleéatoire entre 4 et 27
casePlateau = new char [h][l]; // création du tableau de char de hauteur h et de largeur l
for (int i = 0; i < h; i++){ // on commence par remplir tout le tableau avec du sol ('s')
for (int j = 0; j < l; j++){
casePlateau [i][j] = 's';
}
}
for (int i = 0; i < h; i++){ // on met des murs à droite et à gauche
casePlateau [i][0] = 'm';
casePlateau [i][l-1] = 'm';
}
for (int i = 0; i < l; i++){// on met des murs en haut et en bas
casePlateau [0][i] = 'm';
casePlateau [h-1][i] = 'm';
}
casePlateau [h-2][l-2] = '@';
}
public TableauClass(){ // constructeur du plateau
//casePlateau = new char [h][l]; // création du tableau de char de hauteur h et de largeur l
initTableau(); // remplissage du plateau
}
public String affplate(){ // methode d'affichage du tableau
String plateau; // chaine de caractère affichant le plateau
String lh = "<html><font color = #FFFFFF>╔"; // affectation de la couleur et premier caractère de la ligne du haut
String lm = ""; // ligne du milieu
String li = "╠"; // interligne
String lb = "╚"; //ligne du bas
for (int i = 0; i < l-1; i++){
lh = lh + "═══╦"; // on rajoute une case à la ligne du haut autant de fois que la longueur-1 du plateau
li = li + "═══╬"; // on rajoute une case à la ligne du milieu autant de fois que la longueur-1 du plateau
lb = lb + "═══╩"; // on rajoute une case à la ligne du bas autant de fois que la longueur-1 du plateau
}
lh = lh + "═══╗<br>"; // dernière case de la ligne du haut
li = li + "═══╣<br>"; // dernière case de la ligne du milieu
lb = lb + "═══╝</font><html>"; // dernière case de la ligne du bas et fin de la couleur
plateau = lh; // on commence par remplir le plateau avec la ligne du haut
for (int i = 0; i<=h-1; i++){ // pour chaque colonne
lm = "║ "; // la ligne du milieu commence avec un ║
for (int j = 0; j < l; j++){ // pour chaque élément de la collone
lm = lm + couleurChar(casePlateau[i][j]) +" ║ "; // on ajoute le caractère de la case concennée entre 2 despaces puis un ║
// pour cela on utilise la fonction couleurChar qui gère le changement de couleur en fonction de la case
}
lm = lm + "<br>"; // on rajoute un retour à la ligne
if (i != h-1){ // on rajoute la ligne obtenue au plateau et une ligne intermédiaire sauf pour la dernière ligne
plateau = plateau+lm+li;
}
}
plateau = plateau+lm+lb; // on rajoute la dernière ligne
return plateau; // on retourne la chaine de caractère définissant le plateau
}
private String couleurChar(char a){ // fonction qui affecte une couleur de caractère en fonction de la sase
String couleur;
switch (a)
{
case '☻': // case joueur de couleur verte
return "</font><font color = #00FF00>" + a +"</font><font color = #FFFFFF>";
case 'B': // case Bat de couleur jaune
return "</font><font color = #FFFF00>" + a +"</font><font color = #FFFFFF>";
case 'J': // case Slime de couleur cyan
return "</font><font color = #00FFFF>" + a +"</font><font color = #FFFFFF>";
case '@': // case sortie de couleur rouge
return "</font><font color = #FF0000>" + a +"</font><font color = #FFFFFF>";
default: // sinon couleur courante
couleur = ""+a;
}
return couleur; //renvoie la chaine obtenue
}
}
activity_main.xml (des fois que ce serait là dedans) :
Quiconque réussira à trouver mon erreur entrera dans le panthéon des meilleurs développeurs d'OpenClassrooms et gagnera ma reconnaissance éternelle (Car je n'ai pas d'argent...)
A wizard is never late, nor is he early. He arrives precisely when he means to.
Pour ceux que ça intéresserait : Voià le message d'erreur (Ici mon téléphone est un NEXUS 5X sous Android 6.0.0:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{isn.rpg/isn.rpg.projet_isn.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
Et là un NEXUS 5 sous Android 4.4.4
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{isn.rpg/isn.rpg.projet_isn.MainActivity}: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
Selon le logcat la ligne qui produit l'erreur c'est
A wizard is never late, nor is he early. He arrives precisely when he means to.
URGENT - Problème de transcription Java-Android
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.