2016-08-29 2 views
0

Я делаю простую игру. Мне удалось заставить моего персонажа двигаться со стрелками и стрелять. Я добавил некоторые стены к карте, которые являются изображениями. Мне удалось обнаружить коллизию, как это: «! Colision»Обнаружение столкновений и перемещение стоп-кадра

private void timer6_Tick(object sender, EventArgs e){ 
    foreach (PictureBox pic in brick){ 
     if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)){ 
      Console.WriteLine("Colision!"); 
      switch (rotation){ 
       case "up": 
        canup = false; 
        candown = true; 
        canleft = true; 
        canright = true; 
        break; 
       case "down": 
        canup = true; 
        candown = false; 
        canleft = true; 
        canright = true; 
        break; 
       case "left": 
        candown = true; 
        canup = true; 
        canleft = false; 
        canright = true; 
        break; 
       case "right": 
        candown = true; 
        canup = true; 
        canleft = true; 
        canright = false; 
        break; 
      } 
     } 
     else 
     { 
      Console.WriteLine("No colision?!"); 
     } 
    } 
} 

Это работает, как ожидалось, но в ближайшее время, как я попал в объект (стена), я получаю эхо, которое в порядке, это также останавливает движение в том направлении, с которым столкнулся персонаж, когда произошло столкновение. Дело в том, что когда я выхожу из столкновения, один из этих bools остается ложным, что мешает моему персонажу снова двигаться в том же направлении. Я попробовал установить все эти bools в true in else branch, но поскольку есть пять стен, даже если есть столкновение, другая ветка выполняется 4 раза из 5. Мне нужна какая-то «любая» функция, чтобы проверить, нет ли НИКАКИХ или ЛЮБЫХ стенок будучи ударом в один момент.

+0

Вы можете проверить столкновение на вашем 'movement' функции -assuming у вас есть одно, а не внутри' Timer', и если вы обнаружили столкновение, вы делаете не допускайте этого движения. – uTeisT

+2

Рассмотрите другой подход: пользователь вводит * команду *. Затем вы * оцениваете команду в контексте игры *, и команда либо * одобрена *, либо * отрицается *. Если он одобрен, персонаж перемещается в указанном направлении; если отрицается, ничего не происходит. Я думаю, что если вы структурируете свою игру с использованием этого шаблона, многие ваши проблемы исчезнут. –

ответ

1

Я не 100% уверен, что вы получаете на, но я думаю, что это может помочь:

canup = true; 
candown = true; 
canleft = true; 
canright = true; 
foreach (PictureBox pic in brick) 
{ 
    if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)) 
    { 
     Console.WriteLine("Colision!"); 
     switch (rotation) 
     { 
      case "up": 
       canup = false; 
       break; 
      case "down": 
       candown = false; 
       break; 
      case "left": 
       canleft = false; 
       break; 
      case "right": 
       canright = false; 
       break; 
     } 
    } 
    else 
    { 
     Console.WriteLine("No colision?!"); 
    } 
    ... 

Это установит весь Bools к истинному в самом начале, и только установить индивидуальный Bools как ложь внутри цикла.

+2

, также используя перечисления вместо строки для 'rotation', может помочь –

0

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

Общие методы для этого устанавливают положение персонажа назад на кадр, или если вы хотите быть более точным, узнайте, насколько глубокий характер проник в персонаж (͡ ͜ʖ º), и переместите его назад по направлению где он исходил от этой суммы.