2013-05-28 2 views
1

Я создал класс Bullet, используя векторы для рисования пуль и сохранения их в массиве. Я пробовал, но не мог понять, как обнаружить столкновение с этими пулями.Массив обнаружения столкновений пулей в slick2d

Вот класс пули:

public void render(GameContainer gc, Graphics g) throws SlickException { 

    if(active) { 
     g.setColor(Color.red); 
     g.fillOval(pos.getX()-10, pos.getY()-10, 20, 20); 

     g.drawString("BulletX: "+pos.getX(), 400, 100); 
     g.drawString("BulletY: "+pos.getY(), 400, 120); 
    } 
} 

public void update(int t) { 

    if(active) { 
     Vector2f realSpeed = speed.copy(); 
     pos.add(speed.copy().scale(t/1000.0f)); 
     pos.add(realSpeed); 

     lived += t; 
     if(lived > MAX_LIFETIME) { 
      active = false; 
     } 
    } 
} 

Вот класс Play:

Я заполнил массив в методе инициализации, используя этот код:

bullets = new Bullet[8]; 
    for(int i=0; i<bullets.length; i++) { 
     bullets[i] = new Bullet(); 
    } 

В классе обновления я использовал этот код для отображения пуль, когда игрок решает стрелять:

if(t > FIRE_RATE && gc.getInput().isKeyDown(Input.KEY_SPACE)) { 
     if(player == movingUp) { 
      bullets[current] = new Bullet(new Vector2f(420,295), new Vector2f(0,-1)); 
      current++; 
      if(current >= bullets.length) current = 0; 
      t = 0; 
     } 

Вот игрок и противник движения

//up 
    if(input.isKeyDown(Input.KEY_UP)) { 
     player = movingUp; 
     playerPositionY += delta * .3f; //moves world 
     enemyPositionY += delta * .3f; 
     if(playerPositionY > 273) { //collision detection 
      playerPositionY -= delta * .3f; 
      enemyPositionY -= delta * .3f; 
     } 
    } 

if(enemyPositionY > shiftY) { 
     enemyPositionY -= delta *.1f; 
    } 
    if((enemyPositionX >= 355 && enemyPositionX <= 440) && (enemyPositionY >= 230 && enemyPositionY <= 310)) { 
     enemyPositionX = playerPositionX; 
     enemyPositionY = playerPositionY; 
     lives--; 
    } 

Можете ли вы помочь мне понять, как я могу обнаружить столкновения с этими пулями, пожалуйста?

ответ

3

Вы пытались добавить свойство Rectangle к маркам в классе bullets (инициализировать его перед рукой и обновить позицию в методе обновления)? Что-то вроде

bulletRectangle = new Rectangle(pos.getX(), pos.getY(), 20, 20); 

, а затем создать прямоугольник для игрока, такие как playerRectangle, а затем с помощью пересекаться проверки функции для столкновения в петле.

collision = false; 
for(int i = 0; i < bullets.length; i++){ 
    if(playerRectangle.intersects(bullet[i].getBulletRectangle())){ 
     collision = true; 
} 
//perform whatever you want to happen if bullet collides with player 

Лично я хотел бы использовать список массивов, потому что вы не должны установить количество пуль на определенный номер, но это должно работать нормально.

+2

+1. Так поступают большинство 2D-движков/библиотек конфликтов. – Zutty

+0

В зависимости от скорости пули вы можете столкнуться с некоторыми проблемами, однако – TastyLemons

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