2016-01-29 5 views
0

Привет, я сейчас делаю RPG, похожую на Legend of Zelda. У меня есть функция в моей игре, где, когда игрок атакует врага своим мечом, противник отбрасывает n единиц. У меня есть обнаружение столкновения, которое иногда работает по назначению, а в других случаях противник проходит через стену и застревает с другой стороны, а затем в другое время враг может просто пройти прямо через стену. По возможности, вращение, направленное против игрока при столкновении со стеной, явилось бы одним из возможных решений этой проблемы, но я не знаю, как это реализовать. Вот мой текущий код столкновения:расширенное обнаружение столкновения?

// Enemy Collides with Wall 
     counter1 = 0; 
     for (iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++) 
     { 
      counter2 = 0; 
      for (iter15 = wallArray.begin(); iter15 != wallArray.end(); iter15++) 
      { 
       if (enemyArray[counter1].rect.getGlobalBounds().intersects(wallArray[counter2].rect.getGlobalBounds())) 
       { 
        enemyArray[counter1].isCollided = true; 
         //Hit Wall 
        if ((enemyArray[counter1].direction == 1 || enemyArray[counter1].rect.getPosition().y >= wallArray[counter2].rect.getPosition().y)) //up 
         { 
          enemyArray[counter1].canMoveUp = false; 
          enemyArray[counter1].canMoveLeft = false; 
          enemyArray[counter1].canMoveRight = false; 
          enemyArray[counter1].rect.move(0, 7); 
         } 
        else if ((enemyArray[counter1].direction == 2 || enemyArray[counter1].rect.getPosition().y <= wallArray[counter2].rect.getPosition().y)) //Down 
         { 
          enemyArray[counter1].canMoveDown = false; 
          enemyArray[counter1].canMoveRight = false; 
          enemyArray[counter1].canMoveLeft = false; 
          enemyArray[counter1].rect.move(0, -7); 
         } 
        else if ((enemyArray[counter1].direction == 3 || enemyArray[counter1].rect.getPosition().x >= wallArray[counter2].rect.getPosition().x)) //Left 
         { 
          enemyArray[counter1].canMoveLeft = false; 
          enemyArray[counter1].canMoveUp = false; 
          enemyArray[counter1].canMoveDown = false; 
          enemyArray[counter1].rect.move(7, 0); 
         } 
        else if ((enemyArray[counter1].direction == 4 || enemyArray[counter1].rect.getPosition().x <= wallArray[counter2].rect.getPosition().x)) //Right 
         { 
          enemyArray[counter1].canMoveRight = false; 
          enemyArray[counter1].canMoveUp = false; 
          enemyArray[counter1].canMoveDown = false; 
          enemyArray[counter1].rect.move(-7, 0); 
         } 
       } 
       counter2++; 
      } 
      counter1++; 
     } 



//Knock Back enemy away from sword && sword2 
     counterKnockBack++; 
     counter2 = 0; 
     for (iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++) 
     { 
        if (enemyArray[counter2].knockback == true) 
        { 
         if (enemyArray[counter2].isCollided == false) 
         { 
          if ((Player1.rect.getPosition().y > enemyArray[counter2].rect.getPosition().y)) 
          { 
           enemyArray[counter2].rect.move(0, -3); //up 
          } 
          else if ((Player1.rect.getPosition().y < enemyArray[counter2].rect.getPosition().y)) 
          { 
           enemyArray[counter2].rect.move(0, 3); //down 
          } 
          if ((Player1.rect.getPosition().x > enemyArray[counter2].rect.getPosition().x)) 
          { 
           enemyArray[counter2].rect.move(-3, 0); //left 
          } 
          else if ((Player1.rect.getPosition().x < enemyArray[counter2].rect.getPosition().x)) 
          { 
           enemyArray[counter2].rect.move(3, 0); //right 
          } 
          if (counterKnockBack >= 20) 
          { 
           enemyArray[counter2].knockback = false; 
          } 
         } 
        } 
      counter2++; 
     } 

     //turn off collided counter 
     counterCollided++; 
     counter2 = 0; 
     for (iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++) 
     { 
      if (enemyArray[counter2].isCollided == true) 
      { 
       if (counterCollided >= 30) 
        enemyArray[counter2].isCollided = false; 
      } 
      counter2++; 
     } 

Я понятия не имею, почему противник способен иногда просто идти прямо через стену, не будучи отброшены назад. Итак, как я могу исправить это, любые идеи?

ответ

1

Не прочитав код полностью, я уже могу сказать, что ваш код обнаружения столкновения неправильный. В основном потому, что вы перемещаете объекты напрямую, возможно, не проверяя наличие конфликтов в своей функции rect::move.

Возможно, функция rect::move будет перемещать объекты через стены, не вызывая никакого кода реакции столкновения. Рассмотрим следующий сценарий:

Первый кадр:
enter image description here
enemyArray[counterX].rect.move(3, 0);

Второй кадр:
enter image description here

Объект противник перемещается за стеной и не вызовет столкновение код обнаружения.

Мой совет является (несмотря на очевидное одно: прочитать somebooks): для каждого противника магазин на прежнее место и проверьте столкновения не между противником и прямоугольнику стены, а между стеной и прямоугольник между двумя позициями противника. Нечто подобное:
enter image description here

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

+0

Я понимаю, о чем вы говорите, но не знаете, как это реализовать. не могли бы вы дать мне пример кода модификации, о котором вы говорите? – agtv

+0

Я упомянул о книгах по какой-то причине - вам нужен хотя бы справедливый математический фон, чтобы иметь возможность реализовать RPG, о которой вы говорите. Как я уже говорил, это лишь одна из возможных ошибок в коде. Вы должны получить немного теоретических знаний, прежде чем погрузиться в нечто сложное, как игры. – DennisS

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