无法理解如何使碰撞检测工作,我做错了什么



我需要帮助尝试在我的代码中对这种冲突检测进行排序。

这是我的代码,我从网上的各种来源得到了一些帮助,但还没有确切的解释,但总的来说,我已经取得了很大的进步。所以基本上是一个快速的感谢互联网。

我要做的是制作一个游戏,我控制一个物体,在这种情况下是一个蓝色的圆圈,然后触摸屏幕上的另一个物体。

这很像游戏《蛇》,但我无法让碰撞正常工作,而且如果我真的让它正常工作,我不知道如何在屏幕上随机将位置更新到新位置。

这是代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
import javax.swing.JFrame;
import org.w3c.dom.css.Rect;

public class javagame2 extends JFrame {
    private Image dbimage;
    private Graphics dbg;
    Font font = new Font("Arial", Font.BOLD, 30);
    static Random generator = new Random();
    static int randomIndex0 = generator.nextInt(900);
    static int randomIndex1 = generator.nextInt(400);
    public static class player
    {
        static int x = 150;
        static int y = 150;
        static final int Width = 50;
        static final int Height = 50;
    }
    public static class pizza
    {
        static final int x1 = randomIndex0;
        static final int y1 = randomIndex1;
        int Width = 50;
        int Height = 50;
        public boolean intercepts(player p) {
            // TODO Auto-generated method stub
            return false;
        }
    }
    public class AL extends KeyAdapter
    {
        public void keyPressed(KeyEvent e)
        {
            int keycode = e.getKeyCode();
            if(keycode == e.VK_LEFT){
                if(player.x <= 0)
                {
                    player.x = 0;
                }
                else
                {
                    player.x += -10;
                }
            }
            if(keycode == e.VK_RIGHT){
                if(player.x >= 950)
                {
                    player.x = 950;
                }
                else
                {
                    player.x += 10;
                }
            }
            if(keycode == e.VK_UP){
                if(player.y <= 20)
                {
                    player.y = 20;
                }
                else
                {
                    player.y += -10;
                }
            }
            if(keycode == e.VK_DOWN){
                if(player.y >= 450)
                {
                    player.y = 450;
                }
                else
                {
                    player.y += 10;
                }
            }
        }
        public void keyReleased(KeyEvent e){}
    }
    public int getX()
    {
        return player.x;
    }
    public int getY()
    {
        return player.y;
    }
    /*
    public boolean collide(pizza f)
    {
        if(f.X <= (player.x+40) && f.Y >= (player.y+40))
        {
            System.out.println("they collided");
            return true;
        }
        else
        {
            return false;
        }
    }
    */
    public boolean collide(pizza f, player p)
    {
        if(f.x1 <= p.x && f.y1 >= p.y)
        {
            System.out.println("they collided");
            return true;
        }
        else
        {
            return false;
        }
    }
    public javagame2()
    {
        addKeyListener(new AL());
        setTitle("Ballon Popper");
        setSize(1000, 500);
        setResizable(false);
        setVisible(true);
        setBackground(Color.BLACK);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void paintcomponent(Graphics g)
    {
        g.setColor(Color.WHITE);
        g.drawRect(pizza.x1, pizza.y1, 50, 50);
        g.setFont(font);
        g.setColor(Color.RED);
        g.drawString("Eat the Pizza!", 350, 50);
        g.setColor(Color.BLUE);
        g.drawRect(getX(), getY(), 50, 50);
        g.fillOval(getX(), getY(), 50, 50);
        g.setColor(Color.YELLOW);
        g.fillOval(pizza.x1, pizza.y1, 50, 50);
        repaint();
    }
    public void paint(Graphics g)
    {
        dbimage = createImage(getWidth(), getHeight());
        dbg = dbimage.getGraphics();
        paintcomponent(dbg);
        g.drawImage(dbimage, 0, 0, this);
    }
    public static void main(String arg[])
    {
        new javagame2();
    }
}

这是我刚刚编写的更新代码,它确实运行了,但我有点困惑,一旦我接触到黄色圆圈,该如何删除,甚至该怎么办,我试着使用.incross,但似乎没有任何作用。

我不懂java,但这似乎很简单。

当两个圆中心之间的距离小于半径之和时,两个圆发生碰撞。(如果圆圈大小相同,我们就不必担心它们的"位置"是否真的在它们的中心。)

public boolean collide(pizza f, player p)
{
    if(Math.pow(f.x1-p.x, 2) + Math.pow(f.y1-p.y, 2) <= Math.pow(f.Width/2 + p.Width/2, 2))
    {
        System.out.println("they collided");
        return true;
    }
    else
    {
        return false;
    }
}

最新更新