2016-09-13 3 views
1

Salut compagnon forme de vie à base d'hydrogène. J'apprends à faire des gaems tridimensionnels à partir d'un site web top secret (www.youtube.com) et j'apprends d'un très bon Youtuber. Mon projet ressemble à ceci:Comment résoudre cette exception de tableau hors limites?

Il y a 3 classes: Main, l'écran et Render Je reçois cette exception :(:.

Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: 65600 
at Render.Draw(Render.java:20) 
at Screen.render(Screen.java:19) 
at Main.render(Main.java:74) 
at Main.run(Main.java:59) 
at java.lang.Thread.run(Unknown Source) 

Je télécharger mon code ici aussi en dessous de ce S'il vous plaît me aider à devenir bon à ce

classe principale.

import java.awt.Canvas; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferInt; 

import javax.swing.JFrame; 

public class Main extends Canvas implements Runnable { 
private static final long serialVersionUID = 1L; 

public static final int WIDTH = 800; 
public static final int HEIGHT = 600; 
public static final String TITLE = "Nexus Overload"; 

private Thread t; 
private boolean Running = false; 

@SuppressWarnings("unused") 
private Render ren; 
private Screen s; 

private BufferedImage img; 
private BufferStrategy bs; 
private int[] pixels; 

public Main() { 
    s = new Screen(WIDTH, HEIGHT); 
    img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
    pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); 
} 

private void start() { 
    if (Running) 
     return; 
    Running = true; 

    t = new Thread(this); 
    t.start(); 
} 

@SuppressWarnings("unused") 
private void stop() { 
    if (!Running) 
     return; 
    Running = false; 
    try { 
     t.join(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(0); 
    } 
} 

public void run() { 
    while (Running) { 
     tick(); 
     render(); 
    } 
} 

private void tick() { 

} 

private void render() { 
    bs = this.getBufferStrategy(); 
    if (bs == null) { 
     createBufferStrategy(3); 
     return; 
    } 

    s.render(); 

    for (int i = 0; i < WIDTH * HEIGHT; i++) { 
     pixels[i] = s.pixels[i]; 
    } 

    Graphics g = bs.getDrawGraphics(); 
    g.drawImage(img, WIDTH, HEIGHT, null); 
    g.dispose(); 
    bs.show(); 

} 

public static void main(String[] args) { 
    Main m = new Main(); 

    JFrame frame = new JFrame(); 
    frame.getContentPane().add(m); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setBounds(350, 100, WIDTH, HEIGHT); 
    frame.setTitle(TITLE); 
    frame.setVisible(true); 

    m.start(); 
} 
} 

classe Render:

public class Render { 
public final int width; 
public final int height; 
public final int[] pixels; 

public Render(int width, int height) { 
    this.width = width; 
    this.height = height; 
    this.pixels = new int[width * height]; 
} 

public void Draw (Render ren, int xOffset, int yOffset) { 
    for (int y = 0; y < ren.height; y++) { 
     int yPix = y + yOffset; 

     for (int x = 0; x < ren.width; x++) { 
      int xPix = x + xOffset; 

      pixels[xPix + yPix * width] = ren.pixels[xPix + yPix * width]; 
     } 
    } 
} 
} 

classe d'écran:

import java.util.Random; 

public class Screen extends Render{ 

private Render ren; 

public Screen(int width, int height) { 
    super(width, height); 

    Random r = new Random(); 

    ren = new Render(256, 256); 
    for (int i = 0; i < 256 * 256; i++) { 
     ren.pixels[i] = r.nextInt(); 
    } 
} 

public void render() { 
    Draw(ren, 0, 0); 
} 

} 

Pour ceux qui veulent l'image avec le débogage d'éclipse, ici: Avec onglet variables sélectionnées: enter image description here

+4

Nous ne sommes pas hydrogène- basé, nous sommes basés sur le carbone :) En outre, vous ne savez pas comment suivre une trace de pile? –

+0

Quels ont été vos résultats après avoir utilisé un débogueur? – MrSmith42

+0

@SomePerson I maintenant d'où il vient mais je n'arrive pas à résoudre –

Répondre

0

Votre exception pointe nous à la méthode Draw dans la classe Render (NB: les conventions Java stipulent que les noms de méthodes doivent être en minuscules donc cette méthode devrait en fait b e appelé dessiner (Render ren, int xOffset, int yOffset). Je vais d'abord essayer de définir l'int y dans la boucle for externe à 1 pour voir si cela aide, vous pouvez aussi faire la même chose pour int x dans la boucle interne pour ...

+0

commentant ici que je n'ai pas assez de rep pour commenter sur l'OP - pouvez-vous prendre la même capture d'écran que ci-dessus avec l'onglet Variables sélectionné dans la vue de débogage? – coderwurst

+0

ok le fera maintenant –