2015-02-27 6 views
0

Я новичок в LWJGL и нуждаюсь в помощи при обнаружении столкновений. Ниже я включил два класса Java, с которыми я работаю. Класс Ship.java рисует квадрат, а затем вы можете перемещать квадрат. В Enemy.java отображается красный квадрат.2D обнаружение столкновения LWJGL

Я хотел бы, чтобы корабль столкнулся с врагом. Я смущен тем, что делать.

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

} 

} 

ответ

0

Прежде всего, вы можете использовать Прямоугольник класс API Java. Он может хранить позицию (x, y) и ширину и высоту.

После того, как все ваши объекты (ваш корабль и ваш противник) использовать Прямоугольник, вы можете просто использовать пересекает метод, чтобы знать, если два прямоугольника сталкивается.

Проблема, с которой вы сталкиваетесь, заключается в том, что вам необходимо инкапсулировать методы вашего поведения (логики) в цикл «run» (бесконечный).

Затем, если вы обнаружите столкновение (простую часть), в вашем основном цикле вам нужно что-то сделать. Первое, что вы можете сделать, это остановить перемещение вашего корабля. Позже вы можете попытаться избежать препятствия, пройдя другой путь.

Смежные вопросы