2015-07-09 4 views
0

Возможно, это было задано несколько раз, но я не знаю, что искать ..Как сделать функцию класса вызова вызывающего абонента

В любом случае. У меня есть класс под названием «Персонаж». Внутри этого я хочу иметь компонент столкновения, который я назвал RectangleCollision. Внутри него есть функция, называемая IsOverlapping, которая проверяет перекрытие.

Я хочу иметь функцию, которая может быть изменена для каждого игрового объекта. Например, создайте функцию OnBeginOverlap(); который будет срабатывать каждый раз, когда компонент столкновения обнаруживает столкновение.

Есть ли способ привязать эту функцию к делегату или событию? Или что-то?

+0

Каждый игровой объект может быть основан на общем классе, а функция CollisionHandling может быть объявлена ​​как виртуальная в базовом классе и переопределена в ее производных классах. Google по объектным программированию, т. Е. «Полиморфизм наследования». – Graffito

ответ

1

Вы должны ознакомиться с событиями и делегатами. В Интернете много примеров. Проще мне удалось найти, когда я пытался понять предмет был такой:

The Simplest C# Events Example Imaginable

Вы можете также проверить ниже (вы можете скомпилировать это как консольное приложение):

class Character 
{ 

    public delegate void OverlappingHandler(Character character, EventArgs e); 
    public event OverlappingHandler OverlappingEvent; 
    public void IsOverlapping() 
    { 
     bool overlapping = true; 

     if (overlapping) 
     { 
      if (OverlappingEvent != null) 
      { 
       OverlappingEvent(this, null); 
      } 
     } 
    } 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Character c = new Character(); 
     c.OverlappingEvent += OverlappingEventHandler; 
     c.OverlappingEvent += OverlappingSecondEventHandler; 

     c.IsOverlapping(); 

     Console.Read(); 
    } 

    static void OverlappingEventHandler(Character character, EventArgs e) 
    { 
     Console.WriteLine("We have overlapping here!!"); 
    } 

    static void OverlappingSecondEventHandler(Character character, EventArgs e) 
    { 
     Console.WriteLine("Seriously, we have overlapping !!"); 
    } 
} 

Шаг за шагом:

  1. Создайте делегат, который является мостом между вашим событием и кодом, который вы хотите запустить при запуске события. Вы даете параметры делегату, которые (отправитель объекта, EventArgs e) - в этом примере отправитель является классом символов, аргументы используются для отправки дополнительной информации - например, типа символа.
  2. Создать мероприятие нашего делегата типа
  3. В нашей функции IsOverlapping() была бы ваша логическая проверка, если происходит перекрытие. Если есть, вы запускаете событие. Сначала проверьте, есть ли что-либо, связанное с событием (следовательно, if (OverlappingEvent! = Null)) - если что-то есть, запустите событие.
  4. В главном() вы создаете экземпляр класса и ...
  5. Подпишите свои обработчики событий, чтобы код, который должен выполняться при запуске события. Я подключил два метода, чтобы показать, что вы можете подписаться на несколько.
  6. Теперь при запуске c.IsOverlapping() это то, что происходит:

    • логика для проверки перекрытия трасс,
    • если есть перекрытие, будет проверка, если OverlappingEvent имеет код подписки (это делается в Main()),
    • , если произойдет событие, будет активирован
    • код, подписанный на запуск событий - в этом случае ваш код в Main().

Вы можете скомпилировать это как консольное приложение и он будет отображать 2 строки:

Мы перекрытие здесь !!

Серьезно, у нас есть перекрытие !!

Надеюсь, это поможет.

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