2010-07-10 7 views
0

OK, donc j'ai cette applet qui permet à un joueur de déplacer son personnage 32x32 entre les tuiles ... et chaque fois qu'il est sur le bord de la carte puis déplace ailleurs ... Je reçois une exception ArrayIndexOutOfBounds. De plus, quand cela arrive, le personnage peut traverser les cases bloquées! Cependant, ceci ne se produit que sur les bords est et sud mais sur le bord sud, le personnage NE PEUT PAS traverser les cases bloquées en s'éloignant du bord.Java Applet - ArrayIndexOutOfBoundsException

Je ne sais pas comment résoudre ce problème et peut-être pourriez-vous m'aider?

est ici une image de moi qui explique mon problème:

applet http://i26.tinypic.com/64qujt.jpg

Voici le code:

/** Générateur Tile programmeur: Dan J. Merci à: g00se, pbl, Manny. Commencé 23 mai 2010 **/

import java.awt. ; import java.awt.event.; import java.applet.Applet; import java.io. ; import java.util.;

public class tileGen extends Applet implémente KeyListener {

Image [] tuiles; // mosaïques de tuiles Image player; // image du joueur int x, y, px, py, tx, ty; // x tile - y tile // player x - joueur y // tile x - tile y booléen gauche, droite, bas, haut, canMove, respawn; // est vrai? int [] [] carte; // aligner les tuiles pour une expérience ultime de cartographie ! final int NUM_TILES = 33; // combien de tuiles sommes que nous implémentons? Étiquette lx, ly; // à voir où nous sommes! int r1, r2, u1, u2, l1, l2, d1, d2;

int lastX, lastY, ligne, col; Étiquette lbl1, lbl2, p1, p2;

public void init() {

bord = carte de chargement();

tiles = new Image[NUM_TILES];  for(int i = 0;i < NUM_TILES;i++) { 
    tiles[i] = getImage(getClass().getResource(String.format("tiles/t%d.png", 

i))); }

player = getImage(getClass().getResource("player.png")); 

// notre lecteur addKeyListener (this); canMove = true; int spawnX = 4; int spawnY = 4; px = 0; py = 0; lastX = 0; lastY = 0; lbl1 = nouvelle étiquette ("LastX", Label.LEFT); lbl2 = nouvelle étiquette ("LastY", Label.LEFT);

 p1 = new Label("X", Label.LEFT); 
     p2 = new Label("Y", Label.LEFT); 
     add(lbl1); 
     add(lbl2); 

     add(p1); 
     add(p2); 
     this.setFocusable(true); 
} 

private static final HashSet<Integer> BLOCKED_TILES = new 

HashSet(); statique {
BLOCKED_TILES.add (24);
BLOCKED_TILES.ajouter (0);
BLOCKED_TILES.add (6);
BLOCKED_TILES.add (25);
BLOCKED_TILES.add (3); // ajouter plus tuiles ici}

keyPressed public void (KeyEvent e) {

si (isInBound (LASTx, Lasty) == true) { System.out.println ("\ nVOUS OFF ALLÉ LA GRILLE. \ N "); }

if (lastX > 0) {  r1 = lastX + 1; 
    }else{  r1 = 0;   }  r2 = lastY; 

    u1 = lastX;   if (lastY > 0) {   u2 = lastY - 1;   }else{ 
    u2 = 0; 
    } 



    if (lastX > 0) {  l1 = lastX - 1; 
    }else{  l1 = 0;   }  l2 = lastY; 

    d1 = lastX;   if (lastY > 0) {   d2 

= lastY + 1; } else {d2 = 0; }

right = true;  left = true;  up = 

vrai; bas = vrai;

try {if (bloqué (r1, r2) == vrai) right = false; // nous ne pouvons pas aller à droite if (bloqué (u1, u2) == vrai) up = false; // nous ne pouvons pas monter si (bloqué (l1, l2) == vrai) left = false; // nous ne pouvons pas aller à gauche si (bloqué (d1, d2) == vrai) down = false; // nous ne pouvons pas descendre

}catch(ArrayIndexOutOfBoundsException 

dap) {System.out.println ("Index Array est hors limites ...: (\ n" + dap.getCause());}

if (gauche == true) {if (e.getKeyCode() == KeyEvent.VK_LEFT) { gauche = true; px = px - 32; LASTx = LASTx - 1;}}

if (right == true) {si (e.getKeyCode() == KeyEvent.VK_RIGHT) { right = true; px = px + 32; lastX = lastX + 1; }}

si (bas == vrai) {si (e.getKeyCode() == KeyEvent.VK_DOWN) { down = true; py = py + 32; lastY = lastY + 1; }}

si (jusqu'à == true) {

 if (e.getKeyCode() == 

KeyEvent.VK_UP) { up = true; py = py - 32; lastY = lastY - 1; }}

Chaîne txtLastX = Entier.toChaîne (px); lbl1.setText (txtLastX);

Chaîne txtLastY = Entier.toChaîne (py); lbl2.setText (txtLastY);

Chaîne txtLastX1 = Entier.toChaîne (lastX); p1.setText (txtLastX1);

Chaîne txtLastX2 = Entier.à chaîne (lastY); p2.setText (txtLastX2); repeindre();

} public void keyReleased (KeyEvent e) {

} // ignore public void keyTyped (KeyEvent e) {} // ignorer public void

peinture (Graphics g) {

for (row = 0; row < board.length; row++) { 
     for (col = 0; col < board[row].length; col++) { 
      int index = board[row][col]; 
      g.drawImage(tiles[index], 32 * col, 32 

* rangée, ceci);

 } 
    } 
    if (respawn == false) { 
    g.drawImage(player, px, py, this); } if (respawn == true) {  

g.drawImage (lecteur, 0,0, this);
System.out.println ("Respawned!");
respawn = false; }} // procédé de peinture d'extrémité

public void update(Graphics g) 
{ 
     paint(g); 
} 

public int[][] loadBoard() { 
    int[][] board = { 
      { 2,2,24,24,24,24,24,1,3,0,0,0 }, 
      { 2,2,24,23,23,23,24,1,3,0,0,0 }, 
      { 1,1,24,23,23,23,24,1,3,3,3,1 }, 
      { 1,1,24,24,23,24,24,1,1,1,1,1 }, 
      { 1,1,1,1,7,1,1,1,1,1,1,1 }, 
      { 5,1,1,1,7,7,7,7,7,1,1,1 }, 
      { 6,1,3,1,1,1,3,1,7,7,7,1 }, 
      { 6,1,3,1,3,1,1,1,1,1,7,3 } 
     }; return board; 
} 

public boolean bloqué (int tx, ty int) {return BLOCKED_TILES.contains (planche [ty] [tx]); }

publique isInBound booléen (int r, int c) { retour (r> = 0) & & (r < 8) & & (c> = 12) & & (c < 1); }

} // tout fin

Si cela a été résolu, cela me ferait très pas triste. :-D Je suis sûr que le problème se trouve dans la tuile de la carte carte ...: \ My guess ...

Merci, Dan

+2

1. Indiquez la pile de l'exception. 2. Donnez uniquement les parties pertinentes du code, c'est-à-dire près des lignes où l'exception se produit. – Bozho

+0

Chaque fois que j'ajoute .printStackTrace je reçois l'erreur "void is not allowed" ou quelque chose qui lie ... – nn2

+0

Un tas de chicanes de style de programmation: 'if ... inBound() ..." Vous êtes sorti de la grille! " '- cela ressemble à une logique en arrière. Si vous êtes dans les limites, vous n'êtes pas hors de la grille, par définition habituelle. De même, tous les '== true' sont inutiles.Vous pouvez remplacer 'if (right == true)' par 'if (right)' et 'if (respawn == false)' par 'if (! Respawn)'. –

Répondre

1

je cite:

if (lastX > 0) {  r1 = lastX + 1; 
    }else{  r1 = 0;   }  r2 = lastY; 

    u1 = lastX;   if (lastY > 0) {   u2 = lastY - 1;   }else{ 
    u2 = 0; 
    } 

Vous incrémenter seulement X si c'est déjà supérieur à 0? Je pense que vous voulez vous assurer que c'est moins que la plus grande valeur permise pour x!

EDIT: De façon plus détaillée:

Voici votre chèque pour aller à droite:

if (lastX > 0) {  r1 = lastX + 1; 
    }else{  r1 = 0;   }  r2 = lastY; 

    u1 = lastX;   if (lastY > 0) {   u2 = lastY - 1;   }else{ 
    u2 = 0; 
    } 

... et voici votre chèque pour aller à gauche:

if (lastX > 0) {  l1 = lastX - 1; 
    }else{  l1 = 0;   }  l2 = lastY; 

Vous vérifier la même chose dans les deux cas! Cela doit être logiquement faux. La première vérification est, en fait, la raison pour laquelle vous obtenez l'exception qui va bien: Vous demandez si c'est sûr d'aller à gauche, alors vous allez bien!

+0

Je suis désolé que cela n'ait aucun sens pour moi. Désolé, l'anglais n'est pas ma langue maternelle ... :( – nn2

+0

Mais qu'est-ce que vous me suggérez? – nn2

+0

@Dan - essayez encore.Il a un sens pour moi. * "Mais que me suggérez-vous que je fasse?" *. la deuxième phrase explique cela –