java - 碰撞检测Java 2D Sprite

原文 标签 java 2d collision-detection sprite

因此,我正在尝试在游戏中实现碰撞检测,由于某种原因,碰撞无法正常工作。

public class ArenaKeys extends KeyAdapter {
    arenaScreenBuild arena;
    int xPos = 0, playerFace = 4;
    int xPPos = 200, yPPos = 150;
    int pX = 40, pY = 30;
    AttackAshe aAtk = new AttackAshe();

    int[][] mask = new int[400][92];

    @SuppressWarnings("static-access")
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();// Get key pressed
        if (keyCode == e.VK_RIGHT) {
            playerFace = 4;
            xPos += 5;
            pX = (xPos + xPPos) / 5;
            if (checkBoundary(pX, pY) == (false))
                xPos -= 5;
        } else if (keyCode == e.VK_LEFT) {
            playerFace = 3;
            xPos -= 5;
            pX = (xPos + xPPos) / 5;
            if (checkBoundary(pX, pY) == (false))
                xPos += 5;
        } else if (keyCode == e.VK_UP) {
            playerFace = 2;
            yPPos -= 5;
            pY = yPPos / 5;
            if (checkBoundary(pX, pY) == (false))
                yPPos += 5;
        } else if (keyCode == e.VK_DOWN) {
            playerFace = 1;
            yPPos += 5;
            pY = yPPos / 5;
            if (checkBoundary(pX, pY) == (false))
                yPPos -= 5;
        }
        if (keyCode == e.VK_SPACE) {
            aAtk.regArrow(arena.xPosition(), arena.yPosition());
            arena.shoot(playerFace);
            arena.xArrow = xPPos;
            arena.yArrow = yPPos;
        } else if (keyCode == e.VK_ESCAPE)
            System.exit(0);
        arena.moveArena(xPos);
        arena.turnPlayer(playerFace);
        arena.updateScreen(xPPos, yPPos);
    }

    public boolean checkBoundary(int x, int y) {
        Rectangle t1 = new Rectangle(Turret.x, Turret.y, Turret.WIDTH,
                Turret.HEIGHT);
        Rectangle p = new Rectangle(pX, pY, Player.WIDTH, Player.HEIGHT);

        if (t1.intersects(p))
            // if (mask[x][y] == 0)
            return false;
        else
            return true;
    }
    public static class Turret {
        static int x = 168;
        static int y = 40;
        static final int WIDTH = 50;
        static final int HEIGHT = 50;
    }

    public static class Player {
        static final int WIDTH = 25;
        static final int HEIGHT = 25;
    }

    public ArenaKeys(arenaScreenBuild arena) throws Exception {
        this.arena = arena;
    }
}


在实际炮塔之前大约20个单位,子画面不再能够继续移动。即使您走得太高或太低,子画面也不能超出转塔的上方或下方。

似乎有问题的是,子图形太早碰撞到炮塔矩形中了,但我不知道怎么可能。我将炮塔精确地画成50宽,50高的168,40。播放器在移动,因此x,y每次都不同,但是尺寸为25宽和25高。

 

原始炮塔大约为126x111,但我将其绘制为50x50


25x25

public class arenaScreenBuild extends JPanel implements ActionListener {
    String picPath = "pictures/";
    String[] fileName = { "stageBridge.png", "turret.png", "Ashe.png",
            "regArrow.png", "arenaScreen.png" };
    ClassLoader cl = arenaScreenBuild.class.getClassLoader();
    URL imgURL[] = new URL[5];
    Toolkit tk = Toolkit.getDefaultToolkit();
    Image imgBG, imgTurret, imgPlayer, imgRegArrow, imgBorder;
    Boolean[] ptFunc = new Boolean[3];

    int PLAYER_INITIAL_X = 200, PLAYER_INITIAL_Y = 150;
    int xPos = 0, xPFace = 150, yPFace = 0;
    int xPPos = 200, yPPos = 150;
    int xVal, yVal, xArrow, yArrow, xTemp, yTemp;
    Timer space;
    int counter, facePosition = 1;

    public arenaScreenBuild() throws Exception {
        for (int x = 0; x < 5; x++) {
            imgURL[x] = cl.getResource(picPath + fileName[x]);
        }
        imgBG = tk.createImage(imgURL[0]);
        imgTurret = tk.createImage(imgURL[1]);
        imgPlayer = tk.createImage(imgURL[2]);
        imgRegArrow = tk.createImage(imgURL[3]);
        imgBorder = tk.createImage(imgURL[4]);
        for (int x = 0; x < 3; x++)
            ptFunc[x] = true;

        space = new Timer(100, this);

    }

    public void updateScreen() {
        repaint();
    }

    public void moveArena(int x) {
        xPos = x;
    }

    public void updateScreen(int x, int y) {
        xPPos = x;
        yPPos = y;
        repaint();
    }

    public boolean arrow() {
        return (true);
    }

    public void turnPlayer(int face) {
        if (face == 4) {
            xPFace = 150;
        } else if (face == 3) {
            xPFace = 100;
        } else if (face == 2) {
            xPFace = 50;
        } else if (face == 1) {
            xPFace = 0;
        }
        if (yPFace == 50)
            yPFace = 0;
        else if (yPFace == 0)
            yPFace = 50;
    }

    public void paintComponent(Graphics g) {
        g.drawImage(imgBG, 10, 30, 610, 490, xPos, 0, xPos + 600, 460, this);

        g.drawImage(imgTurret, 850 - xPos, 200, 950 - xPos, 300, 0, 0, 126,
                110, this);
        g.drawImage(imgTurret, 1350 - xPos, 200, 1450 - xPos, 300, 0, 0, 126,
                110, this);

        g.drawImage(imgPlayer, xPPos, yPPos, 50 + (xPPos),
                50 + (yPPos), xPFace, yPFace, xPFace + 50, yPFace + 50, this);

        if (counter <= 5000 && counter > 0)
            g.drawImage(imgRegArrow, xArrow, yArrow, this);

        g.drawImage(imgBorder, 0, 0, 620, 600, 0, 0, 620, 600, this);

        g.setColor(Color.WHITE);
        g.drawString("x:" + (xPPos + xPos), 535, 525);
        g.drawString("y:" + yPPos, 535, 545);
    }

    public int xPosition() {
        xVal = xPPos + xPos;
        return (xVal);
    }

    public int yPosition() {
        yVal = yPPos;
        return (yVal);
    }

    public void shoot(int i) {
        facePosition = i;
        xTemp = xPosition();
        yTemp = yPosition();
        space.start();
    }

    public void actionPerformed(ActionEvent e) {
        counter++;

        if (facePosition == 4) {
            if (counter <= 5000) {
                xArrow += 50;
            }
        }

        else if (facePosition == 3) {
            if (counter <= 5000) {
                xArrow -= 50;
            }
        }

        else if (facePosition == 2) {
            if (counter <= 5000) {
                yArrow -= 50;
            }
        }

        else if (facePosition == 1) {
            if (counter <= 5000) {
                yArrow += 50;
            }
        }

        if (xArrow == (xTemp + 100)) {
            counter = 0;
            space.stop();
        }

        updateScreen();
    }
}

最佳答案

原来我在x位置的值是错误的。同样由于我以前的边界代码,仍然有一些遗留问题,使我感到困惑,因此无法让我早日看到问题。

对于任何寻求如何创建碰撞检测边界的人,只需制作两个矩形并使用

Rectangle rect1 = new Rectangle(topLeftX, topLeftY, rectangleWidth,rectangleHeight);
Rectangle rect2 = new Rectangle(topLeftX, topLeftY, rectangleWidth, rectangleHeight);
if (rect1.intersects(rect2))
//enter code to do if it intersects here

关于java - 碰撞检测Java 2D Sprite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14106260/

相关文章:

java - Java消息选择器,用于从Websphere MQ获取组消息

java - Java:按第一列(完整填充)对2D数组排序

java - libgdx如何存储数据以进行碰撞检测

java - Activity重启后功能变化

java - 将/newyork 映射到/area.jsp?id=1 的最佳方式是什么?

java - Java 1.6 : Creating an array of List<T>

Java Smooth 2D Rectangle碰撞?

3d - 二维点云的轮廓

java - Java中的3D转换

python - 如何在正方形和圆形之间进行碰撞以触发 pygame 中的游戏?