java databufferbyte,java.awt.image.DataBufferByte中不能被强制转换为java.awt.image.DataBufferInt...

此篇博客讲述了作者在使用Java开发游戏时遇到关于BufferedImage类型错误,解决方案是在创建BufferedImage对象时将类型从BufferedImage.TYPE_3BYTE_BGR更改为BufferedImage.TYPE_INT_RGB。关键在于理解3BYTE_BGR与INT_RGB的区别,前者使用byte数组,后者使用整数表示像素。
摘要由CSDN通过智能技术生成

I have some errors atm while im coding with JAVA, I have been trying to fix this for along time, also trying to find oterh ppl who have same problem and fixed it but nothing work...

Well.. here is the code

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();

}

}

And the error is:

Exception in thread "main" java.lang.ClassCastException: java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt

at ca.vanzeben.game.Game.(Game.java:30)

at ca.vanzeben.game.Game.main(Game.java:122)

解决方案

To solve your problem, you need to change the BufferedImage type of

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT,

BufferedImage.TYPE_3BYTE_BGR);

and change it to

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

the problem is that BufferedImage.TYPE_3BYTE_BGR uses byte[3] to represent each pixel and

BufferedImage.TYPE_INT_RGB just uses an int

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>