Tengo algunos errores atm mientras estoy desarrollando con JAVA, he estado tratando de solucionar este problema, por un largo tiempo, tratando de encontrar oterh ppl que tienen el mismo problema y lo solucionó, pero nada de trabajo…

Bien.. aquí está el código

    package ca.vanzeben.game;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
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 Game extends Canvas implements Runnable {
private static final long serialVerisionUID = 1L;
public static final int WIDTH = 160;
public static final int HEIGHT = WIDTH / 12*9;
public static final int SCALE = 3;
public static final String NAME = "Game";
public boolean running = false;
public int tickCount = 0;
private JFrame frame;
private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
public Game(){
setMinimumSize(new Dimension(WIDTH*SCALE, HEIGHT * SCALE));
setMaximumSize(new Dimension(WIDTH*SCALE, HEIGHT * SCALE));
setPreferredSize(new Dimension(WIDTH*SCALE, HEIGHT * SCALE));
frame = new JFrame(NAME);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(this, BorderLayout.CENTER);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public synchronized void start() {
running = true;
new Thread(this).start();
}
public synchronized void stop() {
running = false;
}
public void run(){
long lastTime = System.nanoTime();
double nsPerTick = 1000000000D/60D;
int ticks = 0;
int frames = 0;
long lastTimer = System.currentTimeMillis();
double delta = 0;
while(running){
long now = System.nanoTime();
delta +=(now - lastTime) / nsPerTick;
lastTime = now;
boolean shouldRender = true;
while(delta >= 1){
ticks++;
tick();
delta -= 1;
shouldRender = true;
}
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (shouldRender){
frames++;
render();
}
if(System.currentTimeMillis() - lastTimer >= 1000){
lastTimer += 1000;
System.out.println(ticks + " ticks, " + frames + " frames");
frames = 0;
ticks = 0;
}
}
}
public void tick() {
tickCount++;
}
public void render(){
BufferStrategy bs = getBufferStrategy();
if(bs == null)  {
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, getWidth(), getHeight());
g.dispose();
bs.show();
}
public static void main(String[] args) {
new Game().start();
}   
}

Y el error es:

 Exception in thread "main" java.lang.ClassCastException: java.awt.image.DataBufferByte           cannot be cast to java.awt.image.DataBufferInt
at ca.vanzeben.game.Game.<init>(Game.java:30)
at ca.vanzeben.game.Game.main(Game.java:122)
  • no tenemos los números de línea, podría marcar la línea que es?
  • mi conjetura es que no se como haces (DataBufferInt)image.getRaster().getDataBuffer()
  • Sí es algo con el: private int[] pixels = ((DataBufferInt)de la imagen.getRaster().getDataBuffer()).getData();
  • Como indica el error, usted está tratando de convertir DataBufferByte en un DataBufferInt. ¿Qué más estás haciendo con el pixels[]?
  • Línea 30: private int[] pixels = ((DataBufferInt)de la imagen.getRaster().getDataBuffer()).getData(); de la Línea de 120-123 public static void main(String[] args) { new Juego().start(); }
InformationsquelleAutor filleszq | 2013-04-05

2 Comentarios

  1. 10

    Para resolver su problema, usted necesita para cambiar el BufferedImage tipo de

    private BufferedImage image = new BufferedImage(WIDTH, HEIGHT,  
    BufferedImage.TYPE_3BYTE_BGR);

    y cambiar a

    private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

    el problema es que BufferedImage.TYPE_3BYTE_BGR utiliza byte[3] para representar cada píxel y
    BufferedImage.TYPE_INT_RGB sólo utiliza un int

  2. 5

    El problema es que image.getRaster().getDataBuffer() está volviendo un DataBufferByte, y usted está tratando de convertir a un DataBufferInt. Esas son dos clases distintas, ambas subclases de DataBuffer, pero uno no es una subclase de la otra, por lo que el casting de entre ellos no es posible.

    La especificación para la Trama no describir claramente lo que determina si getDataBuffer devuelve un DataBufferByte o un DataBufferInt (o tal vez algún otro sabor de DataBuffer). Pero, presumiblemente, esto varía dependiendo del tipo de imagen que está siendo investigada. Usted está probablemente en la disección de un byte por píxel de la imagen y el código, tal y como está, espera de 32 bits por píxel.

    Como es, probablemente, usted necesita para eliminar algunos de los que la lógica de la <init> sección y añadir al constructor explícito, así que usted puede probar el tipo de DataBuffer devuelto y manejar en consecuencia, en lugar de incondicionalmente casting para DataBufferInt.

Dejar respuesta

Please enter your comment!
Please enter your name here