2014-02-05 2 views
0

Я собираюсь ввести собственное обнаружение столкновений. Так вот как это работает:C# do события работают синхронно?

  1. мой объект бросает событие перемещения.
  2. my world/collision manager прослушивает события перемещения всех движимых объектов и проверяет, перемещаются ли они.
  3. если они двигаются я проверить столкновения и решить их

теперь дело в том, что скорость движения моих изменений объекта иногда в следующем коде:

private void OnObjectMove(StaticObject MovingObject) 
    { 
     if(maskCollision(MovingObject)) 
     { 
      Console.WriteLine("==============================="); 
      Console.WriteLine("movementX: " + MovingObject.movement_Y.Speed + " movementY " + MovingObject.movement_Y.Speed); 
      resolveMaskCollision(MovingObject); 
     } 
    } 

и начало моей решимости метод столкновения:

private void resolveMaskCollision(StaticObject collidingObject) 
    { 
     Console.WriteLine("movementX: "+collidingObject.movement_X.Speed + " movementY: " + collidingObject.movement_Y.Speed); 
. 
. 
. 

так и пример выход:

movementX: -8,700003 movementY -8,700003 
movementX: 0 movementY: -8,700003 

Как вы можете видеть, что мой movementX изменился по какой-то причине ...

выход в большинстве случаев то же самое, но иногда это не так и тогда все мои methodes бросить exeptions, потому что я не ожидал скорость до измените там. Теперь мое единственное объяснение для изменения скорости объектов - это то, что событие выполняется на отдельном потоке. Это правда? Как я могу ждать события? И разумно ли ждать, если это возможно? Или это замедлит мой код? (. Я мог бы либо вызвать Methode из моего movingObject как-то Но тогда придется спасти мир/collisionmanager -объект)

+0

Вы вызываете неправильную переменную/свойство в первой части кода. –

+0

Если вы не видите, что говорит @AdamSears, в первом сценарии консоли вы используете move_Y.Speed ​​для обоих значений. Изменить: К сожалению, он редактирует комментарий, чтобы быть более ясным. –

+0

ОК извините. Не видел, что по какой-то причине:/ – crush3dice

ответ

1

На вопрос, выполняются ли события асинхронно в C#, аналогичный ответ применяется к множеству вопросов: это зависит от вас (или того, кто написал класс, события которого вы хотите использовать). Способ реализации события на C# по умолчанию заключается в том, что события запускаются в том же потоке, который вызвал событие, которое представляет событие. Однако вы можете просто реализовать эту часть по-разному и реализовать асинхронные события.

Синхронная реализация выглядит следующим образом:

protected virtual void OnFoo(EventArgs e) 
{ 
    if (Foo != null) Foo(this, e); 
} 

Асинхронный реализация будет выглядеть следующим образом:

protected virtual void OnFooAsync(EventArgs e) 
{ 
    if (Foo != null) Foo.BeginInvoke(this, e); 
} 
+1

Ваш третий вариант никоим образом не асинхронен. «Асинк» - это фактически ложь. – Servy

+0

Вы правы, удалили третий вариант. Компилятор даже дает предупреждение о том, что метод будет выполняться синхронно – Georg

1

@Adam Sears является правильным, есть ваш ответ, см:

MovingObject.movement_Y .speed

против

collidingObject.movement_X.Speed ​​

вы сравниваете Y на X.

Эти два метода работают в одном потоке.

2

Как видно из this answer, события синхронны, если вы не построите их иначе.

Что было полезно для меня как гамедева и которое может быть вам полезным, это реализация «грязного бита», который указывает, изменился ли объект (в позиции и т. Д.), Чтобы избежать ненужных призывает к дорогостоящим методам. Это позволяет перемещать объекты в последовательном порядке, проверяя столкновение при перемещении каждого объекта. Вы также можете найти Quadtrees (или octrees, в 3d-системе), чтобы быть особенно полезными, если вы столкнулись с трудностями с производительностью.

+0

Спасибо за этот полезный ответ. Но я не совсем понимаю, что вы имеете в виду с этим грязным кусочком. Я понимаю, что это правда, если объект изменился, но как мне его использовать в моем случае? – crush3dice

0

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

Существует вероятность того, что при получении скорости «MovingObject.movement_Y.Speed» некоторое зависимое поле будет меняться из-за некоторого асинхронного вызова.

+0

его просто переменной скорости возврата. Ничего больше ... get {return speed; } set {speed = value; } – crush3dice

+0

, который записывает или изменяет значение переменной скорости? – sunnytyra

+1

my palyer слушает событие нажатия клавиши. Если клавиша опущена, скорость будет уменьшена или поднята (или если максимальная скорость достигнута, ничего не произойдет). И если ни один из клавиш не будет нажат на этот кадр, он немного снизится (иначе мой персонаж будет продолжать работать, если мой ключ не будет нажат). Фактическая ошибка заключалась в том, что я сбросил скорость float в int и в некоторых редких случаях, когда моя скорость была между -1 и 1, int была 0, и поскольку я разделил свое медленное направление тем быстрее, что это могло произойти, что я делаю [медленное направление ]/0, а затем мой шаг медленного направления был максимальным отрицательным значением int. – crush3dice

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