不明白如何让这个碰撞检测工作我做错了什么?

时间:2013-12-03 02:54:57

标签: java collision-detection physics game-development

我需要帮助尝试在我的代码中对这种碰撞检测进行排序,对java中的游戏开发不熟悉并且以前从未有过任何使用它的经验,所以请在这里与我一起讨论。

这是我的代码,我在网上得到了一些来自各种来源的帮助,但没有任何明确的解释,但总而言之,我取得了很大进展。所以基本上快速感谢互联网。

我要做的是制作一个游戏,我控制一个物体,在这种情况下是一个蓝色的圆圈然后触摸另一个屏幕上的物体,在这种情况下是一个黄色的圆圈,当他们触摸黄色圆圈时会消失和这个词“YUM”将取代它,然后黄色圆圈将随机移动到新位置。

基本上这很像游戏蛇,但我不能让碰撞正常工作,如果我确实有工作,我不知道我将如何在屏幕上随机更新位置到新位置。

任何帮助都非常感谢,谢谢你,如果不是很多,请详细解释并详细说明:)

这是代码:

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

}

好的,这是更新的代码,我刚刚解决了一点,它确实运行但我有点困惑如何去除黄色圆圈一旦我触摸甚至做什么,我尝试使用.intersects但似乎什么都没做:/ 任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

我不懂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;
    }
}