Java 检测与图像碰撞的最简单方法?
我正在制作一个迷宫游戏,仍然需要添加与墙的碰撞事件。我知道如何处理碰撞,但我不知道如何检测碰撞。如有必要,我的代码如下Java 检测与图像碰撞的最简单方法?,java,image,swing,awt,collision,Java,Image,Swing,Awt,Collision,我正在制作一个迷宫游戏,仍然需要添加与墙的碰撞事件。我知道如何处理碰撞,但我不知道如何检测碰撞。如有必要,我的代码如下 public class Move extends Applet implements KeyListener, MouseListener { private Rectangle rect; private ArrayList<Integer> keysDown; Random randomGenerator = new Random();
public class Move extends Applet implements KeyListener, MouseListener {
private Rectangle rect;
private ArrayList<Integer> keysDown;
Random randomGenerator = new Random();
int speed = 4;
int level = 1; // change to 0 once start menu works
int xpos;
int ypos;
public static final int START_X_POS = 160;
public static final int START_Y_POS = 160;
public static final int START_WIDTH = 256;
public static final int START_HEIGHT = 64;
boolean startClicked;
Image start;
Image block;
URL base;
MediaTracker mt;
//int randomx = randomGenerator.nextInt(560);
public void init() {
addKeyListener(this);
addMouseListener(this);
keysDown = new ArrayList<Integer>();
rect = new Rectangle(32, 32, 50, 50);
mt = new MediaTracker(this);
try {
base = getDocumentBase();
} catch (Exception e) { }
start = getImage(base, "start_button.png");
block = getImage(base, "block.gif");
try {
mt.waitForAll();
} catch (InterruptedException e) { }
}
public void paint(Graphics g) {
setSize(600, 400);
Graphics2D g2 = (Graphics2D) g;
if (level != 0) {
g2.fill(rect);
Font font = new Font("Arial", Font.BOLD, 18);
g.setFont(font);
//String text = "Speed: " + speed;
String text = "Level: " + level;
FontMetrics fm = g.getFontMetrics();
int x = (getWidth() - fm.stringWidth(text)) / 2;
int y = (getHeight() - fm.getHeight()) + fm.getAscent();
g.drawString(text, x, y);
}
if (level == 1) {
// horizontal blocks
g.drawImage(block, 0, 0, this);
g.drawImage(block, 32, 0, this);
g.drawImage(block, 64, 0, this);
g.drawImage(block, 96, 0, this);
// vertical blocks
g.drawImage(block, 0, 0, this);
g.drawImage(block, 0, 32, this);
g.drawImage(block, 0, 64, this);
g.drawImage(block, 0, 96, this);
}
else { // start menu
g.drawImage(start, 160, 160, this);
}
}
@Override
public void keyPressed(KeyEvent e) {
if (!keysDown.contains(e.getKeyCode()))
keysDown.add(new Integer(e.getKeyCode()));
moveRect();
}
@Override
public void keyReleased(KeyEvent e) {
keysDown.remove(new Integer(e.getKeyCode()));
}
public void moveRect() {
if (level != 0) {
int x = rect.x;
int y = rect.y;
if (keysDown.contains(KeyEvent.VK_UP)) {
y -= speed;
}
if (keysDown.contains(KeyEvent.VK_DOWN)) {
y += speed;
}
if (keysDown.contains(KeyEvent.VK_LEFT)) {
x -= speed;
}
if (keysDown.contains(KeyEvent.VK_RIGHT)) {
x += speed;
}
rect.setLocation(x, y);
repaint();
}
}
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void mouseClicked(MouseEvent me) {
if (level == 0) {
xpos = me.getX();
ypos = me.getY();
if (xpos >= START_X_POS
&& ypos >= START_Y_POS
&& xpos <= START_X_POS + START_WIDTH
&& ypos <= START_X_POS + START_HEIGHT) {
level = 1;
}
}
}
@Override
public void mouseEntered(MouseEvent me) { }
@Override
public void mouseExited(MouseEvent me) { }
@Override
public void mouseReleased(MouseEvent me) { }
@Override
public void mousePressed(MouseEvent me) { }
}
公共类移动扩展小程序实现KeyListener、MouseStener{
私有矩形矩形;
私有arraylistkeysdown;
Random randomGenerator=新的Random();
内速度=4;
int level=1;//开始菜单工作后更改为0
int XPO;
int ypos;
公共静态最终int START_X_POS=160;
公共静态最终int START_Y_POS=160;
公共静态最终整型起始宽度=256;
公共静态最终整数起始高度=64;
布尔startClicked;
图像启动;
图像块;
URL库;
MediaTracker mt;
//int randomx=randomGenerator.nextInt(560);
公共void init(){
addKeyListener(此);
addMouseListener(这个);
keysDown=newarraylist();
rect=新矩形(32,32,50,50);
mt=新MediaTracker(本);
试一试{
base=getDocumentBase();
}捕获(例外e){}
start=getImage(基,“start_button.png”);
block=getImage(基,“block.gif”);
试一试{
韦特福尔山();
}捕获(中断异常e){}
}
公共空间涂料(图g){
设置大小(600400);
图形2d g2=(图形2d)g;
如果(级别!=0){
g2.填充(rect);
Font=新字体(“Arial”,Font.BOLD,18);
g、 setFont(字体);
//String text=“速度:”+速度;
String text=“Level:”+Level;
FontMetrics fm=g.getFontMetrics();
intx=(getWidth()-fm.stringWidth(text))/2;
int y=(getHeight()-fm.getHeight())+fm.getAscent();
g、 抽绳(文本,x,y);
}
如果(级别==1){
//水平块
g、 drawImage(块,0,0,this);
g、 drawImage(块,32,0,this);
g、 drawImage(块,64,0,this);
g、 drawImage(块,96,0,this);
//垂直块
g、 drawImage(块,0,0,this);
g、 drawImage(块,0,32,this);
g、 drawImage(块,0,64,this);
g、 drawImage(块,0,96,this);
}
else{//开始菜单
g、 drawImage(开始,160,160,本);
}
}
@凌驾
按下公共无效键(按键事件e){
如果(!keysDown.contains(例如getKeyCode()))
add(新的整数(例如getKeyCode());
moveRect();
}
@凌驾
公共无效密钥已释放(密钥事件e){
remove(新整数(例如getKeyCode());
}
公共void moveRect(){
如果(级别!=0){
int x=rect.x;
int y=矩形y;
if(keysDown.contains(KeyEvent.VK_UP)){
y-=速度;
}
if(keysDown.contains(KeyEvent.VK_DOWN)){
y+=速度;
}
if(keysDown.contains(KeyEvent.VK_左)){
x-=速度;
}
if(keysDown.contains(KeyEvent.VK_RIGHT)){
x+=速度;
}
直线定位(x,y);
重新油漆();
}
}
@凌驾
public void keyTyped(KeyEvent e){}
@凌驾
公共无效mouseClicked(MouseEvent me){
如果(级别==0){
xpos=me.getX();
ypos=me.getY();
如果(xpos>=启动X位置
&&ypos>=开始位置
&&xpos有趣的是,缩进是为数不多的不会让我觉得奇怪的东西之一;-)
无论如何,我建议您创建一个知道其大小和位置的块对象。为它提供一个简单的#collizeswith(矩形)
方法,并在内存中保留它们的列表,检查每个移动,然后您就可以进行设置。中详细介绍的方法是您正在寻找的方法,还是希望根据图像中的像素检测碰撞(即,对象周围的边界体积由不透明像素定义)在我看来,上述注释需要作为答案。这是最好的方法。