二维碰撞检测LWJGL

时间:2015-02-27 15:35:09

标签: java collision-detection lwjgl

我是LWJGL的新手,需要有关碰撞检测的帮助。下面我已经包含了我正在使用的两个java类。 Ship.java类绘制一个正方形,然后您可以移动方块。 Enemy.java显示红色方块。

我想让这艘船与敌人发生碰撞。我很困惑该怎么做。

Ship.java

package WallWars;


import static org.lwjgl.opengl.GL11.*;



import org.lwjgl.input.Keyboard;

public class Ship {

double x;
double y;
double spdX;
double spdY;
double directionLeft;

Enemy enemy = new Enemy();

public Ship(){

    x = 100;
    y = 100;

}



public void ShipLogic(){

    x += spdX;
    y += spdY;

    //Friction
    if(!Keyboard.isKeyDown(Keyboard.KEY_LEFT) && spdX > 0){
        spdX = spdX * 0.9;
    }
    if(!Keyboard.isKeyDown(Keyboard.KEY_RIGHT) && spdX < 0){
        spdX = spdX * 0.9;
    }
    if(!Keyboard.isKeyDown(Keyboard.KEY_UP) && spdY < 0){
        spdY = spdY * 0.85;
    }
    if(!Keyboard.isKeyDown(Keyboard.KEY_DOWN) && spdY > 0){
        spdY = spdY * 0.85;
    }

    //Keyboard Input
    if(Keyboard.isKeyDown(Keyboard.KEY_LEFT)){
        spdX = Math.max(-5, spdX - 1);
    }
    if(Keyboard.isKeyDown(Keyboard.KEY_RIGHT)){
        spdX = Math.min(5, spdX + 1);
    }
    if(Keyboard.isKeyDown(Keyboard.KEY_UP)){
        spdY = Math.max(4.5, spdY + 1);
    }
    if(Keyboard.isKeyDown(Keyboard.KEY_DOWN)){
        spdY = Math.min(-4.5, spdY - 1);
    }

}

public void ShipCollisions(){


    //Wall Collisions
    if(x <= 0){
        spdX = 0;
        x = 0.1;
    }
    if(x >= 768){
        spdX = 0;
        x = 767.9;
    }
    if(y <= 0){
        spdY = 0;
        y = 0.1;
    }
    if(y >= 568){
        spdY = 0;
        y = 567.9;
    }

}

public void EnemyCollisions(){

    if(x > enemy.x + 60 + 32 && x < enemy.x){



    }

}


public void dShip(){

    ShipLogic();
    ShipCollisions();
    EnemyCollisions();

    glBegin(GL_QUADS);

        glColor3d(1, 1, 1);
        glVertex2d(x, y);
        glVertex2d(x + 32, y);
        glVertex2d(x + 32, y + 32);
        glVertex2d(x, y + 32);
    glEnd();


}



}

Enemy.java

package WallWars;

import static org.lwjgl.opengl.GL11.*;


public class Enemy {

double x;
double y;
double posX = x;
double posY = y;

public void dEnemy(double x, double y){

    glBegin(GL_QUADS);
        glColor3d(1, 0, 0);
        glVertex2d(x, y);
        glVertex2d(x + 32, y);
        glVertex2d(x + 32, y + 32);
        glVertex2d(x, y + 32);
    glEnd();

}

}

1 个答案:

答案 0 :(得分:1)

首先,您可以使用Java API的 Rectangle 类。 它可以存储位置(x,y)以及宽度和高度。

一旦你的所有物体(你的船和你的敌人)使用矩形,你只需使用 intersects 方法来知道两个Rectangle是否发生碰撞。

您面临的问题是您需要将行为(逻辑)方法封装在&#34;运行&#34; (无限)循环。

然后,在您的主循环中,如果您检测到碰撞(简单部分),您需要对其进行一些操作。你要做的第一件事就是停止移动你的船。稍后你可以尝试通过另一条路径来避开障碍。