我正在使用Applet编写小型游戏。我希望能够检查屏幕上像素的颜色。但是,当我在游戏循环(一遍又一遍执行的while循环)中对缓冲图像使用.getRGB()时,即使像素颜色从未真正改变,它也会给我带来不一致的值!
例如,如果我用绿色填充图像,然后在屏幕中间的像素上调用.getRGB(),有时它会给我0xFF00FF00(绿色)作为颜色,有时它会给我0xFF000000(黑色),即使颜色始终保持绿色!
有什么帮助吗?
这是相关的代码(如果有帮助的话),我将其最小化仅用于关注问题:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
public class t extends Applet implements Runnable {
Graphics2D bufferG;
BufferedImage bufferI;
final int WIDTH = 500, HEIGHT = 500;
public void init() {
setSize(WIDTH, HEIGHT);
bufferI = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
bufferG = bufferI.createGraphics();
(new Thread(this)).start();
}
public void run() {
while (true){
if (bufferI.getRGB(WIDTH/2, HEIGHT/2)==0xFF000000) System.out.println("BLACK");
}
}
public void paint(Graphics g) {
bufferG.setColor(Color.green);
bufferG.fillRect(0, 0, WIDTH, HEIGHT);
g.drawImage(bufferI, 0, 0, this);
}
}
最佳答案
我不确定为什么要处理缓冲区。这会将图像绘制为绿色,并且在命令行上不产生任何输出(将颜色报告为黑色)。
// <applet code='t' width=400 height=200></applet>
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
public class t extends Applet implements Runnable {
BufferedImage bufferI;
final int WIDTH = 500, HEIGHT = 500;
public void init() {
bufferI = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = bufferI.getGraphics();
g.setColor(Color.GREEN);
g.fillRect(0,0,WIDTH,HEIGHT);
g.dispose();
(new Thread(this)).start();
}
public void run() {
while (true){
if (bufferI.getRGB(WIDTH/2, HEIGHT/2)==0xFF000000) System.out.println("BLACK");
}
}
public void paint(Graphics g) {
g.drawImage(bufferI, 0, 0, this);
}
}
笔记
编译运行
prompt> javac t.java
prompt> appletviewer t.java // yes that file extension is correct.
尺寸
小程序的大小是在加载它的HTML中设置的,不应尝试设置自己的大小。